ongoing pre-beta tasks #284
21 changed files with 228 additions and 58 deletions
9
app/package-lock.json
generated
9
app/package-lock.json
generated
|
@ -3990,8 +3990,8 @@
|
|||
}
|
||||
},
|
||||
"lbryinc": {
|
||||
"version": "github:lbryio/lbryinc#7910b565d7edda16be1c9d291f296982261ba60a",
|
||||
"from": "github:lbryio/lbryinc#phone-verification",
|
||||
"version": "github:lbryio/lbryinc#f2fff2a331578aef84eb77c108f976967afc50e0",
|
||||
"from": "github:lbryio/lbryinc",
|
||||
"requires": {
|
||||
"lbry-redux": "github:lbryio/lbry-redux#31f7afa8a37f5741dac01fc1ecdf153f3bed95dc",
|
||||
"reselect": "^3.0.0"
|
||||
|
@ -5315,9 +5315,8 @@
|
|||
}
|
||||
},
|
||||
"react-native-phone-input": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/react-native-phone-input/-/react-native-phone-input-0.2.1.tgz",
|
||||
"integrity": "sha1-rGhSoeo32NWP+D3tUtGNe2MD5mc=",
|
||||
"version": "github:lbryio/react-native-phone-input#60fdef484e8bf27328c7fb6a203baab9eb9cd4a1",
|
||||
"from": "github:lbryio/react-native-phone-input",
|
||||
"requires": {
|
||||
"google-libphonenumber": "^2.0.9",
|
||||
"lodash": "^4.17.4",
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
"react-native-fast-image": "^5.0.3",
|
||||
"react-native-fetch-blob": "^0.10.8",
|
||||
"react-native-image-zoom-viewer": "^2.2.5",
|
||||
"react-native-phone-input": "^0.2.1",
|
||||
"react-native-phone-input": "lbryio/react-native-phone-input",
|
||||
"react-native-vector-icons": "^5.0.0",
|
||||
Upstream was last updated 6 months ago and there's been no response from the repo owner. I was thinking we could probably have a separate github org for forked repos. Upstream was last updated 6 months ago and there's been no response from the repo owner. I was thinking we could probably have a separate github org for forked repos.
Alternatively, and so long as it's not against the license to do so, just check the code directly into our repo. Alternatively, and so long as it's not against the license to do so, just check the code directly into our repo.
|
||||
"react-native-video": "lbryio/react-native-video#exoplayer-lbry-android",
|
||||
"react-navigation": "^2.12.1",
|
||||
|
|
|
@ -5,8 +5,8 @@ import {
|
|||
makeSelectMetadataForUri,
|
||||
makeSelectFileInfoForUri,
|
||||
makeSelectIsUriResolving,
|
||||
selectRewardContentClaimIds
|
||||
} from 'lbry-redux';
|
||||
import { selectRewardContentClaimIds } from 'lbryinc';
|
||||
import { selectShowNsfw } from '../../redux/selectors/settings';
|
||||
import FileItem from './view';
|
||||
|
||||
|
|
|
@ -3,8 +3,10 @@ import { normalizeURI } from 'lbry-redux';
|
|||
import { NavigationActions } from 'react-navigation';
|
||||
import { NativeModules, Text, View, TouchableOpacity } from 'react-native';
|
||||
import { navigateToUri } from '../../utils/helper';
|
||||
import Colors from '../../styles/colors';
|
||||
import FileItemMedia from '../fileItemMedia';
|
||||
import FilePrice from '../filePrice';
|
||||
import Icon from 'react-native-vector-icons/FontAwesome5';
|
||||
import Link from '../link';
|
||||
import NsfwOverlay from '../nsfwOverlay';
|
||||
import discoverStyle from '../../styles/discover';
|
||||
|
@ -65,7 +67,10 @@ class FileItem extends React.PureComponent {
|
|||
isResolvingUri={isResolvingUri}
|
||||
style={mediaStyle} />
|
||||
<FilePrice uri={uri} style={discoverStyle.filePriceContainer} textStyle={discoverStyle.filePriceText} />
|
||||
<Text style={discoverStyle.fileItemName}>{title}</Text>
|
||||
<View style={isRewardContent ? discoverStyle.rewardTitleContainer : null}>
|
||||
<Text style={[discoverStyle.fileItemName, discoverStyle.rewardTitle]}>{title}</Text>
|
||||
{isRewardContent && <Icon style={discoverStyle.rewardIcon} name="award" size={20} />}
|
||||
</View>
|
||||
{channelName &&
|
||||
<Link style={discoverStyle.channelName} text={channelName} onPress={() => {
|
||||
const channelUri = normalizeURI(channelName);
|
||||
|
|
|
@ -8,7 +8,7 @@ import {
|
|||
TouchableOpacity,
|
||||
View
|
||||
} from 'react-native';
|
||||
import { navigateToUri } from '../../utils/helper';
|
||||
import { navigateToUri, formatBytes } from '../../utils/helper';
|
||||
import Colors from '../../styles/colors';
|
||||
import FileItemMedia from '../fileItemMedia';
|
||||
import Link from '../../component/link';
|
||||
|
@ -18,27 +18,12 @@ import fileListStyle from '../../styles/fileList';
|
|||
class FileListItem extends React.PureComponent {
|
||||
getStorageForFileInfo = (fileInfo) => {
|
||||
if (!fileInfo.completed) {
|
||||
const written = this.formatBytes(fileInfo.written_bytes);
|
||||
const total = this.formatBytes(fileInfo.total_bytes);
|
||||
const written = formatBytes(fileInfo.written_bytes);
|
||||
const total = formatBytes(fileInfo.total_bytes);
|
||||
return `(${written} / ${total})`;
|
||||
}
|
||||
|
||||
return this.formatBytes(fileInfo.written_bytes);
|
||||
}
|
||||
|
||||
formatBytes = (bytes) => {
|
||||
if (bytes < 1048576) { // < 1MB
|
||||
const value = (bytes / 1024.0).toFixed(0);
|
||||
return `${value} KB`;
|
||||
}
|
||||
|
||||
if (bytes < 1073741824) { // < 1GB
|
||||
const value = (bytes / (1024.0 * 1024.0)).toFixed(0);
|
||||
return `${value} MB`;
|
||||
}
|
||||
|
||||
const value = (bytes / (1024.0 * 1024.0 * 1024.0)).toFixed(0);
|
||||
return `${value} GB`;
|
||||
return formatBytes(fileInfo.written_bytes);
|
||||
}
|
||||
|
||||
formatTitle = (title) => {
|
||||
|
@ -90,19 +75,19 @@ class FileListItem extends React.PureComponent {
|
|||
<FileItemMedia style={fileListStyle.thumbnail}
|
||||
blurRadius={obscureNsfw ? 15 : 0}
|
||||
resizeMode="cover"
|
||||
title={title}
|
||||
title={(title || name)}
|
||||
thumbnail={metadata ? metadata.thumbnail : null} />
|
||||
<View style={fileListStyle.detailsContainer}>
|
||||
{isResolving && (
|
||||
{!title && !name && !channel && isResolving && (
|
||||
<View>
|
||||
<Text style={fileListStyle.uri}>{uri}</Text>
|
||||
<View style={fileListStyle.row}>
|
||||
{(!title && !name) && <Text style={fileListStyle.uri}>{uri}</Text>}
|
||||
{(!title && !name) && <View style={fileListStyle.row}>
|
||||
<ActivityIndicator size={"small"} color={Colors.LbryGreen} />
|
||||
</View>
|
||||
</View>}
|
||||
</View>)}
|
||||
|
||||
{!isResolving && <Text style={fileListStyle.title}>{this.formatTitle(title) || this.formatTitle(name)}</Text>}
|
||||
{!isResolving && channel &&
|
||||
{(title || name) && <Text style={fileListStyle.title}>{this.formatTitle(title) || this.formatTitle(name)}</Text>}
|
||||
{channel &&
|
||||
<Link style={fileListStyle.publisher} text={channel} onPress={() => {
|
||||
const channelUri = normalizeURI(channel);
|
||||
navigateToUri(navigation, channelUri);
|
||||
|
|
|
@ -115,6 +115,11 @@ class MediaPlayer extends React.PureComponent {
|
|||
this.hidePlayerControls();
|
||||
}
|
||||
|
||||
manualHidePlayerControls = () => {
|
||||
this.clearControlsTimeout();
|
||||
this.setState({ areControlsVisible: false });
|
||||
}
|
||||
|
||||
hidePlayerControls() {
|
||||
const player = this;
|
||||
let timeout = setTimeout(() => {
|
||||
|
@ -123,6 +128,14 @@ class MediaPlayer extends React.PureComponent {
|
|||
player.setState({ controlsTimeout: timeout });
|
||||
}
|
||||
|
||||
togglePlayerControls = () => {
|
||||
if (this.state.areControlsVisible) {
|
||||
this.manualHidePlayerControls();
|
||||
} else {
|
||||
this.showPlayerControls();
|
||||
}
|
||||
}
|
||||
|
||||
togglePlay = () => {
|
||||
this.showPlayerControls();
|
||||
this.setState({ paused: !this.state.paused });
|
||||
|
@ -342,7 +355,7 @@ class MediaPlayer extends React.PureComponent {
|
|||
onEnd={this.onEnd}
|
||||
/>
|
||||
|
||||
<TouchableOpacity style={mediaPlayerStyle.playerControls} onPress={this.showPlayerControls}>
|
||||
<TouchableOpacity style={mediaPlayerStyle.playerControls} onPress={this.togglePlayerControls}>
|
||||
{this.renderPlayerControls()}
|
||||
</TouchableOpacity>
|
||||
|
||||
|
|
23
app/src/component/relatedContent/index.js
Normal file
23
app/src/component/relatedContent/index.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
import { connect } from 'react-redux';
|
||||
import {
|
||||
makeSelectClaimForUri,
|
||||
doSearch,
|
||||
makeSelectRecommendedContentForUri,
|
||||
selectIsSearching,
|
||||
} from 'lbry-redux';
|
||||
import RelatedContent from './view';
|
||||
|
||||
const select = (state, props) => ({
|
||||
claim: makeSelectClaimForUri(props.uri)(state),
|
||||
recommendedContent: makeSelectRecommendedContentForUri(props.uri)(state),
|
||||
isSearching: selectIsSearching(state),
|
||||
});
|
||||
|
||||
const perform = dispatch => ({
|
||||
search: query => dispatch(doSearch(query, 10, undefined, true)),
|
||||
});
|
||||
|
||||
export default connect(
|
||||
select,
|
||||
perform
|
||||
)(RelatedContent);
|
66
app/src/component/relatedContent/view.js
Normal file
66
app/src/component/relatedContent/view.js
Normal file
|
@ -0,0 +1,66 @@
|
|||
import React from 'react';
|
||||
import { ActivityIndicator, FlatList, Text, View } from 'react-native';
|
||||
import { navigateToUri } from '../../utils/helper';
|
||||
import Colors from '../../styles/colors';
|
||||
import FileListItem from '../fileListItem';
|
||||
import fileListStyle from '../../styles/fileList';
|
||||
import relatedContentStyle from '../../styles/relatedContent';
|
||||
|
||||
export default class RelatedContent extends React.PureComponent<Props> {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.didSearch = undefined;
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.getRecommendedContent();
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps: Props) {
|
||||
const { claim, uri } = this.props;
|
||||
|
||||
if (uri !== prevProps.uri) {
|
||||
this.didSearch = false;
|
||||
}
|
||||
|
||||
if (claim && !this.didSearch) {
|
||||
this.getRecommendedContent();
|
||||
}
|
||||
}
|
||||
|
||||
getRecommendedContent() {
|
||||
const { claim, search } = this.props;
|
||||
|
||||
if (claim && claim.value && claim.value.stream && claim.value.stream.metadata) {
|
||||
const { title } = claim.value.stream.metadata;
|
||||
search(title);
|
||||
this.didSearch = true;
|
||||
}
|
||||
}
|
||||
|
||||
didSearch: ?boolean;
|
||||
|
||||
render() {
|
||||
const { recommendedContent, isSearching, navigation } = this.props;
|
||||
|
||||
if (!isSearching && (!recommendedContent || recommendedContent.length === 0)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<View style={relatedContentStyle.container}>
|
||||
<Text style={relatedContentStyle.title}>Related Content</Text>
|
||||
{recommendedContent && recommendedContent.map(recommendedUri => (
|
||||
<FileListItem
|
||||
style={fileListStyle.item}
|
||||
key={recommendedUri}
|
||||
uri={recommendedUri}
|
||||
navigation={navigation}
|
||||
onPress={() => navigateToUri(navigation, recommendedUri, { autoplay: true })} />
|
||||
))}
|
||||
{isSearching && <ActivityIndicator size="small" color={Colors.LbryGreen} style={relatedContentStyle.loading} />}
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
|
@ -5,6 +5,7 @@ import {
|
|||
selectFeaturedUris,
|
||||
selectFetchingFeaturedUris
|
||||
} from 'lbry-redux';
|
||||
import { doFetchRewardedContent } from 'lbryinc';
|
||||
import DiscoverPage from './view';
|
||||
|
||||
const select = state => ({
|
||||
|
@ -15,6 +16,7 @@ const select = state => ({
|
|||
|
||||
const perform = dispatch => ({
|
||||
fetchFeaturedUris: () => dispatch(doFetchFeaturedUris()),
|
||||
fetchRewardedContent: () => dispatch(doFetchRewardedContent()),
|
||||
});
|
||||
|
||||
export default connect(select, perform)(DiscoverPage);
|
|
@ -41,7 +41,9 @@ class DiscoverPage extends React.PureComponent {
|
|||
}
|
||||
});
|
||||
|
||||
this.props.fetchFeaturedUris();
|
||||
const { fetchFeaturedUris, fetchRewardedContent } = this.props;
|
||||
fetchFeaturedUris();
|
||||
fetchRewardedContent();
|
||||
}
|
||||
|
||||
render() {
|
||||
|
|
|
@ -9,9 +9,9 @@ import {
|
|||
makeSelectClaimForUri,
|
||||
makeSelectContentTypeForUri,
|
||||
makeSelectMetadataForUri,
|
||||
selectRewardContentClaimIds,
|
||||
selectBlackListedOutpoints,
|
||||
selectBlackListedOutpoints,
|
||||
} from 'lbry-redux';
|
||||
import { selectRewardContentClaimIds } from 'lbryinc';
|
||||
import { doDeleteFile, doStopDownloadingFile } from '../../redux/actions/file';
|
||||
import FilePage from './view';
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ import {
|
|||
View,
|
||||
WebView
|
||||
} from 'react-native';
|
||||
import { navigateToUri } from '../../utils/helper';
|
||||
import ImageViewer from 'react-native-image-zoom-viewer';
|
||||
import Button from '../../component/button';
|
||||
import Colors from '../../styles/colors';
|
||||
|
@ -25,6 +26,7 @@ import FilePrice from '../../component/filePrice';
|
|||
import FloatingWalletBalance from '../../component/floatingWalletBalance';
|
||||
import Link from '../../component/link';
|
||||
import MediaPlayer from '../../component/mediaPlayer';
|
||||
import RelatedContent from '../../component/relatedContent';
|
||||
import UriBar from '../../component/uriBar';
|
||||
import Video from 'react-native-video';
|
||||
import filePageStyle from '../../styles/filePage';
|
||||
|
@ -435,19 +437,23 @@ class FilePage extends React.PureComponent {
|
|||
onPress={this.onStopDownloadPressed} />
|
||||
}
|
||||
</View>}
|
||||
<ScrollView style={showActions ? filePageStyle.scrollContainerActions : filePageStyle.scrollContainer}>
|
||||
<ScrollView
|
||||
style={showActions ? filePageStyle.scrollContainerActions : filePageStyle.scrollContainer}
|
||||
contentContainerstyle={showActions ? null : filePageStyle.scrollContent}>
|
||||
<Text style={filePageStyle.title} selectable={true}>{title}</Text>
|
||||
{channelName && <Link style={filePageStyle.channelName}
|
||||
selectable={true}
|
||||
text={channelName}
|
||||
onPress={() => {
|
||||
const channelUri = normalizeURI(channelName);
|
||||
navigation.navigate({ routeName: 'File', key: 'filePage', params: { uri: channelUri }});
|
||||
navigateToUri(navigation, channelUri);
|
||||
}} />}
|
||||
|
||||
{description && description.length > 0 && <View style={filePageStyle.divider} />}
|
||||
|
||||
{description && <Text style={filePageStyle.description} selectable={true}>{this.linkify(description)}</Text>}
|
||||
|
||||
<RelatedContent navigation={navigation} uri={uri} />
|
||||
</ScrollView>
|
||||
</View>
|
||||
)}
|
||||
|
|
|
@ -14,7 +14,7 @@ const select = (state) => ({
|
|||
});
|
||||
|
||||
const perform = dispatch => ({
|
||||
search: (query) => dispatch(doSearch(query))
|
||||
search: (query) => dispatch(doSearch(query, 25))
|
||||
});
|
||||
|
||||
export default connect(select, perform)(SearchPage);
|
||||
|
|
|
@ -2,6 +2,7 @@ import { connect } from 'react-redux';
|
|||
import { doBalanceSubscribe, doNotify } from 'lbry-redux';
|
||||
import {
|
||||
doAuthenticate,
|
||||
doFetchRewardedContent,
|
||||
doUserEmailToVerify,
|
||||
doUserEmailVerify,
|
||||
doUserEmailVerifyFailure,
|
||||
|
@ -18,8 +19,9 @@ const select = state => ({
|
|||
|
||||
const perform = dispatch => ({
|
||||
authenticate: (appVersion, os) => dispatch(doAuthenticate(appVersion, os)),
|
||||
deleteCompleteBlobs: () => dispatch(doDeleteCompleteBlobs()),
|
||||
balanceSubscribe: () => dispatch(doBalanceSubscribe()),
|
||||
deleteCompleteBlobs: () => dispatch(doDeleteCompleteBlobs()),
|
||||
fetchRewardedContent: () => dispatch(doFetchRewardedContent()),
|
||||
notify: data => dispatch(doNotify(data)),
|
||||
setEmailToVerify: email => dispatch(doUserEmailToVerify(email)),
|
||||
verifyUserEmail: (token, recaptcha) => dispatch(doUserEmailVerify(token, recaptcha)),
|
||||
|
|
|
@ -50,6 +50,8 @@ class SplashScreen extends React.PureComponent {
|
|||
AsyncStorage.setItem('firstLaunchTime', String(moment().unix()));
|
||||
}
|
||||
});
|
||||
|
||||
this.props.fetchRewardedContent();
|
||||
}
|
||||
|
||||
updateStatus() {
|
||||
|
@ -109,7 +111,7 @@ class SplashScreen extends React.PureComponent {
|
|||
});
|
||||
}
|
||||
} else {
|
||||
navigation.navigate({ routeName: 'File', key: 'filePage', params: { uri: launchUrl } });
|
||||
navigateToUri(navigation, launchUrl);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -17,7 +17,7 @@ class WalletPage extends React.PureComponent {
|
|||
<View>
|
||||
<View style={walletStyle.warning}>
|
||||
<Text style={walletStyle.warningText}>
|
||||
This is beta software. You may lose any LBC that you send to your wallet due to uninstallation, software bugs, deleted files, or malicious third-party software. You should not use this wallet as your primary wallet. If you understand the risks and you wish to continue, please click the button below.
|
||||
This is beta software. You may lose any LBC that you send to your wallet due to uninstallation, software bugs, deleted files, or malicious third-party software. You should not use this wallet as your primary wallet. If you understand the risks and you wish to continue, please tap the button below.
|
||||
</Text>
|
||||
</View>
|
||||
<Button text={'I understand the risks'} style={[walletStyle.button, walletStyle.understand]}
|
||||
|
|
|
@ -15,6 +15,14 @@ import Constants from '../../constants';
|
|||
|
||||
const DOWNLOAD_POLL_INTERVAL = 250;
|
||||
|
||||
const deleteBlobsForSdHash = (sdHash) => {
|
||||
Lbry.blob_list({ sd_hash: sdHash }).then(hashes => {
|
||||
hashes.filter(hash => hash != sdHash).forEach(hash => {
|
||||
Lbry.blob_delete({ blob_hash: hash });
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
export function doUpdateLoadStatus(uri, outpoint) {
|
||||
return (dispatch, getState) => {
|
||||
Lbry.file_list({
|
||||
|
@ -44,10 +52,10 @@ export function doUpdateLoadStatus(uri, outpoint) {
|
|||
}
|
||||
|
||||
// Once a download has been completed, delete the individual blob files to save space
|
||||
Lbry.blob_list({ sd_hash: fileInfo.sd_hash }).then(hashes => {
|
||||
hashes.filter(hash => hash != fileInfo.sd_hash).forEach(hash => {
|
||||
Lbry.blob_delete({ blob_hash: hash });
|
||||
});
|
||||
Lbry.file_set_status({ status: 'stop', sd_hash: fileInfo.sd_hash }).then(() => {
|
||||
deleteBlobsForSdHash(fileInfo.sd_hash);
|
||||
}).catch(() => {
|
||||
deleteBlobsForSdHash(fileInfo.sd_hash);
|
||||
});
|
||||
|
||||
/*const notif = new window.Notification('LBRY Download Complete', {
|
||||
|
@ -316,10 +324,10 @@ export function doDeleteCompleteBlobs() {
|
|||
Lbry.file_list().then(files => {
|
||||
files.forEach(fileInfo => {
|
||||
if (fileInfo.completed) {
|
||||
Lbry.blob_list({ sd_hash: fileInfo.sd_hash }).then(hashes => {
|
||||
hashes.filter(hash => hash != fileInfo.sd_hash).forEach(hash => {
|
||||
Lbry.blob_delete({ blob_hash: hash });
|
||||
});
|
||||
Lbry.file_set_status({ status: 'stop', sd_hash: fileInfo.sd_hash }).then(() => {
|
||||
deleteBlobsForSdHash(fileInfo.sd_hash);
|
||||
}).catch(() => {
|
||||
deleteBlobsForSdHash(fileInfo.sd_hash);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -107,10 +107,24 @@ const discoverStyle = StyleSheet.create({
|
|||
height: '100%'
|
||||
},
|
||||
overlayText: {
|
||||
color: '#ffffff',
|
||||
color: Colors.White,
|
||||
fontSize: 14,
|
||||
textAlign: 'center',
|
||||
fontFamily: 'Metropolis-Regular'
|
||||
},
|
||||
rewardTitleContainer: {
|
||||
alignItems: 'center',
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'space-between'
|
||||
},
|
||||
rewardIcon: {
|
||||
color: Colors.LbryGreen,
|
||||
flex: 0.1,
|
||||
textAlign: 'right',
|
||||
marginTop: 6
|
||||
},
|
||||
rewardTitle: {
|
||||
flex: 0.9
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -43,8 +43,9 @@ const filePageStyle = StyleSheet.create({
|
|||
},
|
||||
scrollContainer: {
|
||||
flex: 1,
|
||||
marginTop: -16,
|
||||
marginBottom: -4,
|
||||
marginTop: -16
|
||||
},
|
||||
scrollContent: {
|
||||
paddingTop: 10
|
||||
},
|
||||
scrollContainerActions: {
|
||||
|
@ -73,7 +74,7 @@ const filePageStyle = StyleSheet.create({
|
|||
lineHeight: 20,
|
||||
marginLeft: 20,
|
||||
marginRight: 20,
|
||||
marginBottom: 40
|
||||
marginBottom: 16
|
||||
},
|
||||
thumbnail: {
|
||||
width: screenWidth,
|
||||
|
|
37
app/src/styles/relatedContent.js
Normal file
37
app/src/styles/relatedContent.js
Normal file
|
@ -0,0 +1,37 @@
|
|||
import { StyleSheet } from 'react-native';
|
||||
import Colors from './colors';
|
||||
|
||||
const relatedContentStyle = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
paddingTop: 16,
|
||||
paddingBottom: 16,
|
||||
paddingLeft: 24,
|
||||
paddingRight: 24,
|
||||
borderTopColor: Colors.LighterGrey,
|
||||
borderTopWidth: 1
|
||||
},
|
||||
title: {
|
||||
fontFamily: 'Metropolis-Regular',
|
||||
fontSize: 18,
|
||||
},
|
||||
itemList: {
|
||||
flex: 1,
|
||||
},
|
||||
scrollContainer: {
|
||||
flex: 1,
|
||||
paddingLeft: 16,
|
||||
paddingRight: 16,
|
||||
marginTop: 16,
|
||||
marginBottom: 60
|
||||
},
|
||||
scrollPadding: {
|
||||
marginTop: -16,
|
||||
paddingBottom: 16
|
||||
},
|
||||
loading: {
|
||||
marginTop: 16
|
||||
}
|
||||
});
|
||||
|
||||
export default relatedContentStyle;
|
|
@ -78,7 +78,6 @@ public class LbrynetService extends PythonService {
|
|||
String serviceDescription = "The LBRY service is running in the background.";
|
||||
|
||||
Context context = getApplicationContext();
|
||||
|
||||
NotificationManager notificationManager =
|
||||
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
|
@ -145,11 +144,17 @@ public class LbrynetService extends PythonService {
|
|||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (stopServiceReceiver != null) {
|
||||
unregisterReceiver(stopServiceReceiver);
|
||||
stopServiceReceiver = null;
|
||||
}
|
||||
|
||||
Context context = getApplicationContext();
|
||||
NotificationManager notificationManager =
|
||||
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.cancelAll();
|
||||
|
||||
super.onDestroy();
|
||||
serviceInstance = null;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue
Can you make an upstream request?
We have a lot of repos and it would be great to get maintained upstream fixes