// https://github.com/GoogleChrome/android-browser-helper/blob/main/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/ServiceConnection.java
//
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package io.swan.rnbrowser.helpers;

import android.content.ComponentName;

import androidx.annotation.NonNull;
import androidx.browser.customtabs.CustomTabsClient;
import androidx.browser.customtabs.CustomTabsServiceConnection;

import java.lang.ref.WeakReference;

/**
 * Implementation for the CustomTabsServiceConnection that avoids leaking the
 * ServiceConnectionCallback
 */
public class ServiceConnection extends CustomTabsServiceConnection {
  // A weak reference to the ServiceConnectionCallback to avoid leaking it.
  private final WeakReference<ServiceConnectionCallback> mConnectionCallback;

  public ServiceConnection(ServiceConnectionCallback connectionCallback) {
    mConnectionCallback = new WeakReference<>(connectionCallback);
  }

  @Override
  public void onCustomTabsServiceConnected(@NonNull ComponentName name,
                                           @NonNull CustomTabsClient client) {
    ServiceConnectionCallback connectionCallback = mConnectionCallback.get();

    if (connectionCallback != null) {
      connectionCallback.onServiceConnected(client);
    }
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
    ServiceConnectionCallback connectionCallback = mConnectionCallback.get();

    if (connectionCallback != null) {
      connectionCallback.onServiceDisconnected();
    }
  }
}
