1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/profiles/profile_android.h"
6
7#include "base/android/jni_android.h"
8#include "chrome/browser/profiles/profile.h"
9#include "chrome/browser/profiles/profile_manager.h"
10#include "jni/Profile_jni.h"
11
12using base::android::AttachCurrentThread;
13
14namespace {
15const char kProfileAndroidKey[] = "profile_android";
16}  // namespace
17
18// static
19ProfileAndroid* ProfileAndroid::FromProfile(Profile* profile) {
20  if (!profile)
21    return NULL;
22
23  ProfileAndroid* profile_android = static_cast<ProfileAndroid*>(
24      profile->GetUserData(kProfileAndroidKey));
25  if (!profile_android) {
26    profile_android = new ProfileAndroid(profile);
27    profile->SetUserData(kProfileAndroidKey, profile_android);
28  }
29  return profile_android;
30}
31
32// static
33Profile* ProfileAndroid::FromProfileAndroid(jobject obj) {
34  if (!obj)
35    return NULL;
36
37  ProfileAndroid* profile_android = reinterpret_cast<ProfileAndroid*>(
38      Java_Profile_getNativePointer(AttachCurrentThread(), obj));
39  if (!profile_android)
40    return NULL;
41  return profile_android->profile_;
42}
43
44// static
45bool ProfileAndroid::RegisterProfileAndroid(JNIEnv* env) {
46  return RegisterNativesImpl(env);
47}
48
49// static
50jobject ProfileAndroid::GetLastUsedProfile(JNIEnv* env, jclass clazz) {
51  Profile* profile = ProfileManager::GetLastUsedProfile();
52  if (profile == NULL) {
53    NOTREACHED() << "Profile not found.";
54    return NULL;
55  }
56
57  ProfileAndroid* profile_android = ProfileAndroid::FromProfile(profile);
58  if (profile_android == NULL) {
59    NOTREACHED() << "ProfileAndroid not found.";
60    return NULL;
61  }
62
63  return profile_android->obj_.obj();
64}
65
66base::android::ScopedJavaLocalRef<jobject> ProfileAndroid::GetOriginalProfile(
67    JNIEnv* env, jobject obj) {
68  ProfileAndroid* original_profile = ProfileAndroid::FromProfile(
69      profile_->GetOriginalProfile());
70  DCHECK(original_profile);
71  return original_profile->GetJavaObject();
72}
73
74base::android::ScopedJavaLocalRef<jobject>
75ProfileAndroid::GetOffTheRecordProfile(JNIEnv* env, jobject obj) {
76  ProfileAndroid* otr_profile = ProfileAndroid::FromProfile(
77      profile_->GetOffTheRecordProfile());
78  DCHECK(otr_profile);
79  return otr_profile->GetJavaObject();
80}
81
82jboolean ProfileAndroid::HasOffTheRecordProfile(JNIEnv* env, jobject obj) {
83  return profile_->HasOffTheRecordProfile();
84}
85
86jboolean ProfileAndroid::IsOffTheRecord(JNIEnv* env, jobject obj) {
87  return profile_->IsOffTheRecord();
88}
89
90// static
91jobject GetLastUsedProfile(JNIEnv* env, jclass clazz) {
92  return ProfileAndroid::GetLastUsedProfile(env, clazz);
93}
94
95ProfileAndroid::ProfileAndroid(Profile* profile)
96    : profile_(profile) {
97  JNIEnv* env = AttachCurrentThread();
98  base::android::ScopedJavaLocalRef<jobject> jprofile =
99      Java_Profile_create(env, reinterpret_cast<intptr_t>(this));
100  obj_.Reset(env, jprofile.obj());
101}
102
103ProfileAndroid::~ProfileAndroid() {
104  Java_Profile_destroy(AttachCurrentThread(), obj_.obj());
105}
106
107base::android::ScopedJavaLocalRef<jobject> ProfileAndroid::GetJavaObject() {
108  return base::android::ScopedJavaLocalRef<jobject>(obj_);
109}
110