package info.nightscout.androidaps.startupwizard; import android.annotation.SuppressLint; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RadioGroup; import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.utils.LocaleHelper; import info.nightscout.utils.SP; import static info.nightscout.androidaps.startupwizard.SWItem.Type.RADIOBUTTON; import static info.nightscout.androidaps.startupwizard.SWItem.Type.STRING; import static info.nightscout.androidaps.startupwizard.SWItem.Type.URL; /** * An example full-screen activity that shows and hides the system UI (i.e. * status bar and navigation/system bar) with user interaction. */ public class SetupWizardActivity extends AppCompatActivity { /** * Whether or not the system UI should be auto-hidden after * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. */ private static final boolean AUTO_HIDE = false; /** * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after * user interaction before hiding the system UI. */ private static final int AUTO_HIDE_DELAY_MILLIS = 3000; /** * Some older devices needs a small delay between UI widget updates * and a change of the status and navigation bar. */ private static final int UI_ANIMATION_DELAY = 300; private final Handler mHideHandler = new Handler(); private View mContentView; private LinearLayout linearLayout; private TextView radioLabel; private int numberOfButtons = 0; private List labels = new ArrayList(); private List comments = new ArrayList(); private LinearLayout layout; private TextView textlabel; private TextView screenName; private Button skipButton; //logiing private static Logger log = LoggerFactory.getLogger(SetupWizardActivity.class); private static SetupWizardActivity mWizardActivity; private int currentWizardPage = 0; public static final String INTENT_MESSAGE = "WIZZARDPAGE"; private final Runnable mHidePart2Runnable = new Runnable() { @SuppressLint("InlinedApi") @Override public void run() { // Delayed removal of status and navigation bar // Note that some of these constants are new as of API 16 (Jelly Bean) // and API 19 (KitKat). It is safe to use them, as they are inlined // at compile-time and do nothing on earlier devices. mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); } }; private View mControlsView; private final Runnable mShowPart2Runnable = new Runnable() { @Override public void run() { // Delayed display of UI elements ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.show(); } mControlsView.setVisibility(View.VISIBLE); } }; private boolean mVisible; private final Runnable mHideRunnable = new Runnable() { @Override public void run() { hide(); } }; /** * Touch listener to use for in-layout UI controls to delay hiding the * system UI. This is to prevent the jarring behavior of controls going away * while interacting with activity UI. */ private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (AUTO_HIDE) { delayedHide(AUTO_HIDE_DELAY_MILLIS); } return false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setupwizard); mWizardActivity = this; mVisible = true; mControlsView = findViewById(R.id.fullscreen_content_controls); mContentView = findViewById(R.id.fullscreen_content); // Set up the user interaction to manually show or hide the system UI. mContentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { toggle(); } }); Intent intent = getIntent(); int showPage = intent.getIntExtra(SetupWizardActivity.INTENT_MESSAGE,0); SWDefinition swDefinition = SWDefinition.getInstance(); List screens = swDefinition.getScreens(); if(screens.size() > 0 && showPage < screens.size()){ SWScreen currentScreen = screens.get(showPage); currentWizardPage = showPage; // show/hide prev/next buttons if we are at the beninning/end //showNextButton(showPage, screens.size()-1); if(showPage == 0) ((Button) findViewById(R.id.previous_button)).setVisibility(View.GONE); //Set screen name screenName = (TextView) findViewById(R.id.fullscreen_content); screenName.setText(currentScreen.getHeader()); //Display screen items in the order entered linearLayout = (LinearLayout) findViewById(R.id.fullscreen_content_controls); // is it skippable ? if(currentScreen.skippable) { //display skip button skipButton = (Button) findViewById(R.id.skip_button); } //Generate layout first LinearLayout layout = info.nightscout.androidaps.startupwizard.SWItem.generateLayout(this.findViewById(R.id.fullscreen_content_fields)); for(int i = 0; i < currentScreen.items.size(); i++){ SWItem currentItem = currentScreen.items.get(i); labels.add(i,currentItem.getLabel()); comments.add(i,currentItem.getComment()); currentItem.setOptions(labels, comments); currentItem.generateDialog(this.findViewById(R.id.fullscreen_content_fields), layout); } // Check if input isValid or screen is sckippable if(currentScreen.validator.isValid() || currentScreen.skippable) { showNextButton(showPage, screens.size() - 1); show(); } } // Upon interacting with UI controls, delay any scheduled hide() // operations to prevent the jarring behavior of controls going away // while interacting with the UI. findViewById(R.id.next_button).setOnTouchListener(mDelayHideTouchListener); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Trigger the initial hide() shortly after the activity has been // created, to briefly hint to the user that UI controls // are available. delayedHide(100); } @Override protected void onResume() { super.onResume(); // check is current locale is different from the one in preferences // log.debug("Current: "+LocaleHelper.getLanguage(this)+" preferences: "+SP.getString("language", "en")); if(!LocaleHelper.getLanguage(this).equals(SP.getString("language", "en"))) { // it is so change it in locale and restart SetupWizard // log.debug("Setting locale to: "+SP.getString("language", "en")+" and restarting"); LocaleHelper.setLocale(this, SP.getString(R.string.key_language, "en")); MainApp.bus().post(new EventRefreshGui(true)); Intent intent = getIntent(); this.finish(); startActivity(intent); } } private void toggle() { if (mVisible) { hide(); } else { show(); } } private void hide() { // Hide UI first ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.hide(); } mControlsView.setVisibility(View.VISIBLE); mVisible = true; // Schedule a runnable to remove the status and navigation bar after a delay mHideHandler.removeCallbacks(mShowPart2Runnable); mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY); } @SuppressLint("InlinedApi") private void show() { // Show the system bar mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); mVisible = true; // Schedule a runnable to display UI elements after a delay mHideHandler.removeCallbacks(mHidePart2Runnable); mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY); } /** * Schedules a call to hide() in delay milliseconds, canceling any * previously scheduled calls. */ private void delayedHide(int delayMillis) { mHideHandler.removeCallbacks(mHideRunnable); mHideHandler.postDelayed(mHideRunnable, delayMillis); } private void showNextButton(int currentPage, int maxPages){ if(currentPage == maxPages) { ((Button) findViewById(R.id.finish_button)).setVisibility(View.VISIBLE); ((Button) findViewById(R.id.next_button)).setVisibility(View.GONE); } else ((Button) findViewById(R.id.next_button)).setVisibility(View.VISIBLE); show(); } public void showNextPage(View view) { Intent intent = new Intent(this, SetupWizardActivity.class); intent.putExtra(INTENT_MESSAGE, currentWizardPage + 1); startActivity(intent); } public void showPreviousPage(View view) { Intent intent = new Intent(this, SetupWizardActivity.class); if(currentWizardPage > 0) intent.putExtra(INTENT_MESSAGE, currentWizardPage - 1); else intent.putExtra(INTENT_MESSAGE, 0); startActivity(intent); } // Go back to overview public void finishSetupWizard(View view){ // restart app Context context = getApplicationContext(); Intent mStartActivity = new Intent(context, MainActivity.class); int mPendingIntentId = 123456; PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); System.exit(0); } public static SetupWizardActivity instance(){ return mWizardActivity; } }