зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1282003 - (Part 2) Add screenManagerHelper in Java. r=snorp
MozReview-Commit-ID: BLw6e7dgldt --HG-- extra : transplant_source : %A9bl%C1%95q%C8Zv%93%191%9B%CA%2B%0C%CA%2BU%FB
This commit is contained in:
Родитель
6a5aa3945f
Коммит
2a9698fad6
|
@ -0,0 +1,43 @@
|
||||||
|
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||||
|
* vim: ts=4 sw=4 expandtab:
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.gecko;
|
||||||
|
|
||||||
|
import org.mozilla.gecko.annotation.WrapForJNI;
|
||||||
|
|
||||||
|
class ScreenManagerHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following display types use the same definition in nsIScreen.idl
|
||||||
|
*/
|
||||||
|
final static int DISPLAY_PRIMARY = 0; // primary screen
|
||||||
|
final static int DISPLAY_EXTERNAL = 1; // wired displays, such as HDMI, DisplayPort, etc.
|
||||||
|
final static int DISPLAY_VIRTUAL = 2; // wireless displays, such as Chromecast, WiFi-Display, etc.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new nsScreen when a new display in Android is available.
|
||||||
|
*
|
||||||
|
* @param displayType the display type of the nsScreen would be added
|
||||||
|
* @param width the width of the new nsScreen
|
||||||
|
* @param height the height of the new nsScreen
|
||||||
|
* @param density the density of the new nsScreen
|
||||||
|
*
|
||||||
|
* @return return the ID of the added nsScreen
|
||||||
|
*/
|
||||||
|
@WrapForJNI
|
||||||
|
public native static int addDisplay(int displayType,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
float density);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the nsScreen by the specific screen ID.
|
||||||
|
*
|
||||||
|
* @param screenId the ID of the screen would be removed.
|
||||||
|
*/
|
||||||
|
@WrapForJNI
|
||||||
|
public native static void removeDisplay(int screenId);
|
||||||
|
}
|
|
@ -634,6 +634,7 @@ gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
|
||||||
'restrictions/RestrictionConfiguration.java',
|
'restrictions/RestrictionConfiguration.java',
|
||||||
'restrictions/RestrictionProvider.java',
|
'restrictions/RestrictionProvider.java',
|
||||||
'restrictions/Restrictions.java',
|
'restrictions/Restrictions.java',
|
||||||
|
'ScreenManagerHelper.java',
|
||||||
'ScreenshotObserver.java',
|
'ScreenshotObserver.java',
|
||||||
'search/SearchEngine.java',
|
'search/SearchEngine.java',
|
||||||
'search/SearchEngineManager.java',
|
'search/SearchEngineManager.java',
|
||||||
|
|
|
@ -89,6 +89,25 @@ const JNINativeMethod PresentationMediaPlayerManager::Natives<Impl>::methods[] =
|
||||||
::template Wrap<&Impl::RemovePresentationSurface>)
|
::template Wrap<&Impl::RemovePresentationSurface>)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class Impl>
|
||||||
|
class ScreenManagerHelper::Natives : public mozilla::jni::NativeImpl<ScreenManagerHelper, Impl>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const JNINativeMethod methods[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class Impl>
|
||||||
|
const JNINativeMethod ScreenManagerHelper::Natives<Impl>::methods[] = {
|
||||||
|
|
||||||
|
mozilla::jni::MakeNativeMethod<ScreenManagerHelper::AddDisplay_t>(
|
||||||
|
mozilla::jni::NativeStub<ScreenManagerHelper::AddDisplay_t, Impl>
|
||||||
|
::template Wrap<&Impl::AddDisplay>),
|
||||||
|
|
||||||
|
mozilla::jni::MakeNativeMethod<ScreenManagerHelper::RemoveDisplay_t>(
|
||||||
|
mozilla::jni::NativeStub<ScreenManagerHelper::RemoveDisplay_t, Impl>
|
||||||
|
::template Wrap<&Impl::RemoveDisplay>)
|
||||||
|
};
|
||||||
|
|
||||||
template<class Impl>
|
template<class Impl>
|
||||||
class Telemetry::Natives : public mozilla::jni::NativeImpl<Telemetry, Impl>
|
class Telemetry::Natives : public mozilla::jni::NativeImpl<Telemetry, Impl>
|
||||||
{
|
{
|
||||||
|
|
|
@ -121,6 +121,15 @@ constexpr char PresentationMediaPlayerManager::InvalidateAndScheduleComposite_t:
|
||||||
constexpr char PresentationMediaPlayerManager::RemovePresentationSurface_t::name[];
|
constexpr char PresentationMediaPlayerManager::RemovePresentationSurface_t::name[];
|
||||||
constexpr char PresentationMediaPlayerManager::RemovePresentationSurface_t::signature[];
|
constexpr char PresentationMediaPlayerManager::RemovePresentationSurface_t::signature[];
|
||||||
|
|
||||||
|
const char ScreenManagerHelper::name[] =
|
||||||
|
"org/mozilla/gecko/ScreenManagerHelper";
|
||||||
|
|
||||||
|
constexpr char ScreenManagerHelper::AddDisplay_t::name[];
|
||||||
|
constexpr char ScreenManagerHelper::AddDisplay_t::signature[];
|
||||||
|
|
||||||
|
constexpr char ScreenManagerHelper::RemoveDisplay_t::name[];
|
||||||
|
constexpr char ScreenManagerHelper::RemoveDisplay_t::signature[];
|
||||||
|
|
||||||
const char Telemetry::name[] =
|
const char Telemetry::name[] =
|
||||||
"org/mozilla/gecko/Telemetry";
|
"org/mozilla/gecko/Telemetry";
|
||||||
|
|
||||||
|
|
|
@ -397,6 +397,58 @@ public:
|
||||||
template<class Impl> class Natives;
|
template<class Impl> class Natives;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ScreenManagerHelper : public mozilla::jni::ObjectBase<ScreenManagerHelper>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const char name[];
|
||||||
|
|
||||||
|
explicit ScreenManagerHelper(const Context& ctx) : ObjectBase<ScreenManagerHelper>(ctx) {}
|
||||||
|
|
||||||
|
struct AddDisplay_t {
|
||||||
|
typedef ScreenManagerHelper Owner;
|
||||||
|
typedef int32_t ReturnType;
|
||||||
|
typedef int32_t SetterType;
|
||||||
|
typedef mozilla::jni::Args<
|
||||||
|
int32_t,
|
||||||
|
int32_t,
|
||||||
|
int32_t,
|
||||||
|
float> Args;
|
||||||
|
static constexpr char name[] = "addDisplay";
|
||||||
|
static constexpr char signature[] =
|
||||||
|
"(IIIF)I";
|
||||||
|
static const bool isStatic = true;
|
||||||
|
static const mozilla::jni::ExceptionMode exceptionMode =
|
||||||
|
mozilla::jni::ExceptionMode::ABORT;
|
||||||
|
static const mozilla::jni::CallingThread callingThread =
|
||||||
|
mozilla::jni::CallingThread::ANY;
|
||||||
|
static const mozilla::jni::DispatchTarget dispatchTarget =
|
||||||
|
mozilla::jni::DispatchTarget::CURRENT;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RemoveDisplay_t {
|
||||||
|
typedef ScreenManagerHelper Owner;
|
||||||
|
typedef void ReturnType;
|
||||||
|
typedef void SetterType;
|
||||||
|
typedef mozilla::jni::Args<
|
||||||
|
int32_t> Args;
|
||||||
|
static constexpr char name[] = "removeDisplay";
|
||||||
|
static constexpr char signature[] =
|
||||||
|
"(I)V";
|
||||||
|
static const bool isStatic = true;
|
||||||
|
static const mozilla::jni::ExceptionMode exceptionMode =
|
||||||
|
mozilla::jni::ExceptionMode::ABORT;
|
||||||
|
static const mozilla::jni::CallingThread callingThread =
|
||||||
|
mozilla::jni::CallingThread::ANY;
|
||||||
|
static const mozilla::jni::DispatchTarget dispatchTarget =
|
||||||
|
mozilla::jni::DispatchTarget::CURRENT;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const mozilla::jni::CallingThread callingThread =
|
||||||
|
mozilla::jni::CallingThread::ANY;
|
||||||
|
|
||||||
|
template<class Impl> class Natives;
|
||||||
|
};
|
||||||
|
|
||||||
class Telemetry : public mozilla::jni::ObjectBase<Telemetry>
|
class Telemetry : public mozilla::jni::ObjectBase<Telemetry>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -6,16 +6,23 @@
|
||||||
|
|
||||||
#define MOZ_FATAL_ASSERTIONS_FOR_THREAD_SAFETY
|
#define MOZ_FATAL_ASSERTIONS_FOR_THREAD_SAFETY
|
||||||
|
|
||||||
|
#include "mozilla/SyncRunnable.h"
|
||||||
#include "nsScreenManagerAndroid.h"
|
#include "nsScreenManagerAndroid.h"
|
||||||
#include "nsWindow.h"
|
#include "nsServiceManagerUtils.h"
|
||||||
#include "GeneratedJNIWrappers.h"
|
|
||||||
#include "AndroidBridge.h"
|
#include "AndroidBridge.h"
|
||||||
#include "AndroidRect.h"
|
#include "AndroidRect.h"
|
||||||
|
#include "FennecJNINatives.h"
|
||||||
|
#include "FennecJNIWrappers.h"
|
||||||
|
#include "nsAppShell.h"
|
||||||
|
#include "nsThreadUtils.h"
|
||||||
|
|
||||||
|
#include <android/log.h>
|
||||||
#include <mozilla/jni/Refs.h>
|
#include <mozilla/jni/Refs.h>
|
||||||
|
|
||||||
#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "nsScreenManagerAndroid", ## args)
|
#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "nsScreenManagerAndroid", ## args)
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
|
using namespace mozilla::java;
|
||||||
|
|
||||||
static uint32_t sScreenId = 0;
|
static uint32_t sScreenId = 0;
|
||||||
const uint32_t PRIMARY_SCREEN_ID = 0;
|
const uint32_t PRIMARY_SCREEN_ID = 0;
|
||||||
|
@ -109,10 +116,55 @@ nsScreenAndroid::ApplyMinimumBrightness(uint32_t aBrightness)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class nsScreenManagerAndroid::ScreenManagerHelperSupport final
|
||||||
|
: public ScreenManagerHelper::Natives<ScreenManagerHelperSupport>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef ScreenManagerHelper::Natives<ScreenManagerHelperSupport> Base;
|
||||||
|
|
||||||
|
static int32_t AddDisplay(int32_t aDisplayType, int32_t aWidth, int32_t aHeight, float aDensity) {
|
||||||
|
int32_t screenId = -1; // return value
|
||||||
|
nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
|
||||||
|
SyncRunnable::DispatchToThread(mainThread, NS_NewRunnableFunction(
|
||||||
|
[&aDisplayType, &aWidth, &aHeight, &aDensity, &screenId] {
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
nsCOMPtr<nsIScreenManager> screenMgr =
|
||||||
|
do_GetService("@mozilla.org/gfx/screenmanager;1");
|
||||||
|
MOZ_ASSERT(screenMgr, "Failed to get nsIScreenManager");
|
||||||
|
|
||||||
|
RefPtr<nsScreenManagerAndroid> screenMgrAndroid =
|
||||||
|
(nsScreenManagerAndroid*) screenMgr.get();
|
||||||
|
RefPtr<nsScreenAndroid> screen =
|
||||||
|
screenMgrAndroid->AddScreen(static_cast<DisplayType>(aDisplayType),
|
||||||
|
nsIntRect(0, 0, aWidth, aHeight));
|
||||||
|
MOZ_ASSERT(screen);
|
||||||
|
screen->SetDensity(aDensity);
|
||||||
|
screenId = static_cast<int32_t>(screen->GetId());
|
||||||
|
}).take());
|
||||||
|
return screenId;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RemoveDisplay(int32_t aScreenId) {
|
||||||
|
nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
|
||||||
|
SyncRunnable::DispatchToThread(mainThread, NS_NewRunnableFunction(
|
||||||
|
[&aScreenId] {
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
nsCOMPtr<nsIScreenManager> screenMgr =
|
||||||
|
do_GetService("@mozilla.org/gfx/screenmanager;1");
|
||||||
|
MOZ_ASSERT(screenMgr, "Failed to get nsIScreenManager");
|
||||||
|
|
||||||
|
RefPtr<nsScreenManagerAndroid> screenMgrAndroid =
|
||||||
|
(nsScreenManagerAndroid*) screenMgr.get();
|
||||||
|
screenMgrAndroid->RemoveScreen(aScreenId);
|
||||||
|
}).take());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS(nsScreenManagerAndroid, nsIScreenManager)
|
NS_IMPL_ISUPPORTS(nsScreenManagerAndroid, nsIScreenManager)
|
||||||
|
|
||||||
nsScreenManagerAndroid::nsScreenManagerAndroid()
|
nsScreenManagerAndroid::nsScreenManagerAndroid()
|
||||||
{
|
{
|
||||||
|
ScreenManagerHelperSupport::Base::Init();
|
||||||
nsCOMPtr<nsIScreen> screen = AddScreen(DisplayType::DISPLAY_PRIMARY);
|
nsCOMPtr<nsIScreen> screen = AddScreen(DisplayType::DISPLAY_PRIMARY);
|
||||||
MOZ_ASSERT(screen);
|
MOZ_ASSERT(screen);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,8 @@ private:
|
||||||
~nsScreenManagerAndroid();
|
~nsScreenManagerAndroid();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
class ScreenManagerHelperSupport;
|
||||||
|
|
||||||
nsScreenManagerAndroid();
|
nsScreenManagerAndroid();
|
||||||
|
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
Загрузка…
Ссылка в новой задаче