12b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka/*
22b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * Copyright (C) 2013 The Android Open Source Project
32b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka *
42b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
52b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * you may not use this file except in compliance with the License.
62b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * You may obtain a copy of the License at
72b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka *
82b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
92b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka *
102b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
112b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
122b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * See the License for the specific language governing permissions and
142b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka * limitations under the License.
152b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka */
162b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
172b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokapackage com.android.inputmethod.latin.setup;
182b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
192b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.app.Activity;
202b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.content.ContentResolver;
212b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.content.Intent;
222b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.content.res.Resources;
232b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.media.MediaPlayer;
242b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.net.Uri;
252b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.os.Bundle;
262b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.os.Message;
272b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.provider.Settings;
282b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.util.Log;
292b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.view.View;
302b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.view.inputmethod.InputMethodInfo;
3177f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaokaimport android.view.inputmethod.InputMethodManager;
322b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.widget.ImageView;
332b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.widget.TextView;
342b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport android.widget.VideoView;
352b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
362b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport com.android.inputmethod.compat.TextViewCompatUtils;
37790934158d356bfce0db97ef5aebb12128bc86eaTadashi G. Takaokaimport com.android.inputmethod.compat.ViewCompatUtils;
382b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport com.android.inputmethod.latin.R;
39a7d2fc6befa1b16883200a653fc01deb4d94944dKen Wakasaimport com.android.inputmethod.latin.settings.SettingsActivity;
402fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaimport com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper;
41052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawaimport com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils;
422b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
432b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokaimport java.util.ArrayList;
442b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
45c4ffa235e5490c3cba211b469c7f125d162f9f86Tadashi G. Takaokaimport javax.annotation.Nonnull;
46c4ffa235e5490c3cba211b469c7f125d162f9f86Tadashi G. Takaoka
472b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka// TODO: Use Fragment to implement welcome screen and setup steps.
482b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaokapublic final class SetupWizardActivity extends Activity implements View.OnClickListener {
492b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    static final String TAG = SetupWizardActivity.class.getSimpleName();
502b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
5148b707e1bd2f725478a0af10796f67280971acc4Tadashi G. Takaoka    // For debugging purpose.
5248b707e1bd2f725478a0af10796f67280971acc4Tadashi G. Takaoka    private static final boolean FORCE_TO_SHOW_WELCOME_SCREEN = false;
53769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    private static final boolean ENABLE_WELCOME_VIDEO = true;
54769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka
5577f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka    private InputMethodManager mImm;
5677f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka
574705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka    private View mSetupWizard;
582b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private View mWelcomeScreen;
592b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private View mSetupScreen;
602b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private Uri mWelcomeVideoUri;
612b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private VideoView mWelcomeVideoView;
62769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    private ImageView mWelcomeImageView;
632b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private View mActionStart;
642b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private View mActionNext;
652b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private TextView mStep1Bullet;
662b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private TextView mActionFinish;
672b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private SetupStepGroup mSetupStepGroup;
682b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final String STATE_STEP = "step";
692b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private int mStepNumber;
709b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka    private boolean mNeedsToAdjustStepNumberToSystemState;
712b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final int STEP_WELCOME = 0;
722b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final int STEP_1 = 1;
732b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final int STEP_2 = 2;
742b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final int STEP_3 = 3;
752b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final int STEP_LAUNCHING_IME_SETTINGS = 4;
762b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static final int STEP_BACK_FROM_IME_SETTINGS = 5;
772b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
7877f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka    private SettingsPoolingHandler mHandler;
792b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
8077f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka    private static final class SettingsPoolingHandler
812fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            extends LeakGuardHandlerWrapper<SetupWizardActivity> {
822b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private static final int MSG_POLLING_IME_SETTINGS = 0;
832b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private static final long IME_SETTINGS_POLLING_INTERVAL = 200;
842b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
8577f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        private final InputMethodManager mImmInHandler;
8677f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka
87c4ffa235e5490c3cba211b469c7f125d162f9f86Tadashi G. Takaoka        public SettingsPoolingHandler(@Nonnull final SetupWizardActivity ownerInstance,
8877f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka                final InputMethodManager imm) {
892fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            super(ownerInstance);
9077f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka            mImmInHandler = imm;
912b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
922b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
932b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        @Override
942b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void handleMessage(final Message msg) {
952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            final SetupWizardActivity setupWizardActivity = getOwnerInstance();
962b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            if (setupWizardActivity == null) {
972b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                return;
982b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
992b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            switch (msg.what) {
1002b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            case MSG_POLLING_IME_SETTINGS:
101052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawa                if (UncachedInputMethodManagerUtils.isThisImeEnabled(setupWizardActivity,
102052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawa                        mImmInHandler)) {
1032b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                    setupWizardActivity.invokeSetupWizardOfThisIme();
1042b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                    return;
1052b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                }
1062b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                startPollingImeSettings();
1072b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                break;
1082b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
1092b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
1102b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1112b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void startPollingImeSettings() {
1122b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            sendMessageDelayed(obtainMessage(MSG_POLLING_IME_SETTINGS),
1132b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                    IME_SETTINGS_POLLING_INTERVAL);
1142b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
1152b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1162b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void cancelPollingImeSettings() {
1172b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            removeMessages(MSG_POLLING_IME_SETTINGS);
1182b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
1192b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
1202b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1212b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
1222b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    protected void onCreate(final Bundle savedInstanceState) {
1234705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        setTheme(android.R.style.Theme_Translucent_NoTitleBar);
1242b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onCreate(savedInstanceState);
1252b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
12677f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
12777f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        mHandler = new SettingsPoolingHandler(this, mImm);
12877f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka
1292b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        setContentView(R.layout.setup_wizard);
1304705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        mSetupWizard = findViewById(R.id.setup_wizard);
1312b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1322b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (savedInstanceState == null) {
1332b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = determineSetupStepNumberFromLauncher();
1342b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        } else {
1352b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = savedInstanceState.getInt(STATE_STEP);
1362b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
1372b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1382b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final String applicationName = getResources().getString(getApplicationInfo().labelRes);
1392b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mWelcomeScreen = findViewById(R.id.setup_welcome_screen);
1402b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final TextView welcomeTitle = (TextView)findViewById(R.id.setup_welcome_title);
1412b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        welcomeTitle.setText(getString(R.string.setup_welcome_title, applicationName));
1422b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1432b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupScreen = findViewById(R.id.setup_steps_screen);
1442b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final TextView stepsTitle = (TextView)findViewById(R.id.setup_title);
1452b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        stepsTitle.setText(getString(R.string.setup_steps_title, applicationName));
1462b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1472b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final SetupStepIndicatorView indicatorView =
1482b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                (SetupStepIndicatorView)findViewById(R.id.setup_step_indicator);
1492b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupStepGroup = new SetupStepGroup(indicatorView);
1502b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1512b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mStep1Bullet = (TextView)findViewById(R.id.setup_step1_bullet);
1522b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mStep1Bullet.setOnClickListener(this);
1532b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final SetupStep step1 = new SetupStep(STEP_1, applicationName,
1542b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                mStep1Bullet, findViewById(R.id.setup_step1),
1552b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step1_title, R.string.setup_step1_instruction,
1562b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step1_finished_instruction, R.drawable.ic_setup_step1,
1572b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step1_action);
15877f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        final SettingsPoolingHandler handler = mHandler;
1592b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        step1.setAction(new Runnable() {
1602b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            @Override
1612b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            public void run() {
1622b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                invokeLanguageAndInputSettings();
16377f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka                handler.startPollingImeSettings();
1642b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
1652b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        });
1662b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupStepGroup.addStep(step1);
1672b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1682b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final SetupStep step2 = new SetupStep(STEP_2, applicationName,
1692b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                (TextView)findViewById(R.id.setup_step2_bullet), findViewById(R.id.setup_step2),
1702b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step2_title, R.string.setup_step2_instruction,
1712b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                0 /* finishedInstruction */, R.drawable.ic_setup_step2,
1722b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step2_action);
1732b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        step2.setAction(new Runnable() {
1742b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            @Override
1752b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            public void run() {
1769b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka                invokeInputMethodPicker();
1772b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
1782b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        });
1792b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupStepGroup.addStep(step2);
1802b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1812b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final SetupStep step3 = new SetupStep(STEP_3, applicationName,
1822b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                (TextView)findViewById(R.id.setup_step3_bullet), findViewById(R.id.setup_step3),
1832b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step3_title, R.string.setup_step3_instruction,
1842b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                0 /* finishedInstruction */, R.drawable.ic_setup_step3,
1852b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                R.string.setup_step3_action);
1862b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        step3.setAction(new Runnable() {
1872b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            @Override
1882b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            public void run() {
1892b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                invokeSubtypeEnablerOfThisIme();
1902b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
1912b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        });
1922b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupStepGroup.addStep(step3);
1932b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
1942b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mWelcomeVideoUri = new Uri.Builder()
1952b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
1962b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                .authority(getPackageName())
1972b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                .path(Integer.toString(R.raw.setup_welcome_video))
1982b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                .build();
1994705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        final VideoView welcomeVideoView = (VideoView)findViewById(R.id.setup_welcome_video);
2004705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        welcomeVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
2012b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            @Override
2022b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            public void onPrepared(final MediaPlayer mp) {
2032b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                // Now VideoView has been laid-out and ready to play, remove background of it to
2042b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                // reveal the video.
2054705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka                welcomeVideoView.setBackgroundResource(0);
2062b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                mp.setLooping(true);
2072b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
2082b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        });
2094705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        welcomeVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
2102b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            @Override
2112b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            public boolean onError(final MediaPlayer mp, final int what, final int extra) {
2122b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                Log.e(TAG, "Playing welcome video causes error: what=" + what + " extra=" + extra);
213769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka                hideWelcomeVideoAndShowWelcomeImage();
2142b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                return true;
2152b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
2162b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        });
2174705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        mWelcomeVideoView = welcomeVideoView;
218769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeImageView = (ImageView)findViewById(R.id.setup_welcome_image);
2192b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
2202b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionStart = findViewById(R.id.setup_start_label);
2212b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionStart.setOnClickListener(this);
2222b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionNext = findViewById(R.id.setup_next);
2232b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionNext.setOnClickListener(this);
2242b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionFinish = (TextView)findViewById(R.id.setup_finish);
2252b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        TextViewCompatUtils.setCompoundDrawablesRelativeWithIntrinsicBounds(mActionFinish,
2262b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                getResources().getDrawable(R.drawable.ic_setup_finish), null, null, null);
2272b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionFinish.setOnClickListener(this);
2282b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
2292b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
2302b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
2312b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    public void onClick(final View v) {
2322b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (v == mActionFinish) {
2332b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            finish();
2342b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return;
2352b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
2362b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final int currentStep = determineSetupStepNumber();
2372b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final int nextStep;
2382b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (v == mActionStart) {
2392b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            nextStep = STEP_1;
2402b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        } else if (v == mActionNext) {
2412b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            nextStep = mStepNumber + 1;
2422b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        } else if (v == mStep1Bullet && currentStep == STEP_2) {
2432b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            nextStep = STEP_1;
2442b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        } else {
2452b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            nextStep = mStepNumber;
2462b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
2472b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (mStepNumber != nextStep) {
2482b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = nextStep;
2492b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            updateSetupStepView();
2502b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
2512b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
2522b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
2534705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka    void invokeSetupWizardOfThisIme() {
2542b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final Intent intent = new Intent();
2552b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.setClass(this, SetupWizardActivity.class);
2562b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
2572b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                | Intent.FLAG_ACTIVITY_SINGLE_TOP
2582b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2592b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        startActivity(intent);
2609b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        mNeedsToAdjustStepNumberToSystemState = true;
2612b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
2622b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
2632b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private void invokeSettingsOfThisIme() {
2642b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final Intent intent = new Intent();
2652b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.setClass(this, SettingsActivity.class);
2662b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
2672b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
26893d2ab38577fb3d7c919bc4fd19a769f5c93e654Mohammadinamul Sheik        intent.putExtra(SettingsActivity.EXTRA_ENTRY_KEY,
26993d2ab38577fb3d7c919bc4fd19a769f5c93e654Mohammadinamul Sheik                SettingsActivity.EXTRA_ENTRY_VALUE_APP_ICON);
2702b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        startActivity(intent);
2712b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
2722b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
2734705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka    void invokeLanguageAndInputSettings() {
2742b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final Intent intent = new Intent();
2752b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.setAction(Settings.ACTION_INPUT_METHOD_SETTINGS);
2762b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.addCategory(Intent.CATEGORY_DEFAULT);
2772b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        startActivity(intent);
2789b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        mNeedsToAdjustStepNumberToSystemState = true;
2799b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka    }
2809b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka
2819b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka    void invokeInputMethodPicker() {
2829b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        // Invoke input method picker.
28377f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        mImm.showInputMethodPicker();
2849b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        mNeedsToAdjustStepNumberToSystemState = true;
2852b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
2862b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
2874705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka    void invokeSubtypeEnablerOfThisIme() {
288052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawa        final InputMethodInfo imi =
289052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawa                UncachedInputMethodManagerUtils.getInputMethodInfoOf(getPackageName(), mImm);
29077f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        if (imi == null) {
29177f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka            return;
29277f63c8ac64c46de36002fd62c71f1eeebcaf2acTadashi G. Takaoka        }
2932b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final Intent intent = new Intent();
2942b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.setAction(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS);
2952b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.addCategory(Intent.CATEGORY_DEFAULT);
2962b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, imi.getId());
2972b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        startActivity(intent);
2982b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
2992b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3002b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private int determineSetupStepNumberFromLauncher() {
3012b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final int stepNumber = determineSetupStepNumber();
3022b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (stepNumber == STEP_1) {
3032b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return STEP_WELCOME;
3042b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3052b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (stepNumber == STEP_3) {
3062b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return STEP_LAUNCHING_IME_SETTINGS;
3072b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3082b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        return stepNumber;
3092b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3102b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3112b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private int determineSetupStepNumber() {
3122b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mHandler.cancelPollingImeSettings();
31348b707e1bd2f725478a0af10796f67280971acc4Tadashi G. Takaoka        if (FORCE_TO_SHOW_WELCOME_SCREEN) {
31448b707e1bd2f725478a0af10796f67280971acc4Tadashi G. Takaoka            return STEP_1;
31548b707e1bd2f725478a0af10796f67280971acc4Tadashi G. Takaoka        }
316052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawa        if (!UncachedInputMethodManagerUtils.isThisImeEnabled(this, mImm)) {
3172b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return STEP_1;
3182b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
319052ec62abd577182af8d5b50564d8075b18be3c9Yohei Yukawa        if (!UncachedInputMethodManagerUtils.isThisImeCurrent(this, mImm)) {
3202b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return STEP_2;
3212b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3222b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        return STEP_3;
3232b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3242b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3252b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
3262b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    protected void onSaveInstanceState(final Bundle outState) {
3272b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onSaveInstanceState(outState);
3282b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        outState.putInt(STATE_STEP, mStepNumber);
3292b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3302b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3312b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
3322b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    protected void onRestoreInstanceState(final Bundle savedInstanceState) {
3332b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onRestoreInstanceState(savedInstanceState);
3342b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mStepNumber = savedInstanceState.getInt(STATE_STEP);
3352b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3362b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3372b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private static boolean isInSetupSteps(final int stepNumber) {
3382b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        return stepNumber >= STEP_1 && stepNumber <= STEP_3;
3392b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3402b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3412b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
3422b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    protected void onRestart() {
3432b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onRestart();
3449b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        // Probably the setup wizard has been invoked from "Recent" menu. The setup step number
3459b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        // needs to be adjusted to system state, because the state (IME is enabled and/or current)
3469b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        // may have been changed.
3472b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (isInSetupSteps(mStepNumber)) {
3482b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = determineSetupStepNumber();
3492b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3502b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3512b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3522b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
3532b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    protected void onResume() {
3542b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onResume();
3552b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (mStepNumber == STEP_LAUNCHING_IME_SETTINGS) {
3564705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka            // Prevent white screen flashing while launching settings activity.
3574705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka            mSetupWizard.setVisibility(View.INVISIBLE);
3582b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            invokeSettingsOfThisIme();
3592b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = STEP_BACK_FROM_IME_SETTINGS;
3602b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return;
3612b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3622b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (mStepNumber == STEP_BACK_FROM_IME_SETTINGS) {
3632b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            finish();
3642b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return;
3652b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3662b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        updateSetupStepView();
3672b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3682b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3692b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
3702b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    public void onBackPressed() {
3712b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (mStepNumber == STEP_1) {
3722b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = STEP_WELCOME;
3732b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            updateSetupStepView();
3742b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return;
3752b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
3762b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onBackPressed();
3772b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3782b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
379769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    void hideWelcomeVideoAndShowWelcomeImage() {
380769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeVideoView.setVisibility(View.GONE);
381769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeImageView.setImageResource(R.raw.setup_welcome_image);
382769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeImageView.setVisibility(View.VISIBLE);
383769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    }
384769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka
385769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    private void showAndStartWelcomeVideo() {
386769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeVideoView.setVisibility(View.VISIBLE);
387769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeVideoView.setVideoURI(mWelcomeVideoUri);
388769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeVideoView.start();
389769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    }
390769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka
391769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka    private void hideAndStopWelcomeVideo() {
392769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeVideoView.stopPlayback();
393769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        mWelcomeVideoView.setVisibility(View.GONE);
3942b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
3952b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
3962b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
3972b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    protected void onPause() {
398769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        hideAndStopWelcomeVideo();
3992b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onPause();
4002b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
4012b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4022b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    @Override
4032b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    public void onWindowFocusChanged(final boolean hasFocus) {
4042b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        super.onWindowFocusChanged(hasFocus);
4059b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka        if (hasFocus && mNeedsToAdjustStepNumberToSystemState) {
4069b4a883e0961652e60f7934d3b92074f47f7bc23Tadashi G. Takaoka            mNeedsToAdjustStepNumberToSystemState = false;
4072b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNumber = determineSetupStepNumber();
4082b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            updateSetupStepView();
4092b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
4102b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
4112b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4122b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    private void updateSetupStepView() {
4134705c0fa7ca9527f6a3d7cb47542de734a56337dTadashi G. Takaoka        mSetupWizard.setVisibility(View.VISIBLE);
4142b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final boolean welcomeScreen = (mStepNumber == STEP_WELCOME);
4152b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mWelcomeScreen.setVisibility(welcomeScreen ? View.VISIBLE : View.GONE);
4162b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupScreen.setVisibility(welcomeScreen ? View.GONE : View.VISIBLE);
4172b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        if (welcomeScreen) {
418769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka            if (ENABLE_WELCOME_VIDEO) {
419769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka                showAndStartWelcomeVideo();
420769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka            } else {
421769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka                hideWelcomeVideoAndShowWelcomeImage();
422769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka            }
4232b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            return;
4242b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
425769427cff24944958f5f1f6179090a86444f3eabTadashi G. Takaoka        hideAndStopWelcomeVideo();
4262b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        final boolean isStepActionAlreadyDone = mStepNumber < determineSetupStepNumber();
4272b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mSetupStepGroup.enableStep(mStepNumber, isStepActionAlreadyDone);
4282b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionNext.setVisibility(isStepActionAlreadyDone ? View.VISIBLE : View.GONE);
4292b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        mActionFinish.setVisibility((mStepNumber == STEP_3) ? View.VISIBLE : View.GONE);
4302b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
4312b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4322b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    static final class SetupStep implements View.OnClickListener {
4332b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public final int mStepNo;
4342b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final View mStepView;
4352b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final TextView mBulletView;
4362b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final int mActivatedColor;
4372b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final int mDeactivatedColor;
4382b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final String mInstruction;
4392b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final String mFinishedInstruction;
4402b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final TextView mActionLabel;
4412b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private Runnable mAction;
4422b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4432b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public SetupStep(final int stepNo, final String applicationName, final TextView bulletView,
4442b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                final View stepView, final int title, final int instruction,
4452b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                final int finishedInstruction, final int actionIcon, final int actionLabel) {
4462b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepNo = stepNo;
4472b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepView = stepView;
4482b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mBulletView = bulletView;
4492b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            final Resources res = stepView.getResources();
4502b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mActivatedColor = res.getColor(R.color.setup_text_action);
4512b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mDeactivatedColor = res.getColor(R.color.setup_text_dark);
4522b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4532b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            final TextView titleView = (TextView)mStepView.findViewById(R.id.setup_step_title);
4542b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            titleView.setText(res.getString(title, applicationName));
4552b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mInstruction = (instruction == 0) ? null
4562b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                    : res.getString(instruction, applicationName);
4572b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mFinishedInstruction = (finishedInstruction == 0) ? null
4582b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                    : res.getString(finishedInstruction, applicationName);
4592b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4602b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mActionLabel = (TextView)mStepView.findViewById(R.id.setup_step_action_label);
4612b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mActionLabel.setText(res.getString(actionLabel));
4622b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            if (actionIcon == 0) {
463790934158d356bfce0db97ef5aebb12128bc86eaTadashi G. Takaoka                final int paddingEnd = ViewCompatUtils.getPaddingEnd(mActionLabel);
464790934158d356bfce0db97ef5aebb12128bc86eaTadashi G. Takaoka                ViewCompatUtils.setPaddingRelative(mActionLabel, paddingEnd, 0, paddingEnd, 0);
4652b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            } else {
4662b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                TextViewCompatUtils.setCompoundDrawablesRelativeWithIntrinsicBounds(
4672b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                        mActionLabel, res.getDrawable(actionIcon), null, null, null);
4682b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
4692b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
4702b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4712b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void setEnabled(final boolean enabled, final boolean isStepActionAlreadyDone) {
4722b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mStepView.setVisibility(enabled ? View.VISIBLE : View.GONE);
4732b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mBulletView.setTextColor(enabled ? mActivatedColor : mDeactivatedColor);
4742b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            final TextView instructionView = (TextView)mStepView.findViewById(
4752b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                    R.id.setup_step_instruction);
4762b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            instructionView.setText(isStepActionAlreadyDone ? mFinishedInstruction : mInstruction);
4772b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mActionLabel.setVisibility(isStepActionAlreadyDone ? View.GONE : View.VISIBLE);
4782b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
4792b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4802b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void setAction(final Runnable action) {
4812b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mActionLabel.setOnClickListener(this);
4822b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mAction = action;
4832b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
4842b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4852b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        @Override
4862b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void onClick(final View v) {
4872b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            if (v == mActionLabel && mAction != null) {
4882b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                mAction.run();
4892b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                return;
4902b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
4912b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
4922b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
4932b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4942b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    static final class SetupStepGroup {
4952b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        private final SetupStepIndicatorView mIndicatorView;
496a91561aa58db1c43092c1caecc051a11fa5391c7Tadashi G. Takaoka        private final ArrayList<SetupStep> mGroup = new ArrayList<>();
4972b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
4982b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public SetupStepGroup(final SetupStepIndicatorView indicatorView) {
4992b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mIndicatorView = indicatorView;
5002b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
5012b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
5022b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void addStep(final SetupStep step) {
5032b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mGroup.add(step);
5042b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
5052b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka
5062b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        public void enableStep(final int enableStepNo, final boolean isStepActionAlreadyDone) {
5072b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            for (final SetupStep step : mGroup) {
5082b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka                step.setEnabled(step.mStepNo == enableStepNo, isStepActionAlreadyDone);
5092b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            }
5102b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka            mIndicatorView.setIndicatorPosition(enableStepNo - STEP_1, mGroup.size());
5112b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka        }
5122b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka    }
5132b5c9726f4a7d24497fc1df17c6ce57188c99cabTadashi G. Takaoka}
514