12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/web_contents_delegate_android/color_chooser_android.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/android/jni_array.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/android/jni_string.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/android/content_view_core.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/color_suggestion.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/ColorChooserAndroid_jni.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString;
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace web_contents_delegate_android {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ColorChooserAndroid::ColorChooserAndroid(
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content::WebContents* web_contents,
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SkColor initial_color,
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::vector<content::ColorSuggestion>& suggestions)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : web_contents_(web_contents) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::ContentViewCore* content_view_core =
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::ContentViewCore::FromWebContents(web_contents);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(content_view_core);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> suggestions_array;
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (suggestions.size() > 0) {
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    suggestions_array = Java_ColorChooserAndroid_createColorSuggestionArray(
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        env, suggestions.size());
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for (size_t i = 0; i < suggestions.size(); ++i) {
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const content::ColorSuggestion& suggestion = suggestions[i];
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ScopedJavaLocalRef<jstring> label = ConvertUTF16ToJavaString(
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          env, suggestion.label);
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      Java_ColorChooserAndroid_addToColorSuggestionArray(
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          env,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          suggestions_array.obj(),
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          i,
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          suggestion.color,
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          label.obj());
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  j_color_chooser_.Reset(Java_ColorChooserAndroid_createColorChooserAndroid(
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<intptr_t>(this),
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_view_core->GetJavaObject().obj(),
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      initial_color,
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      suggestions_array.obj()));
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ColorChooserAndroid::~ColorChooserAndroid() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ColorChooserAndroid::End() {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!j_color_chooser_.is_null()) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env = AttachCurrentThread();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Java_ColorChooserAndroid_closeColorChooser(env, j_color_chooser_.obj());
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ColorChooserAndroid::SetSelectedColor(SkColor color) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Not implemented since the color is set on the java side only, in theory
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it can be set from JS which would override the user selection but
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we don't support that for now.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ColorChooserAndroid::OnColorChosen(JNIEnv* env, jobject obj, jint color) {
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  web_contents_->DidChooseColorInColorChooser(color);
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  web_contents_->DidEndColorChooser();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ----------------------------------------------------------------------------
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Native JNI methods
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ----------------------------------------------------------------------------
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RegisterColorChooserAndroid(JNIEnv* env) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RegisterNativesImpl(env);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace web_contents_delegate_android
83