// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.app;

import androidx.annotation.CallSuper;
import com.google.android.play.core.splitcompat.SplitCompatApplication;
import io.flutter.FlutterInjector;
import io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager;

/**
 * Flutter's extension of {@link SplitCompatApplication} that injects a {@link
 * PlayStoreDeferredComponentManager} with {@link FlutterInjector} to enable Split AOT Flutter apps.
 *
 * <p>To use this class, either have your custom application class extend
 * FlutterPlayStoreSplitApplication or use it directly in the app's AndroidManifest.xml by adding
 * the following line:
 *
 * <pre>{@code
 * <manifest
 *    ...
 *    <application
 *       android:name="io.flutter.app.FlutterPlayStoreSplitApplication"
 *       ...>
 *    </application>
 *  </manifest>
 * }</pre>
 *
 * This class is meant to be used with the Google Play store. Custom non-play store applications do
 * not need to extend SplitCompatApplication and should inject a custom {@link
 * io.flutter.embedding.engine.deferredcomponents.DeferredComponentManager} implementation like so:
 *
 * <pre>{@code
 * FlutterInjector.setInstance(
 *      new FlutterInjector.Builder().setDeferredComponentManager(yourCustomManager).build());
 * }</pre>
 */
public class FlutterPlayStoreSplitApplication extends SplitCompatApplication {
  @Override
  @CallSuper
  public void onCreate() {
    super.onCreate();
    // Create and inject a PlayStoreDeferredComponentManager, which is the default manager for
    // interacting with the Google Play Store.
    PlayStoreDeferredComponentManager deferredComponentManager =
        new PlayStoreDeferredComponentManager(this, null);
    FlutterInjector.setInstance(
        new FlutterInjector.Builder()
            .setDeferredComponentManager(deferredComponentManager)
            .build());
  }
}
