Bug 1282003 - (Part 1) Add display type/density info and addScreen/removeScreen function. r=snorp
MozReview-Commit-ID: 52IoWc1xevL
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
/* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set sw=4 ts=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/. */
|
||||
|
||||
@@ -8,13 +9,27 @@
|
||||
#include "nsScreenManagerAndroid.h"
|
||||
#include "nsWindow.h"
|
||||
#include "GeneratedJNIWrappers.h"
|
||||
#include "AndroidBridge.h"
|
||||
#include "AndroidRect.h"
|
||||
#include <mozilla/jni/Refs.h>
|
||||
|
||||
#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "nsScreenManagerAndroid", ## args)
|
||||
|
||||
using namespace mozilla;
|
||||
|
||||
nsScreenAndroid::nsScreenAndroid(void *nativeScreen)
|
||||
static uint32_t sScreenId = 0;
|
||||
const uint32_t PRIMARY_SCREEN_ID = 0;
|
||||
|
||||
nsScreenAndroid::nsScreenAndroid(DisplayType aDisplayType, nsIntRect aRect)
|
||||
: mId(sScreenId++)
|
||||
, mDisplayType(aDisplayType)
|
||||
, mRect(aRect)
|
||||
, mDensity(mozilla::java::GeckoAppShell::GetDensity())
|
||||
{
|
||||
// ensure that the ID of the primary screen would be PRIMARY_SCREEN_ID.
|
||||
if (mDisplayType == DisplayType::DISPLAY_PRIMARY) {
|
||||
mId = PRIMARY_SCREEN_ID;
|
||||
}
|
||||
}
|
||||
|
||||
nsScreenAndroid::~nsScreenAndroid()
|
||||
@@ -24,13 +39,22 @@ nsScreenAndroid::~nsScreenAndroid()
|
||||
NS_IMETHODIMP
|
||||
nsScreenAndroid::GetId(uint32_t *outId)
|
||||
{
|
||||
*outId = 1;
|
||||
*outId = mId;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsScreenAndroid::GetRect(int32_t *outLeft, int32_t *outTop, int32_t *outWidth, int32_t *outHeight)
|
||||
{
|
||||
if (mDisplayType != DisplayType::DISPLAY_PRIMARY) {
|
||||
*outLeft = mRect.x;
|
||||
*outTop = mRect.y;
|
||||
*outWidth = mRect.width;
|
||||
*outHeight = mRect.height;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!mozilla::jni::IsAvailable()) {
|
||||
// xpcshell most likely
|
||||
*outLeft = *outTop = *outWidth = *outHeight = 0;
|
||||
@@ -75,11 +99,13 @@ nsScreenAndroid::GetColorDepth(int32_t *aColorDepth)
|
||||
return GetPixelDepth(aColorDepth);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsScreenAndroid::ApplyMinimumBrightness(uint32_t aBrightness)
|
||||
{
|
||||
if (mozilla::jni::IsAvailable()) {
|
||||
java::GeckoAppShell::SetKeepScreenOn(aBrightness == BRIGHTNESS_FULL);
|
||||
if (mDisplayType == DisplayType::DISPLAY_PRIMARY &&
|
||||
mozilla::jni::IsAvailable()) {
|
||||
java::GeckoAppShell::SetKeepScreenOn(aBrightness == BRIGHTNESS_FULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +113,8 @@ NS_IMPL_ISUPPORTS(nsScreenManagerAndroid, nsIScreenManager)
|
||||
|
||||
nsScreenManagerAndroid::nsScreenManagerAndroid()
|
||||
{
|
||||
mOneScreen = new nsScreenAndroid(nullptr);
|
||||
nsCOMPtr<nsIScreen> screen = AddScreen(DisplayType::DISPLAY_PRIMARY);
|
||||
MOZ_ASSERT(screen);
|
||||
}
|
||||
|
||||
nsScreenManagerAndroid::~nsScreenManagerAndroid()
|
||||
@@ -97,7 +124,7 @@ nsScreenManagerAndroid::~nsScreenManagerAndroid()
|
||||
NS_IMETHODIMP
|
||||
nsScreenManagerAndroid::GetPrimaryScreen(nsIScreen **outScreen)
|
||||
{
|
||||
NS_IF_ADDREF(*outScreen = mOneScreen.get());
|
||||
ScreenForId(PRIMARY_SCREEN_ID, outScreen);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -105,7 +132,16 @@ NS_IMETHODIMP
|
||||
nsScreenManagerAndroid::ScreenForId(uint32_t aId,
|
||||
nsIScreen **outScreen)
|
||||
{
|
||||
return GetPrimaryScreen(outScreen);
|
||||
for (size_t i = 0; i < mScreens.Length(); ++i) {
|
||||
if (aId == mScreens[i]->GetId()) {
|
||||
nsCOMPtr<nsIScreen> screen = (nsIScreen*) mScreens[i];
|
||||
screen.forget(outScreen);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
*outScreen = nullptr;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@@ -115,19 +151,21 @@ nsScreenManagerAndroid::ScreenForRect(int32_t inLeft,
|
||||
int32_t inHeight,
|
||||
nsIScreen **outScreen)
|
||||
{
|
||||
// Not support to query non-primary screen with rect.
|
||||
return GetPrimaryScreen(outScreen);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsScreenManagerAndroid::ScreenForNativeWidget(void *aWidget, nsIScreen **outScreen)
|
||||
{
|
||||
// Not support to query non-primary screen with native widget.
|
||||
return GetPrimaryScreen(outScreen);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsScreenManagerAndroid::GetNumberOfScreens(uint32_t *aNumberOfScreens)
|
||||
{
|
||||
*aNumberOfScreens = 1;
|
||||
*aNumberOfScreens = mScreens.Length();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -137,3 +175,25 @@ nsScreenManagerAndroid::GetSystemDefaultScale(float *aDefaultScale)
|
||||
*aDefaultScale = 1.0f;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
already_AddRefed<nsScreenAndroid>
|
||||
nsScreenManagerAndroid::AddScreen(DisplayType aDisplayType, nsIntRect aRect)
|
||||
{
|
||||
ALOG("nsScreenManagerAndroid: add %s screen",
|
||||
(aDisplayType == DisplayType::DISPLAY_PRIMARY ? "PRIMARY" :
|
||||
(aDisplayType == DisplayType::DISPLAY_EXTERNAL ? "EXTERNAL" :
|
||||
"VIRTUAL")));
|
||||
RefPtr<nsScreenAndroid> screen = new nsScreenAndroid(aDisplayType, aRect);
|
||||
mScreens.AppendElement(screen);
|
||||
return screen.forget();
|
||||
}
|
||||
|
||||
void
|
||||
nsScreenManagerAndroid::RemoveScreen(uint32_t aScreenId)
|
||||
{
|
||||
for (size_t i = 0; i < mScreens.Length(); i++) {
|
||||
if (aScreenId == mScreens[i]->GetId()) {
|
||||
mScreens.RemoveElementAt(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user