package com.anysoftkeyboard.ui.settings.setup; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.menny.android.anysoftkeyboard.R; public class WizardPageEnableKeyboardFragment extends WizardPageBaseFragment { private static final int KEY_MESSAGE_UNREGISTER_LISTENER = 447; private static final int KEY_MESSAGE_RETURN_TO_APP = 446; private Handler mGetBackHereHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case KEY_MESSAGE_RETURN_TO_APP: if (mReLaunchTaskIntent != null && mBaseContext != null) { mBaseContext.startActivity(mReLaunchTaskIntent); mReLaunchTaskIntent = null; } break; case KEY_MESSAGE_UNREGISTER_LISTENER: unregisterSettingsObserverNow(); break; } } }; private final ContentObserver mSecureSettingsChanged = new ContentObserver(null) { @Override public boolean deliverSelfNotifications() { return false; } @Override public void onChange(boolean selfChange) { if (!isResumed()) { if (isStepCompleted()) { //should we return to this task? //this happens when the user is asked to enable AnySoftKeyboard, which is done on a different UI activity (outside of my App). mGetBackHereHandler.removeMessages(KEY_MESSAGE_RETURN_TO_APP); mGetBackHereHandler.sendMessageDelayed(mGetBackHereHandler.obtainMessage(KEY_MESSAGE_RETURN_TO_APP), 50/*enough for the user to see what happened.*/); } } } }; private Context mBaseContext = null; private Intent mReLaunchTaskIntent = null; private Context mAppContext; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.keyboard_setup_wizard_page_enable_layout, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); view.findViewById(R.id.go_to_language_settings_action).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //registering for changes, so I'll know to come back here. mAppContext = getActivity().getApplicationContext(); mAppContext.getContentResolver().registerContentObserver(Settings.Secure.CONTENT_URI, true, mSecureSettingsChanged); //but I don't want to listen for changes for ever! //If the user is taking too long to change one checkbox, I say forget about it. mGetBackHereHandler.removeMessages(KEY_MESSAGE_UNREGISTER_LISTENER); mGetBackHereHandler.sendMessageDelayed(mGetBackHereHandler.obtainMessage(KEY_MESSAGE_UNREGISTER_LISTENER), 45*1000/*45 seconds to change a checkbox is enough. After that, I wont listen to changes anymore.*/); Intent startSettings = new Intent(android.provider.Settings.ACTION_INPUT_METHOD_SETTINGS); startSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { mAppContext.startActivity(startSettings); } catch (ActivityNotFoundException notFoundEx) { //weird.. the device does not have the IME setting activity. Nook? Toast.makeText(mAppContext, R.string.setup_wizard_step_one_action_error_no_settings_activity, Toast.LENGTH_LONG).show(); } } }); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentActivity activity = getActivity(); mBaseContext = activity.getBaseContext(); mReLaunchTaskIntent = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName()); } @Override public void onStart() { super.onStart(); mGetBackHereHandler.removeMessages(KEY_MESSAGE_RETURN_TO_APP); unregisterSettingsObserverNow(); } @Override protected boolean isStepCompleted() { return SetupSupport.isThisKeyboardEnabled(getActivity()); } @Override protected boolean isStepPreConditionDone() { return true;//the pre-condition is that the App is installed... I guess it does, right? } @Override public void onDestroy() { super.onDestroy(); unregisterSettingsObserverNow(); } private void unregisterSettingsObserverNow() { mGetBackHereHandler.removeMessages(KEY_MESSAGE_UNREGISTER_LISTENER); if (mAppContext != null) { mAppContext.getContentResolver().unregisterContentObserver(mSecureSettingsChanged); mAppContext = null; } } }