зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1282003 - (Part 2) Add screenManagerHelper in Java. r=snorp
MozReview-Commit-ID: BLw6e7dgldt --HG-- extra : rebase_source : ee5b4bc83e055836b5a739e519d1873252ce6b53
This commit is contained in:
Родитель
458ea00ba1
Коммит
8ebc7fc433
|
@ -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);
|
||||
}
|
|
@ -648,6 +648,7 @@ gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
|
|||
'restrictions/RestrictionConfiguration.java',
|
||||
'restrictions/RestrictionProvider.java',
|
||||
'restrictions/Restrictions.java',
|
||||
'ScreenManagerHelper.java',
|
||||
'ScreenshotObserver.java',
|
||||
'search/SearchEngine.java',
|
||||
'search/SearchEngineManager.java',
|
||||
|
|
|
@ -89,6 +89,25 @@ const JNINativeMethod PresentationMediaPlayerManager::Natives<Impl>::methods[] =
|
|||
::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>
|
||||
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::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[] =
|
||||
"org/mozilla/gecko/Telemetry";
|
||||
|
||||
|
|
|
@ -397,6 +397,58 @@ public:
|
|||
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>
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -6,15 +6,21 @@
|
|||
|
||||
#define MOZ_FATAL_ASSERTIONS_FOR_THREAD_SAFETY
|
||||
|
||||
#include "mozilla/SyncRunnable.h"
|
||||
#include "nsScreenManagerAndroid.h"
|
||||
#include "nsWindow.h"
|
||||
#include "GeneratedJNIWrappers.h"
|
||||
#include "nsServiceManagerUtils.h"
|
||||
#include "AndroidRect.h"
|
||||
#include "FennecJNINatives.h"
|
||||
#include "nsAppShell.h"
|
||||
#include "nsThreadUtils.h"
|
||||
|
||||
#include <android/log.h>
|
||||
#include <mozilla/jni/Refs.h>
|
||||
|
||||
#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "nsScreenManagerAndroid", ## args)
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::java;
|
||||
|
||||
static uint32_t sScreenId = 0;
|
||||
const uint32_t PRIMARY_SCREEN_ID = 0;
|
||||
|
@ -121,10 +127,57 @@ 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)
|
||||
|
||||
nsScreenManagerAndroid::nsScreenManagerAndroid()
|
||||
{
|
||||
if (mozilla::jni::IsAvailable()) {
|
||||
ScreenManagerHelperSupport::Base::Init();
|
||||
}
|
||||
nsCOMPtr<nsIScreen> screen = AddScreen(DisplayType::DISPLAY_PRIMARY);
|
||||
MOZ_ASSERT(screen);
|
||||
}
|
||||
|
|
|
@ -48,6 +48,8 @@ private:
|
|||
~nsScreenManagerAndroid();
|
||||
|
||||
public:
|
||||
class ScreenManagerHelperSupport;
|
||||
|
||||
nsScreenManagerAndroid();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
|
Загрузка…
Ссылка в новой задаче