mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2026-10-20 15:27:18 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad3614c58e | ||
|
|
9401ecc9fb | ||
|
|
1711e5e1a4 | ||
|
|
8eb4014f01 | ||
|
|
df0d7952db | ||
|
|
77d1770063 | ||
|
|
f433bfdc02 | ||
|
|
f75b6f9b80 | ||
|
|
621df9996d | ||
|
|
6c29503db9 | ||
|
|
304a02e2ec | ||
|
|
7aea7ed8c6 | ||
|
|
e5ab3baa7b | ||
|
|
41b73f7cd9 | ||
|
|
38da42caf3 | ||
|
|
424d71fa13 | ||
|
|
dbc9d78002 | ||
|
|
b7ef8f54b7 | ||
|
|
bea7cab0c3 | ||
|
|
352b6f7dd9 | ||
|
|
8665fe364f | ||
|
|
7d023c8865 | ||
|
|
503d4b970c | ||
|
|
6b07072a08 | ||
|
|
c873bae3e4 | ||
|
|
7397a97a9e |
No files matched your search
@@ -38,3 +38,6 @@ build/
|
|||||||
# Compiled JNI libraries folder
|
# Compiled JNI libraries folder
|
||||||
**/jniLibs
|
**/jniLibs
|
||||||
app/.externalNativeBuild/
|
app/.externalNativeBuild/
|
||||||
|
|
||||||
|
# NDK stuff
|
||||||
|
.cxx/
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
language: android
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
|
git:
|
||||||
|
depth: 1
|
||||||
|
|
||||||
|
android:
|
||||||
|
components:
|
||||||
|
- tools
|
||||||
|
- platform-tools
|
||||||
|
- build-tools-29.0.1
|
||||||
|
- android-29
|
||||||
|
|
||||||
|
install:
|
||||||
|
- yes | sdkmanager "ndk-bundle"
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
# Moonlight Android
|
# Moonlight Android
|
||||||
|
|
||||||
|
[](https://travis-ci.org/moonlight-stream/moonlight-android)
|
||||||
|
|
||||||
[Moonlight](https://moonlight-stream.org) is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield.
|
[Moonlight](https://moonlight-stream.org) is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield.
|
||||||
We reverse engineered the Shield streaming software and created a version that can be run on any Android device.
|
We reverse engineered the Shield streaming software and created a version that can be run on any Android device.
|
||||||
|
|
||||||
@@ -17,7 +19,7 @@ Check our [wiki](https://github.com/moonlight-stream/moonlight-docs/wiki) for mo
|
|||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
* Download and install Moonlight for Android from
|
* Download and install Moonlight for Android from
|
||||||
[Google Play](https://play.google.com/store/apps/details?id=com.limelight), [Amazon App Store](http://www.amazon.com/gp/product/B00JK4MFN2), or directly from the [releases page](https://github.com/moonlight-stream/moonlight-android/releases)
|
[Google Play](https://play.google.com/store/apps/details?id=com.limelight), [F-Droid](https://f-droid.org/packages/com.limelight/), [Amazon App Store](http://www.amazon.com/gp/product/B00JK4MFN2), or directly from the [releases page](https://github.com/moonlight-stream/moonlight-android/releases)
|
||||||
* Download [GeForce Experience](http://www.geforce.com/geforce-experience) and install on your Windows PC
|
* Download [GeForce Experience](http://www.geforce.com/geforce-experience) and install on your Windows PC
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|||||||
+3
-2
@@ -7,8 +7,8 @@ android {
|
|||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
|
|
||||||
versionName "8.0"
|
versionName "8.1"
|
||||||
versionCode = 197
|
versionCode = 198
|
||||||
}
|
}
|
||||||
|
|
||||||
flavorDimensions "root"
|
flavorDimensions "root"
|
||||||
@@ -43,6 +43,7 @@ android {
|
|||||||
|
|
||||||
lintOptions {
|
lintOptions {
|
||||||
disable 'MissingTranslation'
|
disable 'MissingTranslation'
|
||||||
|
lintConfig file("lint.xml")
|
||||||
}
|
}
|
||||||
|
|
||||||
bundle {
|
bundle {
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<lint>
|
||||||
|
<issue id="InvalidPackage">
|
||||||
|
<ignore path="**/bcpkix-jdk15on-*.jar"/>
|
||||||
|
</issue>
|
||||||
|
</lint>
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
android:appCategory="game"
|
android:appCategory="game"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:roundIcon="@mipmap/ic_launcher"
|
android:roundIcon="@mipmap/ic_launcher"
|
||||||
|
android:installLocation="auto"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
<provider
|
<provider
|
||||||
android:name=".PosterContentProvider"
|
android:name=".PosterContentProvider"
|
||||||
|
|||||||
@@ -115,7 +115,10 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
private boolean grabbedInput = true;
|
private boolean grabbedInput = true;
|
||||||
private boolean grabComboDown = false;
|
private boolean grabComboDown = false;
|
||||||
private StreamView streamView;
|
private StreamView streamView;
|
||||||
|
|
||||||
|
private boolean isHidingOverlays;
|
||||||
private TextView notificationOverlayView;
|
private TextView notificationOverlayView;
|
||||||
|
private int requestedNotificationOverlayVisibility = View.GONE;
|
||||||
private TextView performanceOverlayView;
|
private TextView performanceOverlayView;
|
||||||
|
|
||||||
private ShortcutHelper shortcutHelper;
|
private ShortcutHelper shortcutHelper;
|
||||||
@@ -493,15 +496,34 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
if (virtualController != null) {
|
if (virtualController != null) {
|
||||||
// Refresh layout of OSC for possible new screen size
|
// Refresh layout of OSC for possible new screen size
|
||||||
virtualController.refreshLayout();
|
virtualController.refreshLayout();
|
||||||
|
}
|
||||||
|
|
||||||
// Hide OSC in PiP
|
// Hide on-screen overlays in PiP mode
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
if (isInPictureInPictureMode()) {
|
if (isInPictureInPictureMode()) {
|
||||||
|
isHidingOverlays = true;
|
||||||
|
|
||||||
|
if (virtualController != null) {
|
||||||
virtualController.hide();
|
virtualController.hide();
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
|
performanceOverlayView.setVisibility(View.GONE);
|
||||||
|
notificationOverlayView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isHidingOverlays = false;
|
||||||
|
|
||||||
|
// Restore overlays to previous state when leaving PiP
|
||||||
|
|
||||||
|
if (virtualController != null) {
|
||||||
virtualController.show();
|
virtualController.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prefConfig.enablePerfOverlay) {
|
||||||
|
performanceOverlayView.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
notificationOverlayView.setVisibility(requestedNotificationOverlayVisibility);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1402,10 +1424,14 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
notificationOverlayView.setText(getResources().getString(R.string.poor_connection_msg));
|
notificationOverlayView.setText(getResources().getString(R.string.poor_connection_msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
notificationOverlayView.setVisibility(View.VISIBLE);
|
requestedNotificationOverlayVisibility = View.VISIBLE;
|
||||||
}
|
}
|
||||||
else if (connectionStatus == MoonBridge.CONN_STATUS_OKAY) {
|
else if (connectionStatus == MoonBridge.CONN_STATUS_OKAY) {
|
||||||
notificationOverlayView.setVisibility(View.GONE);
|
requestedNotificationOverlayVisibility = View.GONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isHidingOverlays) {
|
||||||
|
notificationOverlayView.setVisibility(requestedNotificationOverlayVisibility);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.limelight.binding.crypto.AndroidCryptoProvider;
|
|||||||
import com.limelight.computers.ComputerManagerListener;
|
import com.limelight.computers.ComputerManagerListener;
|
||||||
import com.limelight.computers.ComputerManagerService;
|
import com.limelight.computers.ComputerManagerService;
|
||||||
import com.limelight.grid.PcGridAdapter;
|
import com.limelight.grid.PcGridAdapter;
|
||||||
|
import com.limelight.grid.assets.DiskAssetLoader;
|
||||||
import com.limelight.nvstream.http.ComputerDetails;
|
import com.limelight.nvstream.http.ComputerDetails;
|
||||||
import com.limelight.nvstream.http.NvApp;
|
import com.limelight.nvstream.http.NvApp;
|
||||||
import com.limelight.nvstream.http.NvHTTP;
|
import com.limelight.nvstream.http.NvHTTP;
|
||||||
@@ -631,6 +632,8 @@ public class PcView extends Activity implements AdapterFragmentCallbacks {
|
|||||||
private void removeComputer(ComputerDetails details) {
|
private void removeComputer(ComputerDetails details) {
|
||||||
managerBinder.removeComputer(details);
|
managerBinder.removeComputer(details);
|
||||||
|
|
||||||
|
new DiskAssetLoader(this).deleteAssetsForComputer(details.uuid);
|
||||||
|
|
||||||
for (int i = 0; i < pcGridAdapter.getCount(); i++) {
|
for (int i = 0; i < pcGridAdapter.getCount(); i++) {
|
||||||
ComputerObject computer = (ComputerObject) pcGridAdapter.getItem(i);
|
ComputerObject computer = (ComputerObject) pcGridAdapter.getItem(i);
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,16 @@ public class DiskAssetLoader {
|
|||||||
return CacheHelper.openPath(false, cacheDir, "boxart", computerUuid, appId + ".png");
|
return CacheHelper.openPath(false, cacheDir, "boxart", computerUuid, appId + ".png");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteAssetsForComputer(String computerUuid) {
|
||||||
|
File dir = CacheHelper.openPath(false, cacheDir, "boxart", computerUuid);
|
||||||
|
File[] files = dir.listFiles();
|
||||||
|
if (files != null) {
|
||||||
|
for (File f : files) {
|
||||||
|
f.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void populateCacheWithStream(CachedAppAssetLoader.LoaderTuple tuple, InputStream input) {
|
public void populateCacheWithStream(CachedAppAssetLoader.LoaderTuple tuple, InputStream input) {
|
||||||
OutputStream out = null;
|
OutputStream out = null;
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
|
|||||||
@@ -16,11 +16,9 @@ import android.media.tv.TvContract;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
||||||
import com.limelight.AppView;
|
|
||||||
import com.limelight.LimeLog;
|
import com.limelight.LimeLog;
|
||||||
import com.limelight.PosterContentProvider;
|
import com.limelight.PosterContentProvider;
|
||||||
import com.limelight.R;
|
import com.limelight.R;
|
||||||
import com.limelight.ShortcutTrampoline;
|
|
||||||
import com.limelight.nvstream.http.ComputerDetails;
|
import com.limelight.nvstream.http.ComputerDetails;
|
||||||
import com.limelight.nvstream.http.NvApp;
|
import com.limelight.nvstream.http.NvApp;
|
||||||
|
|
||||||
@@ -32,6 +30,7 @@ public class TvChannelHelper {
|
|||||||
private static final int ASPECT_RATIO_MOVIE_POSTER = 5;
|
private static final int ASPECT_RATIO_MOVIE_POSTER = 5;
|
||||||
private static final int TYPE_GAME = 12;
|
private static final int TYPE_GAME = 12;
|
||||||
private static final int INTERNAL_PROVIDER_ID_INDEX = 1;
|
private static final int INTERNAL_PROVIDER_ID_INDEX = 1;
|
||||||
|
private static final int PROGRAM_BROWSABLE_INDEX = 2;
|
||||||
private static final int ID_INDEX = 0;
|
private static final int ID_INDEX = 0;
|
||||||
private Activity context;
|
private Activity context;
|
||||||
|
|
||||||
@@ -214,7 +213,7 @@ public class TvChannelHelper {
|
|||||||
private Long getProgramId(long channelId, String appId) {
|
private Long getProgramId(long channelId, String appId) {
|
||||||
try (Cursor cursor = context.getContentResolver().query(
|
try (Cursor cursor = context.getContentResolver().query(
|
||||||
TvContract.buildPreviewProgramsUriForChannel(channelId),
|
TvContract.buildPreviewProgramsUriForChannel(channelId),
|
||||||
new String[] {TvContract.PreviewPrograms._ID, TvContract.PreviewPrograms.COLUMN_INTERNAL_PROVIDER_ID},
|
new String[] {TvContract.PreviewPrograms._ID, TvContract.PreviewPrograms.COLUMN_INTERNAL_PROVIDER_ID, TvContract.PreviewPrograms.COLUMN_BROWSABLE},
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
null)) {
|
null)) {
|
||||||
@@ -224,7 +223,18 @@ public class TvChannelHelper {
|
|||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
String internalProviderId = cursor.getString(INTERNAL_PROVIDER_ID_INDEX);
|
String internalProviderId = cursor.getString(INTERNAL_PROVIDER_ID_INDEX);
|
||||||
if (appId.equals(internalProviderId)) {
|
if (appId.equals(internalProviderId)) {
|
||||||
return cursor.getLong(ID_INDEX);
|
long id = cursor.getLong(ID_INDEX);
|
||||||
|
int browsable = cursor.getInt(PROGRAM_BROWSABLE_INDEX);
|
||||||
|
if (browsable != 0) {
|
||||||
|
return id;
|
||||||
|
} else {
|
||||||
|
int countDeleted = context.getContentResolver().delete(TvContract.buildPreviewProgramUri(id), null, null);
|
||||||
|
if (countDeleted > 0) {
|
||||||
|
LimeLog.info("Preview program has been deleted");
|
||||||
|
} else {
|
||||||
|
LimeLog.warning("Preview program has not been deleted");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,12 @@ package com.limelight.utils;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.UiModeManager;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.WindowInsets;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
import com.limelight.R;
|
import com.limelight.R;
|
||||||
@@ -19,10 +18,6 @@ import java.util.Locale;
|
|||||||
|
|
||||||
public class UiHelper {
|
public class UiHelper {
|
||||||
|
|
||||||
// Values from https://developer.android.com/training/tv/start/layouts.html
|
|
||||||
private static final int TV_VERTICAL_PADDING_DP = 27;
|
|
||||||
private static final int TV_HORIZONTAL_PADDING_DP = 48;
|
|
||||||
|
|
||||||
public static void setLocale(Activity activity)
|
public static void setLocale(Activity activity)
|
||||||
{
|
{
|
||||||
String locale = PreferenceConfiguration.readPreferences(activity).language;
|
String locale = PreferenceConfiguration.readPreferences(activity).language;
|
||||||
@@ -47,20 +42,6 @@ public class UiHelper {
|
|||||||
|
|
||||||
public static void notifyNewRootView(Activity activity)
|
public static void notifyNewRootView(Activity activity)
|
||||||
{
|
{
|
||||||
View rootView = activity.findViewById(android.R.id.content);
|
|
||||||
UiModeManager modeMgr = (UiModeManager) activity.getSystemService(Context.UI_MODE_SERVICE);
|
|
||||||
|
|
||||||
if (modeMgr.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION)
|
|
||||||
{
|
|
||||||
// Increase view padding on TVs
|
|
||||||
float scale = activity.getResources().getDisplayMetrics().density;
|
|
||||||
int verticalPaddingPixels = (int) (TV_VERTICAL_PADDING_DP*scale + 0.5f);
|
|
||||||
int horizontalPaddingPixels = (int) (TV_HORIZONTAL_PADDING_DP*scale + 0.5f);
|
|
||||||
|
|
||||||
rootView.setPadding(horizontalPaddingPixels, verticalPaddingPixels,
|
|
||||||
horizontalPaddingPixels, verticalPaddingPixels);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
// Allow this non-streaming activity to layout under notches.
|
// Allow this non-streaming activity to layout under notches.
|
||||||
//
|
//
|
||||||
@@ -70,6 +51,23 @@ public class UiHelper {
|
|||||||
activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
|
activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
|
||||||
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
|
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
|
// Draw under the status bar on Android Q devices
|
||||||
|
|
||||||
|
activity.getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
|
||||||
|
@Override
|
||||||
|
public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
|
||||||
|
view.setPadding(windowInsets.getSystemWindowInsetLeft(),
|
||||||
|
windowInsets.getSystemWindowInsetTop(),
|
||||||
|
windowInsets.getSystemWindowInsetRight(),
|
||||||
|
0);
|
||||||
|
return windowInsets;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void showDecoderCrashDialog(Activity activity) {
|
public static void showDecoderCrashDialog(Activity activity) {
|
||||||
|
|||||||
File renamed without changes.
@@ -2,7 +2,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
|
||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
|
||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
|
||||||
tools:context=".AppView" >
|
tools:context=".AppView" >
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
@@ -27,8 +23,8 @@
|
|||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignParentTop="true"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:paddingTop="0dp"
|
android:paddingTop="5dp"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="5dp"
|
||||||
android:textSize="28sp"/>
|
android:textSize="28sp"/>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
|
||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
|
||||||
android:id="@+id/stream_settings"
|
android:id="@+id/stream_settings"
|
||||||
tools:context=".preferences.StreamSettings">
|
tools:context=".preferences.StreamSettings">
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical" android:layout_width="match_parent"
|
android:id="@+id/fragmentView"
|
||||||
android:layout_height="match_parent">
|
android:layout_width="fill_parent"
|
||||||
<GridView
|
android:layout_height="fill_parent"
|
||||||
android:id="@+id/fragmentView"
|
android:numColumns="auto_fit"
|
||||||
android:layout_width="fill_parent"
|
android:columnWidth="160dp"
|
||||||
android:layout_height="fill_parent"
|
android:stretchMode="spacingWidthUniform"
|
||||||
android:numColumns="auto_fit"
|
android:focusable="true"
|
||||||
android:columnWidth="160dp"
|
android:focusableInTouchMode="true"
|
||||||
android:stretchMode="spacingWidth"
|
android:gravity="center"/>
|
||||||
android:focusable="true"
|
|
||||||
android:focusableInTouchMode="true"
|
|
||||||
android:gravity="center"/>
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -1,15 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical" android:layout_width="match_parent"
|
android:id="@+id/fragmentView"
|
||||||
android:layout_height="match_parent">
|
android:layout_width="fill_parent"
|
||||||
<GridView
|
android:layout_height="fill_parent"
|
||||||
android:id="@+id/fragmentView"
|
android:numColumns="auto_fit"
|
||||||
android:layout_width="fill_parent"
|
android:columnWidth="105dp"
|
||||||
android:layout_height="fill_parent"
|
android:stretchMode="spacingWidthUniform"
|
||||||
android:numColumns="auto_fit"
|
android:focusable="true"
|
||||||
android:columnWidth="105dp"
|
android:focusableInTouchMode="true"
|
||||||
android:stretchMode="spacingWidth"
|
android:gravity="center"/>
|
||||||
android:focusable="true"
|
|
||||||
android:focusableInTouchMode="true"
|
|
||||||
android:gravity="center"/>
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -1,15 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical" android:layout_width="match_parent"
|
android:id="@+id/fragmentView"
|
||||||
android:layout_height="match_parent">
|
android:layout_width="fill_parent"
|
||||||
<GridView
|
android:layout_height="fill_parent"
|
||||||
android:id="@+id/fragmentView"
|
android:numColumns="auto_fit"
|
||||||
android:layout_width="fill_parent"
|
android:columnWidth="160dp"
|
||||||
android:layout_height="fill_parent"
|
android:stretchMode="spacingWidthUniform"
|
||||||
android:numColumns="auto_fit"
|
android:focusable="true"
|
||||||
android:columnWidth="160dp"
|
android:focusableInTouchMode="true"
|
||||||
android:focusable="true"
|
android:nextFocusLeft="@id/settingsButton"
|
||||||
android:focusableInTouchMode="true"
|
android:gravity="center"/>
|
||||||
android:nextFocusLeft="@id/settingsButton"
|
|
||||||
android:gravity="center"/>
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -1,15 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical" android:layout_width="match_parent"
|
android:id="@+id/fragmentView"
|
||||||
android:layout_height="match_parent">
|
android:layout_width="fill_parent"
|
||||||
<GridView
|
android:layout_height="fill_parent"
|
||||||
android:id="@+id/fragmentView"
|
android:numColumns="auto_fit"
|
||||||
android:layout_width="fill_parent"
|
android:columnWidth="105dp"
|
||||||
android:layout_height="fill_parent"
|
android:stretchMode="spacingWidthUniform"
|
||||||
android:numColumns="auto_fit"
|
android:focusable="true"
|
||||||
android:columnWidth="105dp"
|
android:focusableInTouchMode="true"
|
||||||
android:focusable="true"
|
android:nextFocusLeft="@id/settingsButton"
|
||||||
android:focusableInTouchMode="true"
|
android:gravity="center"/>
|
||||||
android:nextFocusLeft="@id/settingsButton"
|
|
||||||
android:gravity="center"/>
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -82,6 +82,9 @@
|
|||||||
<string name="title_details">Détails</string>
|
<string name="title_details">Détails</string>
|
||||||
<string name="help">Aide</string>
|
<string name="help">Aide</string>
|
||||||
<string name="delete_pc_msg">Êtes-vous sûr de vouloir supprimer ce PC?</string>
|
<string name="delete_pc_msg">Êtes-vous sûr de vouloir supprimer ce PC?</string>
|
||||||
|
<string name="slow_connection_msg">Connexion lente au PC\nRéduisez votre débit</string>
|
||||||
|
<string name="poor_connection_msg">Mauvaise connexion au PC</string>
|
||||||
|
<string name="perf_overlay_text">Video dimensions: %1$s\nDécodeur: %2$s\nEstimation de la fréquence d\'images de l\'ordinateur hôte: %3$.2f FPS\nFréquence d\'images entrantes du réseau: %4$.2f FPS\nTaux de rendu: %5$.2f FPS\nImages envoyé par votre connexion réseau: %6$.2f%%\nTemps moyen de réception: %7$.2f ms\nTemps de décodage moyen: %8$.2f ms</string>
|
||||||
|
|
||||||
<!-- AppList activity -->
|
<!-- AppList activity -->
|
||||||
<string name="applist_connect_msg">Connexion au PC…</string>
|
<string name="applist_connect_msg">Connexion au PC…</string>
|
||||||
@@ -91,6 +94,7 @@
|
|||||||
<string name="applist_menu_cancel">Annuler</string>
|
<string name="applist_menu_cancel">Annuler</string>
|
||||||
<string name="applist_menu_details">Voir les détails</string>
|
<string name="applist_menu_details">Voir les détails</string>
|
||||||
<string name="applist_menu_scut">Créer un raccourci</string>
|
<string name="applist_menu_scut">Créer un raccourci</string>
|
||||||
|
<string name="applist_menu_tv_channel">Ajouter à la chaîne</string>
|
||||||
<string name="applist_refresh_title">Liste des applications</string>
|
<string name="applist_refresh_title">Liste des applications</string>
|
||||||
<string name="applist_refresh_msg">Actualisation des applications…</string>
|
<string name="applist_refresh_msg">Actualisation des applications…</string>
|
||||||
<string name="applist_refresh_error_title">Erreur</string>
|
<string name="applist_refresh_error_title">Erreur</string>
|
||||||
@@ -181,5 +185,7 @@
|
|||||||
<string name="summary_video_format">H.265 réduit les besoins en bande passante vidéo mais nécessite un périphérique très récent</string>
|
<string name="summary_video_format">H.265 réduit les besoins en bande passante vidéo mais nécessite un périphérique très récent</string>
|
||||||
<string name="title_enable_hdr">Activer le HDR (expérimental)</string>
|
<string name="title_enable_hdr">Activer le HDR (expérimental)</string>
|
||||||
<string name="summary_enable_hdr">Diffuser du HDR lorsque le jeu et le processeur graphique du PC le prennent en charge. HDR nécessite un GPU série GTX 1000 ou une version ultérieure.</string>
|
<string name="summary_enable_hdr">Diffuser du HDR lorsque le jeu et le processeur graphique du PC le prennent en charge. HDR nécessite un GPU série GTX 1000 ou une version ultérieure.</string>
|
||||||
|
<string name="title_enable_perf_overlay">Activer la superposition de performance</string>
|
||||||
|
<string name="summary_enable_perf_overlay">Afficher une superposition à l\'écran avec des informations de performance en temps réel pendant la lecture en continu</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -157,4 +157,30 @@
|
|||||||
<string name="title_enable_hdr">Включить HDR (Экспериментально)</string>
|
<string name="title_enable_hdr">Включить HDR (Экспериментально)</string>
|
||||||
<string name="summary_enable_hdr">Транслировать в HDR если игра и GPU компьютера поддерживают это. HDR требует видеокарты GTX 1000 серии или более новой.</string>
|
<string name="summary_enable_hdr">Транслировать в HDR если игра и GPU компьютера поддерживают это. HDR требует видеокарты GTX 1000 серии или более новой.</string>
|
||||||
|
|
||||||
|
<string name="title_checkbox_vibrate_osc">Включить вибрацию</string>
|
||||||
|
<string name="title_fps_list">Частота кадров</string>
|
||||||
|
<string name="applist_menu_details">Детали</string>
|
||||||
|
<string name="applist_menu_scut">Создать ярлык</string>
|
||||||
|
<string name="category_input_settings">Настройки ввода</string>
|
||||||
|
<string name="delete_pc_msg">Вы уверены что хотите удалить этот PC?</string>
|
||||||
|
<string name="pcview_menu_details">Детали</string>
|
||||||
|
<string name="poor_connection_msg">Слабое соединение с PC</string>
|
||||||
|
<string name="title_details">Детали</string>
|
||||||
|
<string name="title_enable_perf_overlay">Включить отображение статистики</string>
|
||||||
|
<string name="title_unlock_fps">Разблокировать все возможные частоты обновления</string>
|
||||||
|
<string name="applist_details_id">ID приложения:</string>
|
||||||
|
<string name="title_checkbox_vibrate_fallback">Эмуляция виброотдачи</string>
|
||||||
|
<string name="summary_checkbox_vibrate_osc">Вибрировать устройство для эмуляции виброотдачи при экранном управлении</string>
|
||||||
|
<string name="summary_checkbox_vibrate_fallback">Вибрировать устройство для эмуляции виброотдачи для геймпадов без поддержки вибрации</string>
|
||||||
|
<string name="summary_checkbox_mouse_nav_buttons">Включение этой опции может привести к неправильной работе правой кнопки мыши на некоторых устройствах</string>
|
||||||
|
<string name="scut_pc_not_found">PC не найден</string>
|
||||||
|
<string name="unable_to_pin_shortcut">Текущий лаунчер не позволяет создавать pinned ярлыки</string>
|
||||||
|
<string name="title_checkbox_mouse_nav_buttons">Включить кнопки вперед и назад для мыши</string>
|
||||||
|
<string name="slow_connection_msg">Медленное подключение к PC\nУменьшите битрейт</string>
|
||||||
|
<string name="summary_unlock_fps">Трансляция со скоростью 90 или 120 кадров в секунду может уменьшить задержку на устройствах высокого класса, но может вызвать задержки или сбой на устройствах без поддержки этого функционала</string>
|
||||||
|
<string name="summary_enable_perf_overlay">Отображение оверлея на экране с информацией о производительности во время трансляции в режиме реального времени</string>
|
||||||
|
<string name="perf_overlay_text">Разрешение видео: %1$s\nДекодер: %2$s\nРасчетная частота кадров PC-хоста: %3$.2f FPS\nВходящая частота кадров из сети: %4$.2f FPS\nЧастота кадров при рендеринге: %5$.2f FPS\nОтброшеных кадров вашей сетью: %6$.2f%%\nСреднее время получения: %7$.2f ms\nСреднее время декодирования: %8$.2f ms</string>
|
||||||
|
<string name="summary_fps_list">Увеличение для более плавного видео потока. Уменьшите для лучшей производительности на более слабых устройствах.</string>
|
||||||
|
<string name="scut_invalid_uuid">Указанный PC недействителен</string>
|
||||||
|
<string name="scut_invalid_app_id">Указанное приложение недействительно</string>
|
||||||
</resources>
|
</resources>
|
||||||
File renamed without changes.
@@ -0,0 +1,8 @@
|
|||||||
|
- Optimized edge-to-edge layout for Android Q
|
||||||
|
- Fixed 5.1 surround sound not always working over the Internet
|
||||||
|
- Fixed Android TV app icon on Android Pie
|
||||||
|
- Improved reliability of public IP address detection
|
||||||
|
- Enabled installation on external storage
|
||||||
|
- Fixed on-screen overlays covering stream when in PiP mode
|
||||||
|
- Fixed games never reappearing on Android TV channel if deleted once
|
||||||
|
- Updated Russian and French translations
|
||||||
+1
-1
Submodule moonlight-common updated: a279f26b3f...2cf6f8082e.
Reference in new issue
Block a user