feat(Windows): Adds Windows support to react-native-video
This PR adds react-native-windows support to react-native-video. The Video component is implemented with a XAML MediaPlayerElement. Most of the features implemented by Android (and some additional ones) are implemented by Windows. Known issues and missing features include: * onReadyForDisplay event * local URI convention (e.g., "broadchurch" in examples changed to require("./broadchurch.mp4") * `playableDuration` in `onVideoProgress` event is always 0.0 * `playInBackground` is not yet supported * Volume settings are applied, but the UWP control does not handle it properly
53
README.md
@ -80,6 +80,59 @@ Under `.addPackage(new MainReactPackage())`:
|
|||||||
.addPackage(new ReactVideoPackage())
|
.addPackage(new ReactVideoPackage())
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
Make the following additions to the given files manually:
|
||||||
|
|
||||||
|
**windows/myapp.sln**
|
||||||
|
|
||||||
|
Add the `ReactNativeVideo` project to your solution.
|
||||||
|
1. Open the solution in Visual Studio 2015
|
||||||
|
2. Right-click Solution icon in Solution Explorer > Add > Existing Project...
|
||||||
|
3. Select `node_modules\react-native-video\windows\ReactNativeVideo\ReactNativeVideo.csproj`
|
||||||
|
|
||||||
|
**windows/myapp/myapp.csproj**
|
||||||
|
|
||||||
|
Add a reference to `ReactNativeVideo` to your main application project.
|
||||||
|
|
||||||
|
Using Visual Studio 2015:
|
||||||
|
1. Right-click main application project > Add > Reference...
|
||||||
|
2. Check `ReactNativeVideo` from Solution Projects.
|
||||||
|
|
||||||
|
Manually from `windows/myapp/myapp.csproj`, add:
|
||||||
|
```xml
|
||||||
|
<ProjectReference Include="..\..\node_modules\react-native-video\windows\ReactNativeVideo\ReactNativeVideo.csproj">
|
||||||
|
<Project>{e8f5f57f-757e-4237-ad23-f7a8755427cd}</Project>
|
||||||
|
<Name>ReactNativeVideo</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
```
|
||||||
|
|
||||||
|
**MainPage.cs**
|
||||||
|
|
||||||
|
Add the `ReactVideoPackage` class to your list of exported packages.
|
||||||
|
```cs
|
||||||
|
using ReactNative;
|
||||||
|
using ReactNative.Modules.Core;
|
||||||
|
using ReactNative.Shell;
|
||||||
|
using ReactNativeVideo; // <-- Add this
|
||||||
|
using System.Collections.Generic;
|
||||||
|
...
|
||||||
|
|
||||||
|
public override List<IReactPackage> Packages
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new List<IReactPackage>
|
||||||
|
{
|
||||||
|
new MainReactPackage(),
|
||||||
|
new ReactVideoPackage(), // <-- Add this
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
2
Video.js
@ -125,7 +125,7 @@ export default class Video extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isNetwork = !!(uri && uri.match(/^https?:/));
|
const isNetwork = !!(uri && uri.match(/^https?:/));
|
||||||
const isAsset = !!(uri && uri.match(/^(assets-library|file|content):/));
|
const isAsset = !!(uri && uri.match(/^(assets-library|file|content|ms-appx|ms-appdata):/));
|
||||||
|
|
||||||
let nativeResizeMode;
|
let nativeResizeMode;
|
||||||
if (resizeMode === VideoResizeMode.stretch) {
|
if (resizeMode === VideoResizeMode.stretch) {
|
||||||
|
210
example/index.windows.js
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
import React, {
|
||||||
|
Component
|
||||||
|
} from 'react';
|
||||||
|
|
||||||
|
import {
|
||||||
|
AppRegistry,
|
||||||
|
StyleSheet,
|
||||||
|
Text,
|
||||||
|
TouchableOpacity,
|
||||||
|
View,
|
||||||
|
} from 'react-native';
|
||||||
|
|
||||||
|
import Video from 'react-native-video';
|
||||||
|
|
||||||
|
class VideoPlayer extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.onLoad = this.onLoad.bind(this);
|
||||||
|
this.onProgress = this.onProgress.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = {
|
||||||
|
rate: 1,
|
||||||
|
volume: 1,
|
||||||
|
muted: false,
|
||||||
|
resizeMode: 'contain',
|
||||||
|
duration: 0.0,
|
||||||
|
currentTime: 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
|
onLoad(data) {
|
||||||
|
this.setState({duration: data.duration});
|
||||||
|
}
|
||||||
|
|
||||||
|
onProgress(data) {
|
||||||
|
this.setState({currentTime: data.currentTime});
|
||||||
|
}
|
||||||
|
|
||||||
|
getCurrentTimePercentage() {
|
||||||
|
if (this.state.currentTime > 0) {
|
||||||
|
return parseFloat(this.state.currentTime) / parseFloat(this.state.duration);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renderRateControl(rate) {
|
||||||
|
const isSelected = (this.state.rate == rate);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TouchableOpacity onPress={() => { this.setState({rate: rate}) }}>
|
||||||
|
<Text style={[styles.controlOption, {fontWeight: isSelected ? "bold" : "normal"}]}>
|
||||||
|
{rate}x
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
renderResizeModeControl(resizeMode) {
|
||||||
|
const isSelected = (this.state.resizeMode == resizeMode);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TouchableOpacity onPress={() => { this.setState({resizeMode: resizeMode}) }}>
|
||||||
|
<Text style={[styles.controlOption, {fontWeight: isSelected ? "bold" : "normal"}]}>
|
||||||
|
{resizeMode}
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
renderVolumeControl(volume) {
|
||||||
|
const isSelected = (this.state.volume == volume);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TouchableOpacity onPress={() => { this.setState({volume: volume}) }}>
|
||||||
|
<Text style={[styles.controlOption, {fontWeight: isSelected ? "bold" : "normal"}]}>
|
||||||
|
{volume * 100}%
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const flexCompleted = this.getCurrentTimePercentage() * 100;
|
||||||
|
const flexRemaining = (1 - this.getCurrentTimePercentage()) * 100;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<TouchableOpacity style={styles.fullScreen} onPress={() => {this.setState({paused: !this.state.paused})}}>
|
||||||
|
<Video source={require('./broadchurch.mp4')}
|
||||||
|
style={styles.fullScreen}
|
||||||
|
rate={this.state.rate}
|
||||||
|
paused={this.state.paused}
|
||||||
|
volume={this.state.volume}
|
||||||
|
muted={this.state.muted}
|
||||||
|
resizeMode={this.state.resizeMode}
|
||||||
|
onLoad={this.onLoad}
|
||||||
|
onProgress={this.onProgress}
|
||||||
|
onEnd={() => { console.log('Done!') }}
|
||||||
|
repeat={true} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
<View style={styles.controls}>
|
||||||
|
<View style={styles.generalControls}>
|
||||||
|
<View style={styles.rateControl}>
|
||||||
|
{this.renderRateControl(0.25)}
|
||||||
|
{this.renderRateControl(0.5)}
|
||||||
|
{this.renderRateControl(1.0)}
|
||||||
|
{this.renderRateControl(1.5)}
|
||||||
|
{this.renderRateControl(2.0)}
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.volumeControl}>
|
||||||
|
{this.renderVolumeControl(0.5)}
|
||||||
|
{this.renderVolumeControl(1)}
|
||||||
|
{this.renderVolumeControl(1.5)}
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.resizeModeControl}>
|
||||||
|
{this.renderResizeModeControl('cover')}
|
||||||
|
{this.renderResizeModeControl('contain')}
|
||||||
|
{this.renderResizeModeControl('stretch')}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.trackingControls}>
|
||||||
|
<View style={styles.progress}>
|
||||||
|
<View style={[styles.innerProgressCompleted, {flex: flexCompleted}]} />
|
||||||
|
<View style={[styles.innerProgressRemaining, {flex: flexRemaining}]} />
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: 'black',
|
||||||
|
},
|
||||||
|
fullScreen: {
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
bottom: 0,
|
||||||
|
right: 0,
|
||||||
|
},
|
||||||
|
controls: {
|
||||||
|
backgroundColor: "transparent",
|
||||||
|
borderRadius: 5,
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 20,
|
||||||
|
left: 20,
|
||||||
|
right: 20,
|
||||||
|
},
|
||||||
|
progress: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
borderRadius: 3,
|
||||||
|
overflow: 'hidden',
|
||||||
|
},
|
||||||
|
innerProgressCompleted: {
|
||||||
|
height: 20,
|
||||||
|
backgroundColor: '#cccccc',
|
||||||
|
},
|
||||||
|
innerProgressRemaining: {
|
||||||
|
height: 20,
|
||||||
|
backgroundColor: '#2C2C2C',
|
||||||
|
},
|
||||||
|
generalControls: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
borderRadius: 4,
|
||||||
|
overflow: 'hidden',
|
||||||
|
paddingBottom: 10,
|
||||||
|
},
|
||||||
|
rateControl: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
volumeControl: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
resizeModeControl: {
|
||||||
|
flex: 1,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
controlOption: {
|
||||||
|
alignSelf: 'center',
|
||||||
|
fontSize: 11,
|
||||||
|
color: "white",
|
||||||
|
paddingLeft: 2,
|
||||||
|
paddingRight: 2,
|
||||||
|
lineHeight: 12,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
AppRegistry.registerComponent('VideoPlayer', () => VideoPlayer);
|
@ -8,6 +8,10 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"react": "15.3.1",
|
"react": "15.3.1",
|
||||||
"react-native": "^0.33.0",
|
"react-native": "^0.33.0",
|
||||||
"react-native-video": "file:../"
|
"react-native-video": "file:../",
|
||||||
|
"react-native-windows": "^0.33.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"rnpm-plugin-windows": "^0.2.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
89
example/windows/.gitignore
vendored
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
*AppPackages*
|
||||||
|
*BundleArtifacts*
|
||||||
|
*ReactAssets*
|
||||||
|
|
||||||
|
#OS junk files
|
||||||
|
[Tt]humbs.db
|
||||||
|
*.DS_Store
|
||||||
|
|
||||||
|
#Visual Studio files
|
||||||
|
*.[Oo]bj
|
||||||
|
*.user
|
||||||
|
*.aps
|
||||||
|
*.pch
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.ncb
|
||||||
|
*.suo
|
||||||
|
*.tlb
|
||||||
|
*.tlh
|
||||||
|
*.bak
|
||||||
|
*.[Cc]ache
|
||||||
|
*.ilk
|
||||||
|
*.log
|
||||||
|
*.lib
|
||||||
|
*.sbr
|
||||||
|
*.sdf
|
||||||
|
*.opensdf
|
||||||
|
*.opendb
|
||||||
|
*.unsuccessfulbuild
|
||||||
|
ipch/
|
||||||
|
[Oo]bj/
|
||||||
|
[Bb]in
|
||||||
|
[Dd]ebug*/
|
||||||
|
[Rr]elease*/
|
||||||
|
Ankh.NoLoad
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
#MonoDevelop
|
||||||
|
*.pidb
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
#Tooling
|
||||||
|
_ReSharper*/
|
||||||
|
*.resharper
|
||||||
|
[Tt]est[Rr]esult*
|
||||||
|
*.sass-cache
|
||||||
|
|
||||||
|
#Project files
|
||||||
|
[Bb]uild/
|
||||||
|
|
||||||
|
#Subversion files
|
||||||
|
.svn
|
||||||
|
|
||||||
|
# Office Temp Files
|
||||||
|
~$*
|
||||||
|
|
||||||
|
# vim Temp Files
|
||||||
|
*~
|
||||||
|
|
||||||
|
#NuGet
|
||||||
|
packages/
|
||||||
|
*.nupkg
|
||||||
|
|
||||||
|
#ncrunch
|
||||||
|
*ncrunch*
|
||||||
|
*crunch*.local.xml
|
||||||
|
|
||||||
|
# visual studio database projects
|
||||||
|
*.dbmdl
|
||||||
|
|
||||||
|
#Test files
|
||||||
|
*.testsettings
|
||||||
|
|
||||||
|
#Other files
|
||||||
|
*.DotSettings
|
||||||
|
.vs/
|
||||||
|
*project.lock.json
|
141
example/windows/VideoPlayer.sln
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 14
|
||||||
|
VisualStudioVersion = 14.0.25420.1
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VideoPlayer", "VideoPlayer\VideoPlayer.csproj", "{A027BE54-D118-49A4-8D84-0666A2A93E64}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNative", "..\node_modules\react-native-windows\ReactWindows\ReactNative\ReactNative.csproj", "{C7673AD5-E3AA-468C-A5FD-FA38154E205C}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraBridge", "..\node_modules\react-native-windows\ReactWindows\ChakraBridge\ChakraBridge.vcxproj", "{4B72C796-16D5-4E3A-81C0-3E36F531E578}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNativeVideo", "..\node_modules\react-native-video\windows\ReactNativeVideo\ReactNativeVideo.csproj", "{E8F5F57F-757E-4237-AD23-F7A8755427CD}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|ARM = Debug|ARM
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
DebugBundle|ARM = DebugBundle|ARM
|
||||||
|
DebugBundle|x64 = DebugBundle|x64
|
||||||
|
DebugBundle|x86 = DebugBundle|x86
|
||||||
|
Release|ARM = Release|ARM
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
ReleaseBundle|ARM = ReleaseBundle|ARM
|
||||||
|
ReleaseBundle|x64 = ReleaseBundle|x64
|
||||||
|
ReleaseBundle|x86 = ReleaseBundle|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|ARM.Build.0 = Debug|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|ARM.Deploy.0 = Debug|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x64.Deploy.0 = Debug|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x86.Deploy.0 = Debug|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|ARM.Build.0 = DebugBundle|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x64.ActiveCfg = DebugBundle|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x64.Build.0 = DebugBundle|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x64.Deploy.0 = DebugBundle|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x86.ActiveCfg = DebugBundle|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x86.Build.0 = DebugBundle|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x86.Deploy.0 = DebugBundle|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|ARM.ActiveCfg = Release|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|ARM.Build.0 = Release|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|ARM.Deploy.0 = Release|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x64.Build.0 = Release|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x64.Deploy.0 = Release|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x86.Build.0 = Release|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x86.Deploy.0 = Release|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86
|
||||||
|
{A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86
|
||||||
|
{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32
|
||||||
|
{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|ARM.Build.0 = Debug|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|ARM.ActiveCfg = Debug|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|ARM.Build.0 = Debug|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x64.ActiveCfg = Debug|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x64.Build.0 = Debug|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x86.ActiveCfg = Debug|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x86.Build.0 = Debug|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|ARM.ActiveCfg = Release|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|ARM.Build.0 = Release|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x64.Build.0 = Release|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x86.Build.0 = Release|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|ARM.ActiveCfg = Release|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|ARM.Build.0 = Release|ARM
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x64.ActiveCfg = Release|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x64.Build.0 = Release|x64
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x86.ActiveCfg = Release|x86
|
||||||
|
{E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x86.Build.0 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
8
example/windows/VideoPlayer/App.xaml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<Application
|
||||||
|
x:Class="VideoPlayer.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="using:VideoPlayer"
|
||||||
|
RequestedTheme="Light">
|
||||||
|
|
||||||
|
</Application>
|
112
example/windows/VideoPlayer/App.xaml.cs
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
using ReactNative;
|
||||||
|
using System;
|
||||||
|
using Windows.ApplicationModel;
|
||||||
|
using Windows.ApplicationModel.Activation;
|
||||||
|
using Windows.UI.Core;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Navigation;
|
||||||
|
|
||||||
|
namespace VideoPlayer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides application-specific behavior to supplement the default Application class.
|
||||||
|
/// </summary>
|
||||||
|
sealed partial class App : Application
|
||||||
|
{
|
||||||
|
private readonly ReactPage _reactPage;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the singleton application object. This is the first line of authored code
|
||||||
|
/// executed, and as such is the logical equivalent of main() or WinMain().
|
||||||
|
/// </summary>
|
||||||
|
public App()
|
||||||
|
{
|
||||||
|
this.InitializeComponent();
|
||||||
|
this.Suspending += OnSuspending;
|
||||||
|
this.Resuming += OnResuming;
|
||||||
|
|
||||||
|
_reactPage = new MainPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked when the application is launched normally by the end user. Other entry points
|
||||||
|
/// will be used such as when the application is launched to open a specific file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e">Details about the launch request and process.</param>
|
||||||
|
protected override void OnLaunched(LaunchActivatedEventArgs e)
|
||||||
|
{
|
||||||
|
_reactPage.OnResume(Exit);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
if (System.Diagnostics.Debugger.IsAttached)
|
||||||
|
{
|
||||||
|
this.DebugSettings.EnableFrameRateCounter = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
|
||||||
|
AppViewBackButtonVisibility.Visible;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Frame rootFrame = Window.Current.Content as Frame;
|
||||||
|
|
||||||
|
// Do not repeat app initialization when the Window already has content,
|
||||||
|
// just ensure that the window is active
|
||||||
|
if (rootFrame == null)
|
||||||
|
{
|
||||||
|
_reactPage.OnCreate(e.Arguments);
|
||||||
|
|
||||||
|
// Create a Frame to act as the navigation context and navigate to the first page
|
||||||
|
rootFrame = new Frame();
|
||||||
|
|
||||||
|
rootFrame.NavigationFailed += OnNavigationFailed;
|
||||||
|
|
||||||
|
// Place the frame in the current Window
|
||||||
|
Window.Current.Content = rootFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rootFrame.Content == null)
|
||||||
|
{
|
||||||
|
// When the navigation stack isn't restored navigate to the first page,
|
||||||
|
// configuring the new page by passing required information as a navigation
|
||||||
|
// parameter
|
||||||
|
rootFrame.Content = _reactPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the current window is active
|
||||||
|
Window.Current.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked when Navigation to a certain page fails
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">The Frame which failed navigation</param>
|
||||||
|
/// <param name="e">Details about the navigation failure</param>
|
||||||
|
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
|
||||||
|
{
|
||||||
|
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked when application execution is being suspended. Application state is saved
|
||||||
|
/// without knowing whether the application will be terminated or resumed with the contents
|
||||||
|
/// of memory still intact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">The source of the suspend request.</param>
|
||||||
|
/// <param name="e">Details about the suspend request.</param>
|
||||||
|
private void OnSuspending(object sender, SuspendingEventArgs e)
|
||||||
|
{
|
||||||
|
_reactPage.OnSuspend();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked when application execution is being resumed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">The source of the resume request.</param>
|
||||||
|
/// <param name="e">Details about the resume request.</param>
|
||||||
|
private void OnResuming(object sender, object e)
|
||||||
|
{
|
||||||
|
_reactPage.OnResume(Exit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
example/windows/VideoPlayer/Assets/LockScreenLogo.scale-200.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
example/windows/VideoPlayer/Assets/SplashScreen.scale-200.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
After Width: | Height: | Size: 2.9 KiB |
BIN
example/windows/VideoPlayer/Assets/Square44x44Logo.scale-200.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.2 KiB |
BIN
example/windows/VideoPlayer/Assets/StoreLogo.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
example/windows/VideoPlayer/Assets/Wide310x150Logo.scale-200.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
55
example/windows/VideoPlayer/MainPage.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using ReactNative;
|
||||||
|
using ReactNative.Modules.Core;
|
||||||
|
using ReactNative.Shell;
|
||||||
|
using ReactNativeVideo;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Windows.UI.Xaml.Media.Imaging;
|
||||||
|
|
||||||
|
namespace VideoPlayer
|
||||||
|
{
|
||||||
|
class MainPage : ReactPage
|
||||||
|
{
|
||||||
|
public override string MainComponentName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return "VideoPlayer";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if BUNDLE
|
||||||
|
public override string JavaScriptBundleFile
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return "ms-appx:///ReactAssets/index.windows.bundle";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public override List<IReactPackage> Packages
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new List<IReactPackage>
|
||||||
|
{
|
||||||
|
new MainReactPackage(),
|
||||||
|
new ReactVideoPackage(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool UseDeveloperSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
#if !BUNDLE || DEBUG
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
49
example/windows/VideoPlayer/Package.appxmanifest
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<Package
|
||||||
|
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||||
|
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
|
||||||
|
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||||
|
IgnorableNamespaces="uap mp">
|
||||||
|
|
||||||
|
<Identity
|
||||||
|
Name="176c1514-b49e-4277-ad47-c17d9b8f034b"
|
||||||
|
Publisher="CN=publisher"
|
||||||
|
Version="1.0.0.0" />
|
||||||
|
|
||||||
|
<mp:PhoneIdentity PhoneProductId="176c1514-b49e-4277-ad47-c17d9b8f034b" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||||
|
|
||||||
|
<Properties>
|
||||||
|
<DisplayName>VideoPlayer</DisplayName>
|
||||||
|
<PublisherDisplayName>React Native for UWP</PublisherDisplayName>
|
||||||
|
<Logo>Assets\StoreLogo.png</Logo>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Dependencies>
|
||||||
|
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
|
||||||
|
</Dependencies>
|
||||||
|
|
||||||
|
<Resources>
|
||||||
|
<Resource Language="x-generate"/>
|
||||||
|
</Resources>
|
||||||
|
|
||||||
|
<Applications>
|
||||||
|
<Application Id="App"
|
||||||
|
Executable="$targetnametoken$.exe"
|
||||||
|
EntryPoint="VideoPlayer.App">
|
||||||
|
<uap:VisualElements
|
||||||
|
DisplayName="VideoPlayer"
|
||||||
|
Square150x150Logo="Assets\Square150x150Logo.png"
|
||||||
|
Square44x44Logo="Assets\Square44x44Logo.png"
|
||||||
|
Description="VideoPlayer"
|
||||||
|
BackgroundColor="transparent">
|
||||||
|
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
|
||||||
|
<uap:SplashScreen Image="Assets\SplashScreen.png" />
|
||||||
|
</uap:VisualElements>
|
||||||
|
</Application>
|
||||||
|
</Applications>
|
||||||
|
|
||||||
|
<Capabilities>
|
||||||
|
<Capability Name="internetClient" />
|
||||||
|
</Capabilities>
|
||||||
|
</Package>
|
29
example/windows/VideoPlayer/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("VideoPlayer")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("VideoPlayer")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2016")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
|
[assembly: ComVisible(false)]
|
31
example/windows/VideoPlayer/Properties/Default.rd.xml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<!--
|
||||||
|
This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most
|
||||||
|
developers. However, you can modify these parameters to modify the behavior of the .NET Native
|
||||||
|
optimizer.
|
||||||
|
|
||||||
|
Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919
|
||||||
|
|
||||||
|
To fully enable reflection for VideoPlayer.MyClass and all of its public/private members
|
||||||
|
<Type Name="VideoPlayer.MyClass" Dynamic="Required All"/>
|
||||||
|
|
||||||
|
To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32
|
||||||
|
<TypeInstantiation Name="VideoPlayer.AppClass" Arguments="System.Int32" Activate="Required Public" />
|
||||||
|
|
||||||
|
Using the Namespace directive to apply reflection policy to all the types in a particular namespace
|
||||||
|
<Namespace Name="DataClasses.ViewModels" Seralize="All" />
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
|
||||||
|
<Application>
|
||||||
|
<!--
|
||||||
|
An Assembly element with Name="*Application*" applies to all assemblies in
|
||||||
|
the application package. The asterisks are not wildcards.
|
||||||
|
-->
|
||||||
|
<Assembly Name="*Application*" Dynamic="Required All" />
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Add your application specific runtime directives here. -->
|
||||||
|
|
||||||
|
|
||||||
|
</Application>
|
||||||
|
</Directives>
|
230
example/windows/VideoPlayer/VideoPlayer.csproj
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProjectGuid>{A027BE54-D118-49A4-8D84-0666A2A93E64}</ProjectGuid>
|
||||||
|
<OutputType>AppContainerExe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>VideoPlayer</RootNamespace>
|
||||||
|
<AssemblyName>VideoPlayer</AssemblyName>
|
||||||
|
<DefaultLanguage>en-US</DefaultLanguage>
|
||||||
|
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
|
||||||
|
<TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>
|
||||||
|
<TargetPlatformMinVersion>10.0.10586.0</TargetPlatformMinVersion>
|
||||||
|
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
<PackageCertificateKeyFile>VideoPlayer_TemporaryKey.pfx</PackageCertificateKeyFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugBundle|x86'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x86\DebugBundle\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||||
|
<OutputPath>bin\x86\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseBundle|x86'">
|
||||||
|
<OutputPath>bin\x86\ReleaseBundle\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\ARM\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugBundle|ARM'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\ARM\DebugBundle\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
|
||||||
|
<OutputPath>bin\ARM\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseBundle|ARM'">
|
||||||
|
<OutputPath>bin\ARM\ReleaseBundle\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugBundle|x64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\DebugBundle\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||||
|
<OutputPath>bin\x64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseBundle|x64'">
|
||||||
|
<OutputPath>bin\x64\ReleaseBundle\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
|
||||||
|
<None Include="project.json" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="App.xaml.cs">
|
||||||
|
<DependentUpon>App.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="MainPage.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AppxManifest Include="Package.appxmanifest">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</AppxManifest>
|
||||||
|
<None Include="VideoPlayer_TemporaryKey.pfx" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Properties\Default.rd.xml" />
|
||||||
|
<Content Include="Assets\LockScreenLogo.scale-200.png" />
|
||||||
|
<Content Include="Assets\SplashScreen.scale-200.png" />
|
||||||
|
<Content Include="Assets\Square150x150Logo.scale-200.png" />
|
||||||
|
<Content Include="Assets\Square44x44Logo.scale-200.png" />
|
||||||
|
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
|
||||||
|
<Content Include="Assets\StoreLogo.png" />
|
||||||
|
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ApplicationDefinition Include="App.xaml">
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</ApplicationDefinition>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\node_modules\react-native-video\windows\ReactNativeVideo\ReactNativeVideo.csproj">
|
||||||
|
<Project>{e8f5f57f-757e-4237-ad23-f7a8755427cd}</Project>
|
||||||
|
<Name>ReactNativeVideo</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\node_modules\react-native-windows\ReactWindows\ReactNative\ReactNative.csproj">
|
||||||
|
<Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>
|
||||||
|
<Name>ReactNative</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup Condition="'$(Configuration)' == 'ReleaseBundle' or '$(Configuration)' == 'DebugBundle'">
|
||||||
|
<Content Include="ReactAssets\**\*">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '14.0' ">
|
||||||
|
<VisualStudioVersion>14.0</VisualStudioVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
BIN
example/windows/VideoPlayer/VideoPlayer_TemporaryKey.pfx
Normal file
17
example/windows/VideoPlayer/project.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"Facebook.CSSLayout": "2.0.1-pre",
|
||||||
|
"Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"uap10.0": {}
|
||||||
|
},
|
||||||
|
"runtimes": {
|
||||||
|
"win10-arm": {},
|
||||||
|
"win10-arm-aot": {},
|
||||||
|
"win10-x86": {},
|
||||||
|
"win10-x86-aot": {},
|
||||||
|
"win10-x64": {},
|
||||||
|
"win10-x64-aot": {}
|
||||||
|
}
|
||||||
|
}
|
97
windows/.gitignore
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#Visual Studio files
|
||||||
|
*.[Oo]bj
|
||||||
|
*.user
|
||||||
|
*.aps
|
||||||
|
*.pch
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.ncb
|
||||||
|
*.suo
|
||||||
|
*.tlb
|
||||||
|
*.tlh
|
||||||
|
*.tlog
|
||||||
|
*.bak
|
||||||
|
*.[Cc]ache
|
||||||
|
*.ilk
|
||||||
|
*.log
|
||||||
|
*.lib
|
||||||
|
*.sbr
|
||||||
|
*.sdf
|
||||||
|
*.opensdf
|
||||||
|
*.opendb
|
||||||
|
*.unsuccessfulbuild
|
||||||
|
*.lastbuildstate
|
||||||
|
ipch/
|
||||||
|
[Oo]bj/
|
||||||
|
[Bb]in
|
||||||
|
[Dd]ebug*/
|
||||||
|
[Rr]elease*/
|
||||||
|
*.tlog/
|
||||||
|
Ankh.NoLoad
|
||||||
|
UpgradeLog.htm
|
||||||
|
|
||||||
|
#MonoDevelop
|
||||||
|
*.pidb
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
#Tooling
|
||||||
|
_ReSharper*/
|
||||||
|
*.resharper
|
||||||
|
[Tt]est[Rr]esult*
|
||||||
|
*.sass-cache
|
||||||
|
|
||||||
|
#Project files
|
||||||
|
[Bb]uild/
|
||||||
|
|
||||||
|
#Subversion files
|
||||||
|
.svn
|
||||||
|
|
||||||
|
# Office Temp Files
|
||||||
|
~$*
|
||||||
|
|
||||||
|
# vim Temp Files
|
||||||
|
*~
|
||||||
|
|
||||||
|
#NuGet
|
||||||
|
packages/
|
||||||
|
*.nupkg
|
||||||
|
|
||||||
|
#ncrunch
|
||||||
|
*ncrunch*
|
||||||
|
*crunch*.local.xml
|
||||||
|
|
||||||
|
# visual studio database projects
|
||||||
|
*.dbmdl
|
||||||
|
|
||||||
|
#Test files
|
||||||
|
*.testsettings
|
||||||
|
|
||||||
|
#Other files
|
||||||
|
*.DotSettings
|
||||||
|
.vs/
|
||||||
|
.vscode/
|
||||||
|
*project.lock.json
|
||||||
|
|
||||||
|
#JavaScript files
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
bld/
|
||||||
|
[Ll]og/
|
29
windows/ReactNativeVideo/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("ReactNativeVideo")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ReactNativeVideo")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2016")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
|
[assembly: ComVisible(false)]
|
33
windows/ReactNativeVideo/Properties/ReactNativeVideo.rd.xml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
This file contains Runtime Directives, specifications about types your application accesses
|
||||||
|
through reflection and other dynamic code patterns. Runtime Directives are used to control the
|
||||||
|
.NET Native optimizer and ensure that it does not remove code accessed by your library. If your
|
||||||
|
library does not do any reflection, then you generally do not need to edit this file. However,
|
||||||
|
if your library reflects over types, especially types passed to it or derived from its types,
|
||||||
|
then you should write Runtime Directives.
|
||||||
|
|
||||||
|
The most common use of reflection in libraries is to discover information about types passed
|
||||||
|
to the library. Runtime Directives have three ways to express requirements on types passed to
|
||||||
|
your library.
|
||||||
|
|
||||||
|
1. Parameter, GenericParameter, TypeParameter, TypeEnumerableParameter
|
||||||
|
Use these directives to reflect over types passed as a parameter.
|
||||||
|
|
||||||
|
2. SubTypes
|
||||||
|
Use a SubTypes directive to reflect over types derived from another type.
|
||||||
|
|
||||||
|
3. AttributeImplies
|
||||||
|
Use an AttributeImplies directive to indicate that your library needs to reflect over
|
||||||
|
types or methods decorated with an attribute.
|
||||||
|
|
||||||
|
For more information on writing Runtime Directives for libraries, please visit
|
||||||
|
http://go.microsoft.com/fwlink/?LinkID=391919
|
||||||
|
-->
|
||||||
|
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
|
||||||
|
<Library Name="ReactNativeVideo">
|
||||||
|
|
||||||
|
<!-- add directives for your library here -->
|
||||||
|
|
||||||
|
</Library>
|
||||||
|
</Directives>
|
116
windows/ReactNativeVideo/ReactNativeVideo.csproj
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{E8F5F57F-757E-4237-AD23-F7A8755427CD}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>ReactNativeVideo</RootNamespace>
|
||||||
|
<AssemblyName>ReactNativeVideo</AssemblyName>
|
||||||
|
<DefaultLanguage>en-US</DefaultLanguage>
|
||||||
|
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
|
||||||
|
<TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>
|
||||||
|
<TargetPlatformMinVersion>10.0.10586.0</TargetPlatformMinVersion>
|
||||||
|
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<OutputPath>bin\x86\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\ARM\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<OutputPath>bin\ARM\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<OutputPath>bin\x64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<NoWarn>;2008</NoWarn>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
|
||||||
|
<None Include="project.json" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ReactVideoPackage.cs" />
|
||||||
|
<Compile Include="ReactVideoView.cs" />
|
||||||
|
<Compile Include="ReactVideoViewManager.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ReactVideoEventType.cs" />
|
||||||
|
<Compile Include="ReactVideoEventTypeExtensions.cs" />
|
||||||
|
<EmbeddedResource Include="Properties\ReactNativeVideo.rd.xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\example\node_modules\react-native-windows\ReactWindows\ReactNative\ReactNative.csproj">
|
||||||
|
<Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>
|
||||||
|
<Name>ReactNative</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '14.0' ">
|
||||||
|
<VisualStudioVersion>14.0</VisualStudioVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
15
windows/ReactNativeVideo/ReactVideoEventType.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
namespace ReactNativeVideo
|
||||||
|
{
|
||||||
|
enum ReactVideoEventType
|
||||||
|
{
|
||||||
|
LoadStart,
|
||||||
|
Load,
|
||||||
|
Error,
|
||||||
|
Progress,
|
||||||
|
Seek,
|
||||||
|
End,
|
||||||
|
Stalled,
|
||||||
|
Resume,
|
||||||
|
ReadyForDisplay,
|
||||||
|
}
|
||||||
|
}
|
36
windows/ReactNativeVideo/ReactVideoEventTypeExtensions.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using static System.FormattableString;
|
||||||
|
|
||||||
|
namespace ReactNativeVideo
|
||||||
|
{
|
||||||
|
static class ReactVideoEventTypeExtensions
|
||||||
|
{
|
||||||
|
public static string GetEventName(this ReactVideoEventType eventType)
|
||||||
|
{
|
||||||
|
switch (eventType)
|
||||||
|
{
|
||||||
|
case ReactVideoEventType.LoadStart:
|
||||||
|
return "onVideoLoadStart";
|
||||||
|
case ReactVideoEventType.Load:
|
||||||
|
return "onVideoLoad";
|
||||||
|
case ReactVideoEventType.Error:
|
||||||
|
return "onVideoError";
|
||||||
|
case ReactVideoEventType.Progress:
|
||||||
|
return "onVideoProgress";
|
||||||
|
case ReactVideoEventType.Seek:
|
||||||
|
return "onVideoSeek";
|
||||||
|
case ReactVideoEventType.End:
|
||||||
|
return "onVideoEnd";
|
||||||
|
case ReactVideoEventType.Stalled:
|
||||||
|
return "onPlaybackStalled";
|
||||||
|
case ReactVideoEventType.Resume:
|
||||||
|
return "onPlaybackResume";
|
||||||
|
case ReactVideoEventType.ReadyForDisplay:
|
||||||
|
return "onReadyForDisplay";
|
||||||
|
default:
|
||||||
|
throw new NotSupportedException(
|
||||||
|
Invariant($"No event name added for event type '{eventType}'."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
windows/ReactNativeVideo/ReactVideoPackage.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
using ReactNative.Bridge;
|
||||||
|
using ReactNative.Modules.Core;
|
||||||
|
using ReactNative.UIManager;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace ReactNativeVideo
|
||||||
|
{
|
||||||
|
public class ReactVideoPackage : IReactPackage
|
||||||
|
{
|
||||||
|
public IReadOnlyList<Type> CreateJavaScriptModulesConfig()
|
||||||
|
{
|
||||||
|
return Array.Empty<Type>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<INativeModule> CreateNativeModules(ReactContext reactContext)
|
||||||
|
{
|
||||||
|
return Array.Empty<INativeModule>();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<IViewManager> CreateViewManagers(ReactContext reactContext)
|
||||||
|
{
|
||||||
|
return new List<IViewManager>
|
||||||
|
{
|
||||||
|
new ReactVideoViewManager(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
355
windows/ReactNativeVideo/ReactVideoView.cs
Normal file
@ -0,0 +1,355 @@
|
|||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using ReactNative.UIManager;
|
||||||
|
using ReactNative.UIManager.Events;
|
||||||
|
using System;
|
||||||
|
using Windows.ApplicationModel.Core;
|
||||||
|
using Windows.Media.Core;
|
||||||
|
using Windows.Media.Playback;
|
||||||
|
using Windows.UI.Core;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
|
||||||
|
namespace ReactNativeVideo
|
||||||
|
{
|
||||||
|
class ReactVideoView : MediaPlayerElement, IDisposable
|
||||||
|
{
|
||||||
|
public const string EVENT_PROP_SEEK_TIME = "seekTime";
|
||||||
|
|
||||||
|
private readonly DispatcherTimer _timer;
|
||||||
|
|
||||||
|
private bool _isSourceSet;
|
||||||
|
|
||||||
|
private string _uri;
|
||||||
|
private bool _isLoopingEnabled;
|
||||||
|
private bool _isPaused;
|
||||||
|
private bool _isMuted;
|
||||||
|
private bool _isUserControlEnabled;
|
||||||
|
private bool _isCompleted;
|
||||||
|
private double _volume;
|
||||||
|
private double _rate;
|
||||||
|
|
||||||
|
public ReactVideoView()
|
||||||
|
{
|
||||||
|
_timer = new DispatcherTimer();
|
||||||
|
_timer.Interval = TimeSpan.FromMilliseconds(250.0);
|
||||||
|
_timer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public new string Source
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_uri = value;
|
||||||
|
base.Source = MediaSource.CreateFromUri(new Uri(_uri));
|
||||||
|
_isSourceSet = true;
|
||||||
|
ApplyModifiers();
|
||||||
|
SubscribeEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsLoopingEnabled
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isLoopingEnabled = value;
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
MediaPlayer.IsLoopingEnabled = _isLoopingEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsMuted
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isMuted = value;
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
MediaPlayer.IsMuted = _isMuted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsPaused
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isPaused = value;
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
if (_isPaused)
|
||||||
|
{
|
||||||
|
MediaPlayer.Pause();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MediaPlayer.Play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsUserControlEnabled
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isUserControlEnabled = value;
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
MediaPlayer.SystemMediaTransportControls.IsEnabled = _isUserControlEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Volume
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_volume = value;
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
MediaPlayer.Volume = _volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Rate
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_rate = value;
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
MediaPlayer.PlaybackSession.PlaybackRate = _rate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double ProgressUpdateInterval
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_timer.Interval = TimeSpan.FromSeconds(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Seek(double seek)
|
||||||
|
{
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
MediaPlayer.PlaybackSession.Position = TimeSpan.FromSeconds(seek);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (_isSourceSet)
|
||||||
|
{
|
||||||
|
_timer.Tick -= OnTick;
|
||||||
|
MediaPlayer.SourceChanged -= OnSourceChanged;
|
||||||
|
MediaPlayer.MediaOpened -= OnMediaOpened;
|
||||||
|
MediaPlayer.MediaFailed -= OnMediaFailed;
|
||||||
|
MediaPlayer.MediaEnded -= OnMediaEnded;
|
||||||
|
MediaPlayer.PlaybackSession.BufferingStarted -= OnBufferingStarted;
|
||||||
|
MediaPlayer.PlaybackSession.BufferingEnded -= OnBufferingEnded;
|
||||||
|
MediaPlayer.PlaybackSession.SeekCompleted -= OnSeekCompleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
_timer.Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyModifiers()
|
||||||
|
{
|
||||||
|
IsLoopingEnabled = _isLoopingEnabled;
|
||||||
|
IsMuted = _isMuted;
|
||||||
|
IsPaused = _isPaused;
|
||||||
|
IsUserControlEnabled = _isUserControlEnabled;
|
||||||
|
Volume = _volume;
|
||||||
|
Rate = _rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SubscribeEvents()
|
||||||
|
{
|
||||||
|
_timer.Tick += OnTick;
|
||||||
|
MediaPlayer.SourceChanged += OnSourceChanged;
|
||||||
|
MediaPlayer.MediaOpened += OnMediaOpened;
|
||||||
|
MediaPlayer.MediaFailed += OnMediaFailed;
|
||||||
|
MediaPlayer.MediaEnded += OnMediaEnded;
|
||||||
|
MediaPlayer.PlaybackSession.BufferingStarted += OnBufferingStarted;
|
||||||
|
MediaPlayer.PlaybackSession.BufferingEnded += OnBufferingEnded;
|
||||||
|
MediaPlayer.PlaybackSession.SeekCompleted += OnSeekCompleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTick(object sender, object e)
|
||||||
|
{
|
||||||
|
if (_isSourceSet && !_isCompleted && !_isPaused)
|
||||||
|
{
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher
|
||||||
|
.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.Progress.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
new JObject
|
||||||
|
{
|
||||||
|
{ "currentTime", MediaPlayer.PlaybackSession.Position.TotalSeconds },
|
||||||
|
{ "playableDuration", 0.0 /* TODO */ }
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSourceChanged(MediaPlayer sender, object args)
|
||||||
|
{
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher
|
||||||
|
.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.LoadStart.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
new JObject
|
||||||
|
{
|
||||||
|
{ "src", this._uri }
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnMediaOpened(MediaPlayer sender, object args)
|
||||||
|
{
|
||||||
|
RunOnDispatcher(delegate
|
||||||
|
{
|
||||||
|
var width = MediaPlayer.PlaybackSession.NaturalVideoWidth;
|
||||||
|
var height = MediaPlayer.PlaybackSession.NaturalVideoHeight;
|
||||||
|
var orientation = (width > height) ? "landscape" : "portrait";
|
||||||
|
var size = new JObject
|
||||||
|
{
|
||||||
|
{ "width", width },
|
||||||
|
{ "height", height },
|
||||||
|
{ "orientation", orientation }
|
||||||
|
};
|
||||||
|
|
||||||
|
this.GetReactContext().GetNativeModule<UIManagerModule>().EventDispatcher.DispatchEvent(new ReactVideoView.ReactVideoEvent(ReactVideoEventType.Load.GetEventName(), this.GetTag(), new JObject
|
||||||
|
{
|
||||||
|
{ "duration", MediaPlayer.PlaybackSession.NaturalDuration.TotalSeconds },
|
||||||
|
{ "currentTime", MediaPlayer.PlaybackSession.Position.TotalSeconds },
|
||||||
|
{ "naturalSize", size },
|
||||||
|
{ "canPlayFastForward", false },
|
||||||
|
{ "canPlaySlowForward", false },
|
||||||
|
{ "canPlaySlow", false },
|
||||||
|
{ "canPlayReverse", false },
|
||||||
|
{ "canStepBackward", false },
|
||||||
|
{ "canStepForward", false }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnMediaFailed(MediaPlayer sender, MediaPlayerFailedEventArgs args)
|
||||||
|
{
|
||||||
|
var errorData = new JObject
|
||||||
|
{
|
||||||
|
{ "what", args.Error.ToString() },
|
||||||
|
{ "extra", args.ErrorMessage }
|
||||||
|
};
|
||||||
|
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher
|
||||||
|
.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.Error.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
new JObject
|
||||||
|
{
|
||||||
|
{ "error", errorData }
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnMediaEnded(MediaPlayer sender, object args)
|
||||||
|
{
|
||||||
|
_isCompleted = true;
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher
|
||||||
|
.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.End.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
null));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnBufferingStarted(MediaPlaybackSession sender, object args)
|
||||||
|
{
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher
|
||||||
|
.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.Stalled.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
new JObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnBufferingEnded(MediaPlaybackSession sender, object args)
|
||||||
|
{
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher
|
||||||
|
.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.Resume.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
new JObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSeekCompleted(MediaPlaybackSession sender, object args)
|
||||||
|
{
|
||||||
|
this.GetReactContext()
|
||||||
|
.GetNativeModule<UIManagerModule>()
|
||||||
|
.EventDispatcher.DispatchEvent(
|
||||||
|
new ReactVideoEvent(
|
||||||
|
ReactVideoEventType.Seek.GetEventName(),
|
||||||
|
this.GetTag(),
|
||||||
|
new JObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async void RunOnDispatcher(DispatchedHandler action)
|
||||||
|
{
|
||||||
|
await CoreApplication.GetCurrentView().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, action).AsTask().ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReactVideoEvent : Event
|
||||||
|
{
|
||||||
|
private readonly string _eventName;
|
||||||
|
private readonly JObject _eventData;
|
||||||
|
|
||||||
|
public ReactVideoEvent(string eventName, int viewTag, JObject eventData)
|
||||||
|
: base(viewTag, TimeSpan.FromTicks(Environment.TickCount))
|
||||||
|
{
|
||||||
|
_eventName = eventName;
|
||||||
|
_eventData = eventData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string EventName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _eventName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanCoalesce
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispatch(RCTEventEmitter eventEmitter)
|
||||||
|
{
|
||||||
|
eventEmitter.receiveEvent(ViewTag, EventName, _eventData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
137
windows/ReactNativeVideo/ReactVideoViewManager.cs
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using ReactNative.UIManager;
|
||||||
|
using ReactNative.UIManager.Annotations;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Media;
|
||||||
|
|
||||||
|
namespace ReactNativeVideo
|
||||||
|
{
|
||||||
|
class ReactVideoViewManager : SimpleViewManager<ReactVideoView>
|
||||||
|
{
|
||||||
|
public override string Name
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return "RCTVideo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IReadOnlyDictionary<string, object> ExportedViewConstants
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "ScaleNone", ((int)Stretch.None).ToString() },
|
||||||
|
{ "ScaleToFill", ((int)Stretch.UniformToFill).ToString() },
|
||||||
|
{ "ScaleAspectFit", ((int)Stretch.Uniform).ToString() },
|
||||||
|
{ "ScaleAspectFill", ((int)Stretch.Fill).ToString() },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IReadOnlyDictionary<string, object> ExportedCustomDirectEventTypeConstants
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var events = new Dictionary<string, object>();
|
||||||
|
var eventTypes = Enum.GetValues(typeof(ReactVideoEventType)).OfType<ReactVideoEventType>();
|
||||||
|
foreach (var eventType in eventTypes)
|
||||||
|
{
|
||||||
|
events.Add(eventType.GetEventName(), new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "registrationName", eventType.GetEventName() },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("src")]
|
||||||
|
public void SetSource(ReactVideoView view, JObject source)
|
||||||
|
{
|
||||||
|
view.Source = source.Value<string>("uri");
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("resizeMode")]
|
||||||
|
public void SetResizeMode(ReactVideoView view, string resizeMode)
|
||||||
|
{
|
||||||
|
view.Stretch = (Stretch)int.Parse(resizeMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("repeat")]
|
||||||
|
public void SetRepeat(ReactVideoView view, bool repeat)
|
||||||
|
{
|
||||||
|
view.IsLoopingEnabled = repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("paused")]
|
||||||
|
public void SetPaused(ReactVideoView view, bool paused)
|
||||||
|
{
|
||||||
|
view.IsPaused = paused;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("muted")]
|
||||||
|
public void SetMuted(ReactVideoView view, bool muted)
|
||||||
|
{
|
||||||
|
view.IsMuted = muted;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("volume", DefaultDouble = 1.0)]
|
||||||
|
public void SetVolume(ReactVideoView view, double volume)
|
||||||
|
{
|
||||||
|
view.Volume = volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("seek")]
|
||||||
|
public void SetSeek(ReactVideoView view, double? seek)
|
||||||
|
{
|
||||||
|
if (seek.HasValue)
|
||||||
|
{
|
||||||
|
view.Seek(seek.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("rate", DefaultDouble = 1.0)]
|
||||||
|
public void SetPlaybackRate(ReactVideoView view, double rate)
|
||||||
|
{
|
||||||
|
view.Rate = rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("playInBackground")]
|
||||||
|
public void SetPlayInBackground(ReactVideoView view, bool playInBackground)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("Play in background has not been implemented on Windows.");
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("controls")]
|
||||||
|
public void SetControls(ReactVideoView view, bool controls)
|
||||||
|
{
|
||||||
|
view.IsUserControlEnabled = controls;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ReactProp("progressUpdateInterval")]
|
||||||
|
public void SetProgressUpdateInterval(ReactVideoView view, double progressUpdateInterval)
|
||||||
|
{
|
||||||
|
view.ProgressUpdateInterval = progressUpdateInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnDropViewInstance(ThemedReactContext reactContext, ReactVideoView view)
|
||||||
|
{
|
||||||
|
base.OnDropViewInstance(reactContext, view);
|
||||||
|
view.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override ReactVideoView CreateViewInstance(ThemedReactContext reactContext)
|
||||||
|
{
|
||||||
|
return new ReactVideoView
|
||||||
|
{
|
||||||
|
HorizontalAlignment = HorizontalAlignment.Stretch,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
windows/ReactNativeVideo/project.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
|
||||||
|
"Newtonsoft.Json": "9.0.1"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"uap10.0": {}
|
||||||
|
},
|
||||||
|
"runtimes": {
|
||||||
|
"win10-arm": {},
|
||||||
|
"win10-arm-aot": {},
|
||||||
|
"win10-x86": {},
|
||||||
|
"win10-x86-aot": {},
|
||||||
|
"win10-x64": {},
|
||||||
|
"win10-x64-aot": {}
|
||||||
|
}
|
||||||
|
}
|