Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84006e23 authored by James Lemieux's avatar James Lemieux
Browse files

Avoid jank in the tabs from a cold open

Bug: 24977472

By default, the menu is inflated after the first draw. A proactive
call to Toolbar.inflate(...) during creation defeats this default
behavior.

A second problem is that the menu that is inflated by default for
DeskClock contains the search menu item which is briefly shown.
By defaulting that menu item to be invisible and only making it
visible when its corresponding controller exists, the
dancing/flashing effect is avoided.

Change-Id: I933ab9a59b471abe26e1cf07385e4a4c128d1808
parent 26e69a7e
Loading
Loading
Loading
Loading
+23 −19
Original line number Diff line number Diff line
@@ -17,26 +17,30 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <group android:id="@+id/menu_items">
        <item android:id="@+id/menu_item_search"
            android:title="@android:string/search_go"
        <item
            android:id="@+id/menu_item_search"
            android:icon="@android:drawable/ic_menu_search"
            android:imeOptions="actionSearch"
            android:orderInCategory="1"
            app:showAsAction="ifRoom"
            app:actionViewClass="android.support.v7.widget.SearchView" />
        <item android:id="@+id/menu_item_sort"
            android:title="@android:string/search_go"
            android:visible="false"
            app:actionViewClass="android.support.v7.widget.SearchView"
            app:showAsAction="ifRoom"/>
        <item
            android:id="@+id/menu_item_sort"
            android:title="@string/menu_item_sort_by_gmt_offset"
            app:showAsAction="never"/>
        <item android:id="@+id/menu_item_night_mode"
            android:title="@string/menu_item_night_mode"
            android:icon="@android:drawable/ic_menu_preferences"/>
        <item android:id="@+id/menu_item_settings"
            android:title="@string/menu_item_settings"
            android:icon="@android:drawable/ic_menu_preferences"/>
        <item android:id="@+id/menu_item_help"
            android:title="@string/menu_item_help"
            android:icon="@android:drawable/ic_menu_preferences"/>
        <item
            android:id="@+id/menu_item_night_mode"
            android:icon="@android:drawable/ic_menu_preferences"
            android:title="@string/menu_item_night_mode"/>
        <item
            android:id="@+id/menu_item_settings"
            android:icon="@android:drawable/ic_menu_preferences"
            android:title="@string/menu_item_settings"/>
        <item
            android:id="@+id/menu_item_help"
            android:icon="@android:drawable/ic_menu_preferences"
            android:title="@string/menu_item_help"/>
    </group>
</menu>
 No newline at end of file

+53 −49
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ public class DeskClock extends BaseActivity
        // not the most recent launch was via a dock event
        setIntent(newIntent);

        // Timer receiver may ask to go to the timers fragment if a timer expired.
        // Honor the tab requested by the intent, if any.
        int tab = newIntent.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
        if (tab != -1 && mTabLayout != null) {
            mTabLayout.getTabAt(tab).select();
@@ -106,45 +106,6 @@ public class DeskClock extends BaseActivity
        }
    }

    private void initViews() {
        setContentView(R.layout.desk_clock);
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
        mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
        mFab = (ImageView) findViewById(R.id.fab);
        mLeftButton = (ImageButton) findViewById(R.id.left_button);
        mRightButton = (ImageButton) findViewById(R.id.right_button);
        if (mTabsAdapter == null) {
            mViewPager = (RtlViewPager) findViewById(R.id.desk_clock_pager);
            // Keep all four tabs to minimize jank.
            mViewPager.setOffscreenPageLimit(3);
            // Set Accessibility Delegate to null so ViewPager doesn't intercept movements and
            // prevent the fab from being selected.
            mViewPager.setAccessibilityDelegate(null);
            mTabsAdapter = new TabsAdapter(this, mViewPager);
            createTabs();
            mTabLayout.setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(mViewPager));
        }

        mFab.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                getSelectedFragment().onFabClick(view);
            }
        });
        mLeftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                getSelectedFragment().onLeftButtonClick(view);
            }
        });
        mRightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                getSelectedFragment().onRightButtonClick(view);
            }
        });
    }

    @VisibleForTesting
    DeskClockFragment getSelectedFragment() {
        return (DeskClockFragment) mTabsAdapter.getItem(mSelectedTab);
@@ -176,10 +137,6 @@ public class DeskClock extends BaseActivity
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mActionBarMenuManager.addMenuItemController(new SettingMenuItemController(this))
                .addMenuItemController(MenuItemControllerFactory.getInstance()
                        .buildMenuItemControllers(this))
                .addMenuItemController(nightModeMenuItemController);
        setVolumeControlStream(AudioManager.STREAM_ALARM);

        if (icicle != null) {
@@ -193,15 +150,62 @@ public class DeskClock extends BaseActivity
                    false /* animate */);
        }

        // Timer receiver may ask the app to go to the timer fragment if a timer expired
        Intent i = getIntent();
        if (i != null) {
            int tab = i.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
        // Honor the tab requested by the intent, if any.
        final Intent intent = getIntent();
        if (intent != null) {
            int tab = intent.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
            if (tab != -1) {
                mSelectedTab = tab;
            }
        }
        initViews();

        setContentView(R.layout.desk_clock);
        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
        mFab = (ImageView) findViewById(R.id.fab);
        mLeftButton = (ImageButton) findViewById(R.id.left_button);
        mRightButton = (ImageButton) findViewById(R.id.right_button);
        if (mTabsAdapter == null) {
            mViewPager = (RtlViewPager) findViewById(R.id.desk_clock_pager);
            // Keep all four tabs to minimize jank.
            mViewPager.setOffscreenPageLimit(3);
            // Set Accessibility Delegate to null so ViewPager doesn't intercept movements and
            // prevent the fab from being selected.
            mViewPager.setAccessibilityDelegate(null);
            mTabsAdapter = new TabsAdapter(this, mViewPager);
            createTabs();
            mTabLayout.setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(mViewPager));
        }

        mFab.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                getSelectedFragment().onFabClick(view);
            }
        });
        mLeftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                getSelectedFragment().onLeftButtonClick(view);
            }
        });
        mRightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                getSelectedFragment().onRightButtonClick(view);
            }
        });

        // Configure the menu item controllers.
        mActionBarMenuManager.addMenuItemController(new SettingMenuItemController(this))
                .addMenuItemController(MenuItemControllerFactory.getInstance()
                        .buildMenuItemControllers(this))
                .addMenuItemController(nightModeMenuItemController);

        // Inflate the menu during creation to avoid a double layout pass. Otherwise, the menu
        // inflation occurs *after* the initial draw and a second layout pass adds in the menu.
        onCreateOptionsMenu(toolbar.getMenu());

        // We need to update the system next alarm time on app startup because the
        // user might have clear our data.