// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/input/android/scoped_input_transfer_token.h"

#include "base/android/android_input_receiver_compat.h"
#include "base/android/jni_android.h"

namespace input {

ScopedInputTransferToken::ScopedInputTransferToken(
    const jobject& input_transfer_token) {
  CHECK(base::AndroidInputReceiverCompat::IsSupportAvailable());
  JNIEnv* env = base::android::AttachCurrentThread();
  a_input_transfer_token_ =
      base::AndroidInputReceiverCompat::GetInstance()
          .AInputTransferToken_fromJavaFn(env, input_transfer_token);
}

ScopedInputTransferToken::ScopedInputTransferToken(AInputReceiver* receiver) {
  CHECK(base::AndroidInputReceiverCompat::IsSupportAvailable());
  a_input_transfer_token_ =
      base::AndroidInputReceiverCompat::GetInstance()
          .AInputReceiver_getInputTransferTokenFn(receiver);
}

ScopedInputTransferToken::~ScopedInputTransferToken() {
  DestroyIfNeeded();
}

ScopedInputTransferToken::ScopedInputTransferToken(
    ScopedInputTransferToken&& other)
    : a_input_transfer_token_(other.a_input_transfer_token_) {
  other.a_input_transfer_token_ = nullptr;
}

ScopedInputTransferToken& ScopedInputTransferToken::operator=(
    ScopedInputTransferToken&& other) {
  if (this != &other) {
    DestroyIfNeeded();
    a_input_transfer_token_ = other.a_input_transfer_token_;
    other.a_input_transfer_token_ = nullptr;
  }
  return *this;
}

void ScopedInputTransferToken::DestroyIfNeeded() {
  if (a_input_transfer_token_ == nullptr) {
    return;
  }
  base::AndroidInputReceiverCompat::GetInstance().AInputTransferToken_releaseFn(
      a_input_transfer_token_);
  a_input_transfer_token_ = nullptr;
}

}  // namespace input
