• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
12 using base::android::AttachCurrentThread;
13 
14 namespace {
15 const char kProfileAndroidKey[] = "profile_android";
16 }  // namespace
17 
18 // static
FromProfile(Profile * profile)19 ProfileAndroid* 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
FromProfileAndroid(jobject obj)33 Profile* 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
RegisterProfileAndroid(JNIEnv * env)45 bool ProfileAndroid::RegisterProfileAndroid(JNIEnv* env) {
46   return RegisterNativesImpl(env);
47 }
48 
49 // static
GetLastUsedProfile(JNIEnv * env,jclass clazz)50 jobject 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 
GetOriginalProfile(JNIEnv * env,jobject obj)66 base::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 
74 base::android::ScopedJavaLocalRef<jobject>
GetOffTheRecordProfile(JNIEnv * env,jobject obj)75 ProfileAndroid::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 
HasOffTheRecordProfile(JNIEnv * env,jobject obj)82 jboolean ProfileAndroid::HasOffTheRecordProfile(JNIEnv* env, jobject obj) {
83   return profile_->HasOffTheRecordProfile();
84 }
85 
IsOffTheRecord(JNIEnv * env,jobject obj)86 jboolean ProfileAndroid::IsOffTheRecord(JNIEnv* env, jobject obj) {
87   return profile_->IsOffTheRecord();
88 }
89 
90 // static
GetLastUsedProfile(JNIEnv * env,jclass clazz)91 jobject GetLastUsedProfile(JNIEnv* env, jclass clazz) {
92   return ProfileAndroid::GetLastUsedProfile(env, clazz);
93 }
94 
ProfileAndroid(Profile * profile)95 ProfileAndroid::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 
~ProfileAndroid()103 ProfileAndroid::~ProfileAndroid() {
104   Java_Profile_destroy(AttachCurrentThread(), obj_.obj());
105 }
106 
GetJavaObject()107 base::android::ScopedJavaLocalRef<jobject> ProfileAndroid::GetJavaObject() {
108   return base::android::ScopedJavaLocalRef<jobject>(obj_);
109 }
110