京东到家.apk(点击下载) / FlutterBoostFragment.java


package com.jddj.jddjhybirdrouter.containers;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.jddj.jddjhybirdrouter.Assert;
import com.jddj.jddjhybirdrouter.FlutterBoost;
import com.jddj.jddjhybirdrouter.FlutterBoostUtils;
import io.flutter.Log;
import io.flutter.embedding.android.FlutterFragment;
import io.flutter.embedding.android.FlutterTextureView;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.android.RenderMode;
import io.flutter.embedding.android.TransparencyMode;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.platform.PlatformPlugin;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class FlutterBoostFragment extends FlutterFragment implements FlutterViewContainer {
    private static final boolean DEBUG = false;
    private static final String TAG = "FlutterBoostFragment";
    private FlutterView flutterView;
    private boolean isAttached = false;
    private boolean isFinishing = false;
    private PlatformPlugin platformPlugin;
    private LifecycleStage stage;
    private final FlutterTextureHooker textureHooker = new FlutterTextureHooker();
    private final String who = UUID.randomUUID().toString();

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public void detachFromFlutterEngine() {
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public String getCachedEngineId() {
        return FlutterBoost.ENGINE_ID;
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public PlatformPlugin providePlatformPlugin(Activity activity, FlutterEngine flutterEngine) {
        return null;
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public boolean shouldDestroyEngineWithHost() {
        return false;
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        this.stage = LifecycleStage.ON_CREATE;
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onStart() {
        super.onStart();
    }

    @Override // androidx.fragment.app.Fragment
    public void onDestroy() {
        super.onDestroy();
        this.stage = LifecycleStage.ON_DESTROY;
        this.textureHooker.onFlutterTextureViewRelease();
        detachFromEngineIfNeeded();
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
        FlutterBoost.instance().getPlugin().onContainerCreated(this);
        View onCreateView = super.onCreateView(layoutInflater, viewGroup, bundle);
        this.flutterView = FlutterBoostUtils.findFlutterView(onCreateView);
        this.flutterView.detachFromFlutterEngine();
        return onCreateView;
    }

    @Override // androidx.fragment.app.Fragment
    public void onHiddenChanged(boolean z) {
        super.onHiddenChanged(z);
        if (this.flutterView != null) {
            if (z) {
                didFragmentHide();
            } else {
                didFragmentShow();
            }
        }
    }

    @Override // androidx.fragment.app.Fragment
    public void setUserVisibleHint(boolean z) {
        super.setUserVisibleHint(z);
        if (this.flutterView != null) {
            if (z) {
                didFragmentShow();
            } else {
                didFragmentHide();
            }
        }
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onResume() {
        super.onResume();
        if (Build.VERSION.SDK_INT == 29) {
            FlutterContainerManager instance = FlutterContainerManager.instance();
            FlutterViewContainer topActivityContainer = instance.getTopActivityContainer();
            if (instance.isActiveContainer(this) && topActivityContainer != null && topActivityContainer != getContextActivity() && !topActivityContainer.isOpaque() && topActivityContainer.isPausing()) {
                Log.w(TAG, "Skip the unexpected activity lifecycle event on Android Q. See https://issuetracker.google.com/issues/185693011 for more details.");
                return;
            }
        }
        this.stage = LifecycleStage.ON_RESUME;
        if (!isHidden()) {
            didFragmentShow();
            getFlutterEngine().getLifecycleChannel().appIsResumed();
            Assert.assertNotNull(this.platformPlugin);
            this.platformPlugin.updateSystemUiOverlays();
        }
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public RenderMode getRenderMode() {
        return RenderMode.texture;
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onPause() {
        FlutterViewContainer topActivityContainer;
        super.onPause();
        if (Build.VERSION.SDK_INT != 29 || (topActivityContainer = FlutterContainerManager.instance().getTopActivityContainer()) == null || topActivityContainer == getContextActivity() || topActivityContainer.isOpaque() || !topActivityContainer.isPausing()) {
            this.stage = LifecycleStage.ON_PAUSE;
            didFragmentHide();
            getFlutterEngine().getLifecycleChannel().appIsResumed();
            return;
        }
        Log.w(TAG, "Skip the unexpected activity lifecycle event on Android Q. See https://issuetracker.google.com/issues/185693011 for more details.");
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onStop() {
        super.onStop();
        this.stage = LifecycleStage.ON_STOP;
        getFlutterEngine().getLifecycleChannel().appIsResumed();
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onDestroyView() {
        super.onDestroyView();
        FlutterBoost.instance().getPlugin().onContainerDestroyed(this);
    }

    @Override // androidx.fragment.app.Fragment, io.flutter.embedding.android.FlutterFragment
    public void onDetach() {
        FlutterEngine flutterEngine = getFlutterEngine();
        super.onDetach();
        flutterEngine.getLifecycleChannel().appIsResumed();
    }

    @Override // io.flutter.embedding.android.FlutterFragment
    public void onUserLeaveHint() {
        super.onUserLeaveHint();
    }

    @Override // io.flutter.embedding.android.FlutterFragment
    public void onBackPressed() {
        FlutterBoost.instance().getPlugin().onBackPressed();
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public boolean shouldRestoreAndSaveState() {
        if (getArguments().containsKey(FlutterActivityLaunchConfigs.EXTRA_ENABLE_STATE_RESTORATION)) {
            return getArguments().getBoolean(FlutterActivityLaunchConfigs.EXTRA_ENABLE_STATE_RESTORATION);
        }
        return true;
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public void onFlutterTextureViewCreated(FlutterTextureView flutterTextureView) {
        super.onFlutterTextureViewCreated(flutterTextureView);
        this.textureHooker.hookFlutterTextureView(flutterTextureView);
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public Activity getContextActivity() {
        return getActivity();
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public void finishContainer(Map<String, Object> map) {
        this.isFinishing = true;
        if (map != null) {
            Intent intent = new Intent();
            intent.putExtra(FlutterActivityLaunchConfigs.ACTIVITY_RESULT_KEY, new HashMap(map));
            getActivity().setResult(-1, intent);
        }
        getActivity().finish();
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public String getUrl() {
        if (getArguments().containsKey("url")) {
            return getArguments().getString("url");
        }
        throw new RuntimeException("Oops! The fragment url are *MISSED*! You should override the |getUrl|, or set url via CachedEngineFragmentBuilder.");
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public Map<String, Object> getUrlParams() {
        return (HashMap) getArguments().getSerializable(FlutterActivityLaunchConfigs.EXTRA_URL_PARAM);
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public String getUniqueId() {
        return getArguments().getString(FlutterActivityLaunchConfigs.EXTRA_UNIQUE_ID, this.who);
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public boolean isPausing() {
        return (this.stage == LifecycleStage.ON_PAUSE || this.stage == LifecycleStage.ON_STOP) && !this.isFinishing;
    }

    private void didFragmentShow() {
        FlutterViewContainer topContainer = FlutterContainerManager.instance().getTopContainer();
        if (!(topContainer == null || topContainer == this)) {
            topContainer.detachFromEngineIfNeeded();
        }
        FlutterBoost.instance().getPlugin().onContainerAppeared(this);
        performAttach();
        this.textureHooker.onFlutterTextureViewRestoreState();
    }

    private void didFragmentHide() {
        FlutterBoost.instance().getPlugin().onContainerDisappeared(this);
    }

    @Override // androidx.fragment.app.Fragment
    private void performAttach() {
        if (!this.isAttached) {
            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
            if (this.platformPlugin == null) {
                this.platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());
            }
            this.flutterView.attachToFlutterEngine(getFlutterEngine());
            this.isAttached = true;
        }
    }

    @Override // androidx.fragment.app.Fragment
    private void performDetach() {
        if (this.isAttached) {
            getFlutterEngine().getActivityControlSurface().detachFromActivity();
            releasePlatformChannel();
            this.flutterView.detachFromFlutterEngine();
            this.isAttached = false;
        }
    }

    private void releasePlatformChannel() {
        PlatformPlugin platformPlugin2 = this.platformPlugin;
        if (platformPlugin2 != null) {
            platformPlugin2.destroy();
            this.platformPlugin = null;
        }
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public void detachFromEngineIfNeeded() {
        performDetach();
    }

    @Override // io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.Host, io.flutter.embedding.android.FlutterFragment
    public TransparencyMode getTransparencyMode() {
        return TransparencyMode.valueOf(getArguments().getString("flutterview_transparency_mode", TransparencyMode.opaque.name()));
    }

    @Override // com.jddj.jddjhybirdrouter.containers.FlutterViewContainer
    public boolean isOpaque() {
        return getTransparencyMode() == TransparencyMode.opaque;
    }

    public static class CachedEngineFragmentBuilder {
        private boolean destroyEngineWithFragment;
        private final Class<? extends FlutterBoostFragment> fragmentClass;
        private HashMap<String, Object> params;
        private RenderMode renderMode;
        private boolean shouldAttachEngineToActivity;
        private TransparencyMode transparencyMode;
        private String uniqueId;
        private String url;

        public CachedEngineFragmentBuilder() {
            this(FlutterBoostFragment.class);
        }

        public CachedEngineFragmentBuilder(Class<? extends FlutterBoostFragment> cls) {
            this.destroyEngineWithFragment = false;
            this.renderMode = RenderMode.surface;
            this.transparencyMode = TransparencyMode.opaque;
            this.shouldAttachEngineToActivity = true;
            this.url = "/";
            this.fragmentClass = cls;
        }

        public CachedEngineFragmentBuilder url(String str) {
            this.url = str;
            return this;
        }

        public CachedEngineFragmentBuilder urlParams(Map<String, Object> map) {
            this.params = map instanceof HashMap ? (HashMap) map : new HashMap<>(map);
            return this;
        }

        public CachedEngineFragmentBuilder uniqueId(String str) {
            this.uniqueId = str;
            return this;
        }

        public CachedEngineFragmentBuilder destroyEngineWithFragment(boolean z) {
            this.destroyEngineWithFragment = z;
            return this;
        }

        public CachedEngineFragmentBuilder renderMode(RenderMode renderMode2) {
            this.renderMode = renderMode2;
            return this;
        }

        public CachedEngineFragmentBuilder transparencyMode(TransparencyMode transparencyMode2) {
            this.transparencyMode = transparencyMode2;
            return this;
        }

        public CachedEngineFragmentBuilder shouldAttachEngineToActivity(boolean z) {
            this.shouldAttachEngineToActivity = z;
            return this;
        }

        /* access modifiers changed from: protected */
        public Bundle createArgs() {
            Bundle bundle = new Bundle();
            bundle.putString(FlutterActivityLaunchConfigs.EXTRA_CACHED_ENGINE_ID, FlutterBoost.ENGINE_ID);
            bundle.putBoolean("destroy_engine_with_fragment", this.destroyEngineWithFragment);
            RenderMode renderMode2 = this.renderMode;
            if (renderMode2 == null) {
                renderMode2 = RenderMode.surface;
            }
            bundle.putString("flutterview_render_mode", renderMode2.name());
            TransparencyMode transparencyMode2 = this.transparencyMode;
            if (transparencyMode2 == null) {
                transparencyMode2 = TransparencyMode.transparent;
            }
            bundle.putString("flutterview_transparency_mode", transparencyMode2.name());
            bundle.putBoolean("should_attach_engine_to_activity", this.shouldAttachEngineToActivity);
            bundle.putString("url", this.url);
            bundle.putSerializable(FlutterActivityLaunchConfigs.EXTRA_URL_PARAM, this.params);
            String str = this.uniqueId;
            if (str == null) {
                str = FlutterBoostUtils.createUniqueId(this.url);
            }
            bundle.putString(FlutterActivityLaunchConfigs.EXTRA_UNIQUE_ID, str);
            return bundle;
        }

        public <T extends FlutterBoostFragment> T build() {
            try {
                T t = (T) ((FlutterBoostFragment) this.fragmentClass.getDeclaredConstructor(new Class[0]).newInstance(new Object[0]));
                if (t != null) {
                    t.setArguments(createArgs());
                    return t;
                }
                throw new RuntimeException("The FlutterFragment subclass sent in the constructor (" + this.fragmentClass.getCanonicalName() + ") does not match the expected return type.");
            } catch (Exception e) {
                throw new RuntimeException("Could not instantiate FlutterFragment subclass (" + this.fragmentClass.getName() + ")", e);
            }
        }
    }
}