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

Commit d2f4ba2b authored by chihhangchuang's avatar chihhangchuang
Browse files

Implement new grid applying experience

Video: https://drive.google.com/a/google.com/file/d/1DPy0OeGcBdD2qobdGooQPggJ5FX7Psij/view?usp=sharing

Without mReloadOptionsAfterApplying flag, reload preview would fail when applied grid, and had a performance problem, the simplest way is to add the flag to prevent it reload when applying.
Video without mReloadOptionsAfterApplying flag: https://drive.google.com/a/google.com/file/d/1XFpydX9YFj_IjfOutyXBBnzImmRCaIKS/view?usp=sharing

New applied string are confirmed in b/151289552

Test: Manually
Bug: 151289552
Change-Id: I3f39d80c66940cc1cf2db687294f67924cc8a3c3
parent 3ca9e137
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -99,10 +99,13 @@
    <string name="grid_title_pattern"><xliff:g name="num_cols" example="1">%1$d</xliff:g>x<xliff:g name="num_rows" example="1">%2$d</xliff:g></string>

    <!-- Message shown when a theme has been applied successfully in the system [CHAR LIMIT=NONE] -->
    <string name="applied_theme_msg">Style applied</string>
    <string name="applied_theme_msg">Style set successfully</string>

    <!-- Message shown when a clock has been applied successfully in the system [CHAR LIMIT=NONE] -->
    <string name="applied_clock_msg">Clock applied</string>
    <string name="applied_clock_msg">Clock set successfully</string>

    <!-- Message shown when a grid has been applied successfully in the system [CHAR LIMIT=NONE] -->
    <string name="applied_grid_msg">Grid set successfully</string>

    <!-- Message shown when a theme couldn't be applied in the system because of an error
        [CHAR LIMIT=NONE] -->
+5 −3
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ public class GridOptionsManager implements CustomizationManager<GridOption> {

    @Override
    public void fetchOptions(OptionsFetchedListener<GridOption> callback, boolean reload) {
        new FetchTask(mProvider, callback).execute();
        new FetchTask(mProvider, callback, reload).execute();
    }

    /** See if using surface view to render grid options */
@@ -74,16 +74,18 @@ public class GridOptionsManager implements CustomizationManager<GridOption> {
    private static class FetchTask extends AsyncTask<Void, Void, Pair<List<GridOption>, String>> {
        private final LauncherGridOptionsProvider mProvider;
        @Nullable private final OptionsFetchedListener<GridOption> mCallback;
        private final boolean mReload;

        private FetchTask(@NonNull LauncherGridOptionsProvider provider,
                @Nullable OptionsFetchedListener<GridOption> callback) {
                @Nullable OptionsFetchedListener<GridOption> callback, boolean reload) {
            mCallback = callback;
            mProvider = provider;
            mReload = reload;
        }

        @Override
        protected Pair<List<GridOption>, String> doInBackground(Void[] params) {
            return mProvider.fetch(false);
            return mProvider.fetch(mReload);
        }

        @Override
+50 −20
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -106,6 +107,41 @@ public class GridFragment extends AppbarFragment {
    private View mError;
    private BottomActionBar mBottomActionBar;
    private ThemesUserEventLogger mEventLogger;
    private boolean mReloadOptionsAfterApplying;

    private final Callback mApplyGridCallback = new Callback() {
        @Override
        public void onSuccess() {
            mGridManager.fetchOptions(new OptionsFetchedListener<GridOption>() {
                @Override
                public void onOptionsLoaded(List<GridOption> options) {
                    mOptionsController.resetOptions(options);
                    mSelectedOption = getSelectedOption(options);
                    mReloadOptionsAfterApplying = true;
                    // It will trigger OptionSelectedListener#onOptionSelected.
                    mOptionsController.setSelectedOption(mSelectedOption);
                    Toast.makeText(getContext(), R.string.applied_grid_msg, Toast.LENGTH_SHORT)
                            .show();
                    // Since we disabled it when clicked apply button.
                    mBottomActionBar.enableActions();
                    mBottomActionBar.hide();
                }

                @Override
                public void onError(@Nullable Throwable throwable) {
                    if (throwable != null) {
                        Log.e(TAG, "Error loading grid options", throwable);
                    }
                    showError();
                }
            }, true);
        }

        @Override
        public void onError(@Nullable Throwable throwable) {
            //TODO(chihhangchuang): handle
        }
    };

    @Override
    public void onAttach(Context context) {
@@ -176,17 +212,7 @@ public class GridFragment extends AppbarFragment {
        mBottomActionBar.setActionClickListener(CANCEL, unused -> getActivity().onBackPressed());
        mBottomActionBar.setActionClickListener(APPLY, unused -> {
            mBottomActionBar.disableActions();
            mGridManager.apply(mSelectedOption, new Callback() {
                @Override
                public void onSuccess() {
                    getActivity().finish();
                }

                @Override
                public void onError(@Nullable Throwable throwable) {
                    //TODO(santie): handle
                }
            });
            mGridManager.apply(mSelectedOption, mApplyGridCallback);
        });
    }

@@ -220,20 +246,16 @@ public class GridFragment extends AppbarFragment {

                mOptionsController.addListener(selected -> {
                    mSelectedOption = (GridOption) selected;
                    if (mReloadOptionsAfterApplying) {
                        mReloadOptionsAfterApplying = false;
                        return;
                    }
                    mBottomActionBar.show();
                    mEventLogger.logGridSelected(mSelectedOption);
                    createAdapter();
                });
                mOptionsController.initOptions(mGridManager);
                for (GridOption option : options) {
                    if (option.isActive(mGridManager)) {
                        mSelectedOption = option;
                    }
                }
                // For development only, as there should always be a grid set.
                if (mSelectedOption == null) {
                    mSelectedOption = options.get(0);
                }
                mSelectedOption = getSelectedOption(options);
                createAdapter();
            }

@@ -247,6 +269,14 @@ public class GridFragment extends AppbarFragment {
        }, false);
    }

    private GridOption getSelectedOption(List<GridOption> options) {
        return options.stream()
                .filter(option -> option.isActive(mGridManager))
                .findAny()
                // For development only, as there should always be a grid set.
                .orElse(options.get(0));
    }

    private void hideError() {
        mContent.setVisibility(View.VISIBLE);
        mError.setVisibility(View.GONE);