### MainActivity Setup Sequence Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/CONFIGURATION.md This sequence demonstrates the setup for MainActivity, including data binding, adapter configuration, and listener restoration after configuration changes. ```java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); // 1. Create transformer SceneTransformer sceneTransformer = new SceneTransformer(); // 2. Create adapter with transformer ScenePagerAdapter scenePagerAdapter = new ScenePagerAdapter( getSupportFragmentManager(), sceneTransformer ); // 3. Configure scene pager binding.tutorialPager.setAdapter(scenePagerAdapter); binding.tutorialPager.setOffscreenPageLimit(3); binding.tutorialPager.setPageTransformer(true, sceneTransformer); // 4. Configure text pager TextPagerAdapter textAdapter = new TextPagerAdapter(); binding.textPager.setAdapter(textAdapter); // 5. Link indicator binding.indicator.setViewPager(binding.textPager); binding.indicator.setSnap(true); // 6. Set listeners binding.indicator.setOnPageChangeListener(...); binding.touchInterceptorLayout.setOnTouchListener(...); binding.start.setOnClickListener(...); // 7. Restore listeners after configuration change if (savedInstanceState != null) { for (Fragment fragment : getSupportFragmentManager().getFragments()) { sceneTransformer.addSceneChangeListener((SceneChangeListener) fragment); } } } ``` -------------------------------- ### Full Example of MySceneFragment Extending BaseSceneFragment Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/BaseSceneFragment.md This example demonstrates a complete implementation of a scene fragment, including lifecycle overrides for view inflation, scene transitions, and state management. ```java public class MySceneFragment extends BaseSceneFragment { private FragmentBinding binding; public static MySceneFragment newInstance(int position) { MySceneFragment fragment = new MySceneFragment(); Bundle args = new Bundle(); args.putInt(KEY_POSITION, position); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my_scene, container, false); setRootPositionTag(binding.getRoot()); return binding.getRoot(); } @Override public void enterScene(ImageView sharedElement, float position) { binding.myView.setTranslationY(100 * position); } @Override public void centerScene(ImageView sharedElement) { binding.myView.setTranslationY(0); } @Override public void exitScene(ImageView sharedElement, float position) { binding.myView.setAlpha(1 + position); } @Override public void notInScene() { binding.myView.setAlpha(0); } } ``` -------------------------------- ### Custom Onboarding Activity Integration Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/MainActivity.md Example of a custom onboarding activity that sets up SceneTransformer, ScenePagerAdapter, and ViewPager similar to the MainActivity. ```java public class CustomOnboardingActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set up exactly like MainActivity SceneTransformer transformer = new SceneTransformer(); ScenePagerAdapter adapter = new ScenePagerAdapter( getSupportFragmentManager(), transformer ); ViewPager pager = (ViewPager) findViewById(R.id.pager); pager.setAdapter(adapter); pager.setPageTransformer(true, transformer); pager.setOffscreenPageLimit(3); } } ``` -------------------------------- ### Activity onCreate: Setup ViewPager and Transformer Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/ARCHITECTURE.md Initializes the SceneTransformer and ScenePagerAdapter, then sets them to the ViewPager in the Activity's onCreate method. ```java onCreate() { SceneTransformer transformer = new SceneTransformer(); ScenePagerAdapter adapter = new ScenePagerAdapter(fm, transformer); viewPager.setAdapter(adapter); viewPager.setPageTransformer(true, transformer); } ``` -------------------------------- ### RecyclerView Setup with ImageAdapter Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/CONFIGURATION.md Configures a RecyclerView with a LinearLayoutManager and an ImageAdapter. Loads drawable resources from R.array.images_1. ```java TypedArray images = getResources().obtainTypedArray(R.array.images_1); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.images); LinearLayoutManager layout = new LinearLayoutManager( this, LinearLayoutManager.HORIZONTAL, false ); recyclerView.setLayoutManager(layout); recyclerView.setAdapter(new ImageAdapter(images)); ``` -------------------------------- ### Bundle Keys for Saving Start Button State Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/MainActivity.md Defines constants used as bundle keys to save the start button's visibility and Y-coordinate during configuration changes. ```java private static final String KEY_BUTTON_VISIBILITY = "KEY_BUTTON_VISIBILITY" private static final String KEY_BUTTON_Y = "KEY_BUTTON_Y" ``` -------------------------------- ### ViewHelper Methods Returning Point Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/TYPES.md Demonstrates using ViewHelper methods to get view coordinates and display dimensions. ```java Point location = ViewHelper.getViewLocation(view); // top-left Point center = ViewHelper.getViewCenterPoint(view); // center Point screen = ViewHelper.getDisplaySize(context); // display dimensions ``` -------------------------------- ### Common onCreateView Lifecycle Pattern Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/SceneFragments.md Illustrates the standard pattern for the onCreateView method in scene fragments. Includes view binding setup and state restoration. ```java @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_scene_*, container, false); setRootPositionTag(binding.getRoot()); // Setup views and restore state if (savedState != null) { // restore animation state } return binding.getRoot(); } ``` -------------------------------- ### Get Display Size using ViewHelper Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/QUICK_REFERENCE.md Use getDisplaySize to retrieve the screen dimensions. ```java ViewHelper.getDisplaySize(Context) ``` -------------------------------- ### Get View Location using ViewHelper Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/QUICK_REFERENCE.md Use getViewLocation to get the top-left coordinates of a View. ```java ViewHelper.getViewLocation(View) ``` -------------------------------- ### Save Activity State Before Configuration Change Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/MainActivity.md Saves the visibility and Y translation of the start button to a Bundle. This is crucial for restoring the UI state after events like screen rotation. ```java @Override public void onSaveInstanceState(Bundle savedInstanceState) ``` ```java savedInstanceState.putInt(KEY_BUTTON_VISIBILITY, binding.start.getVisibility()); savedInstanceState.putFloat(KEY_BUTTON_Y, binding.start.getTranslationY()); ``` -------------------------------- ### Get View Center Point using ViewHelper Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/QUICK_REFERENCE.md Use getViewCenterPoint to get the center coordinates of a View. ```java ViewHelper.getViewCenterPoint(View) ``` -------------------------------- ### Null Handling Example Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/ViewHelper.md Passing null to ViewHelper methods will result in a NullPointerException. Ensure all View and Context parameters are non-null. ```java // This will throw NullPointerException Point location = ViewHelper.getViewLocation(null); ``` -------------------------------- ### Start Activity with Shared Element Transition Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/USAGE_PATTERNS.md Initiate an Activity transition using shared element animations. Note that the library's shared element functionality differs from the Activity transition API, as the library shares elements across fragments while Activity transitions share between activities. ```java startActivity(intent, ActivityOptions.makeSceneTransitionAnimation( this, sharedView, "shared" ).toBundle()); ``` -------------------------------- ### ViewHelper Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/QUICK_REFERENCE.md Utility class for view-related operations. Provides methods to get view location, center point, and display size. ```APIDOC ## ViewHelper ### Description Utility class for view-related operations. Provides methods to get view location, center point, and display size. ### Methods - `ViewHelper.getViewLocation(View)`: Returns the top-left point of a view. - `ViewHelper.getViewCenterPoint(View)`: Returns the center point of a view. - `ViewHelper.getDisplaySize(Context)`: Returns the screen dimensions as a Point. ``` -------------------------------- ### Restore Activity State After Configuration Change Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/MainActivity.md Restores the visibility and Y translation of the start button from the provided Bundle. This method is called after onCreate if a saved state exists. ```java @SuppressWarnings("ResourceType") public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) ``` ```java binding.start.setVisibility(savedInstanceState.getInt(KEY_BUTTON_VISIBILITY)); binding.start.setTranslationY(savedInstanceState.getFloat(KEY_BUTTON_Y)); ``` -------------------------------- ### BaseSceneFragment Enter Scene Animation Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/ARCHITECTURE.md Implements the animation logic for a scene entering the view. This example shows how to apply translation and alpha changes based on the provided position to create a sliding and fading-in effect. ```java // Called repeatedly as position changes from 0.5 to 0.0 @Override public void enterScene(ImageView sharedElement, float position) { // position: 0.5 → 0.4 → 0.3 → ... → 0.0 binding.myView.setTranslationX(100 * position); // Slides from right to center binding.myView.setAlpha(1.0f - position); // Fades in } ``` -------------------------------- ### ProGuard Keep Rules Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/CONFIGURATION.md These are example ProGuard keep rules to prevent code shrinking for specific classes and interfaces within the redstar.onboarding package. ```proguard -keep public class redstar.onboarding.** { public *; } -keep public interface redstar.onboarding.adapter.SceneTransformer$SceneChangeListener { *; } ``` -------------------------------- ### Show Button on Final Page Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/USAGE_PATTERNS.md Attach a page change listener to a ViewPager to control the visibility of a start button. The button appears only when the user reaches the last page (index 2). ```java binding.pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { binding.startButton.setVisibility( position == 2 ? View.VISIBLE : View.GONE ); } }); binding.startButton.setOnClickListener(v -> { startActivity(new Intent(this, MainActivity.class)); finish(); }); ``` -------------------------------- ### MainActivity Integration with ViewPagers Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/TextPagerAdapter.md Integrates ScenePagerAdapter and TextPagerAdapter within MainActivity. This setup links a scene pager with animations and a text pager for synchronized text display, also connecting an indicator to the text pager. ```java // Scene pager with animations SceneTransformer transformer = new SceneTransformer(); ScenePagerAdapter scenePagerAdapter = new ScenePagerAdapter( getSupportFragmentManager(), transformer ); binding.tutorialPager.setAdapter(scenePagerAdapter); binding.tutorialPager.setPageTransformer(true, transformer); // Text pager for synchronized text display TextPagerAdapter textAdapter = new TextPagerAdapter(); binding.textPager.setAdapter(textAdapter); // Link indicator to text pager binding.indicator.setViewPager(binding.textPager); ``` -------------------------------- ### Execute Logic Based on Page Position Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/USAGE_PATTERNS.md Implement conditional logic within the `enterScene` method based on the current page's position. The `position` parameter ranges from 1.0 (just started entering) to 0.0 (almost centered). ```java @Override public void enterScene(ImageView sharedElement, float position) { // position: 1.0 to 0.0 if (position > 0.5f) { // Just started entering binding.text.setText("Loading..."); } else { // Almost centered binding.text.setText("Ready"); } } ``` -------------------------------- ### Create Onboarding Activity Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/USAGE_PATTERNS.md Set up the main activity to host the onboarding flow. This involves creating a SceneTransformer, configuring the ScenePagerAdapter, and setting up the ViewPager. ```java public class OnboardingActivity extends AppCompatActivity { private ActivityOnboardingBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_onboarding); // Create transformer SceneTransformer transformer = new SceneTransformer(); // Create adapter MyScenePagerAdapter adapter = new MyScenePagerAdapter( getSupportFragmentManager(), transformer ); // Configure ViewPager binding.pager.setAdapter(adapter); binding.pager.setOffscreenPageLimit(adapter.getCount()); binding.pager.setPageTransformer(true, transformer); // Optional: Add page change listener binding.pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float offset, int pixels) {} @Override public void onPageSelected(int position) { if (position == adapter.getCount() - 1) { // Last page reached } } @Override public void onPageScrollStateChanged(int state) {} }); // Handle back button binding.closeButton.setOnClickListener(v -> finish()); // Restore listeners after config change if (savedInstanceState != null) { for (Fragment f : getSupportFragmentManager().getFragments()) { if (f instanceof BaseSceneFragment) { transformer.addSceneChangeListener((SceneChangeListener) f); } } } } } ``` -------------------------------- ### Initialize Activity and UI Components Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/MainActivity.md Sets up the activity's layout, ViewPagers, adapters, and listeners. Ensure all necessary data binding and adapter configurations are in place before use. ```java @Override protected void onCreate(Bundle savedInstanceState) ``` ```java binding = DataBindingUtil.setContentView(this, R.layout.activity_main); ``` ```java SceneTransformer sceneTransformer = new SceneTransformer(); ScenePagerAdapter scenePagerAdapter = new ScenePagerAdapter( getSupportFragmentManager(), sceneTransformer ); binding.tutorialPager.setAdapter(scenePagerAdapter); binding.tutorialPager.setOffscreenPageLimit(3); binding.tutorialPager.setPageTransformer(true, sceneTransformer); ``` ```java TextPagerAdapter textAdapter = new TextPagerAdapter(); binding.textPager.setAdapter(textAdapter); binding.indicator.setViewPager(binding.textPager); binding.indicator.setSnap(true); ``` ```java binding.indicator.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 1) { binding.start.setVisibility(View.VISIBLE); binding.start.setTranslationY(binding.textPager.getBottom() * (1 - positionOffset)); binding.indicator.setAlpha(1 - positionOffset); } } }); ``` ```java binding.touchInterceptorLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { binding.tutorialPager.onTouchEvent(event); binding.textPager.onTouchEvent(event); return true; } }); ``` ```java binding.start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(), "Start clicked", Toast.LENGTH_SHORT).show(); } }); ``` ```java if (savedInstanceState != null) { for (Fragment fragment : getSupportFragmentManager().getFragments()) { sceneTransformer.addSceneChangeListener( (SceneTransformer.SceneChangeListener) fragment); } } ``` -------------------------------- ### MainActivity Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/QUICK_REFERENCE.md Sample activity demonstrating the use of ViewPagers and handling activity state. ```APIDOC ## MainActivity ### Description Sample activity demonstrating the use of ViewPagers and handling activity state. ### Methods - `onCreate(Bundle)`: Override this method to set up ViewPagers. - `onSaveInstanceState(Bundle)`: Override this method to save the state of buttons. - `onRestoreInstanceState(Bundle)`: Override this method to restore the state of buttons. ``` -------------------------------- ### Get Count for TextPagerAdapter Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/api-reference/TextPagerAdapter.md Returns the total number of pages managed by the TextPagerAdapter. The sample implementation returns 3. ```java @Override public int getCount() { return 3; } ``` ```java TextPagerAdapter adapter = new TextPagerAdapter(); int pageCount = adapter.getCount(); // returns 3 ``` -------------------------------- ### Set up ViewPagers in MainActivity Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/QUICK_REFERENCE.md Override onCreate in MainActivity to set up ViewPagers. ```java onCreate(Bundle) ``` -------------------------------- ### Onboarding Activity Layout Source: https://github.com/eoinfogarty/onboarding/blob/master/_autodocs/USAGE_PATTERNS.md Define the layout for the onboarding activity, including a ViewPager to display the scenes and a close button. ```xml