diff --git a/app/index.js b/app/index.js
index da8ab0b6..84a59653 100644
--- a/app/index.js
+++ b/app/index.js
@@ -1,25 +1,3 @@
-import React from 'react';
-import {AppRegistry, StyleSheet, Text, View} from 'react-native';
+import LBRYApp from './src/index';
-class InfoComponent extends React.Component {
- render() {
- return (
-
- LBRY UI
-
- );
- }
-}
-var styles = StyleSheet.create({
- container: {
- flex: 1,
- justifyContent: 'center',
- },
- title: {
- fontSize: 20,
- textAlign: 'center',
- margin: 10,
- },
-});
-
-AppRegistry.registerComponent('LBRYApp', () => InfoComponent);
+export default LBRYApp;
diff --git a/app/src/component/AppNavigator.js b/app/src/component/AppNavigator.js
index 4ac3c139..893bd259 100644
--- a/app/src/component/AppNavigator.js
+++ b/app/src/component/AppNavigator.js
@@ -1,13 +1,16 @@
import React from 'react';
import DiscoverPage from '../page/discover';
import FilePage from '../page/file';
+import SettingsPage from '../page/settings';
import SplashScreen from '../page/splash';
import { addNavigationHelpers, DrawerNavigator, StackNavigator } from 'react-navigation';
import { connect } from 'react-redux';
import { addListener } from '../utils/redux';
-import { BackHandler } from 'react-native';
+import { AppState, BackHandler, NativeModules } from 'react-native';
+import { SETTINGS } from 'lbry-redux';
import Feather from 'react-native-vector-icons/Feather';
import discoverStyle from '../styles/discover';
+import { makeSelectClientSetting } from '../redux/selectors/settings';
const discoverStack = StackNavigator({
Discover: {
@@ -30,6 +33,10 @@ const discoverStack = StackNavigator({
const drawer = DrawerNavigator({
Discover: { screen: discoverStack },
+ Settings: {
+ screen: SettingsPage,
+ headerMode: 'screen'
+ }
}, {
drawerWidth: 300,
headerMode: 'none'
@@ -48,6 +55,7 @@ export const AppNavigator = new StackNavigator({
class AppWithNavigationState extends React.Component {
componentWillMount() {
+ AppState.addEventListener('change', this._handleAppStateChange);
BackHandler.addEventListener('hardwareBackPress', function() {
const { dispatch, navigation, nav } = this.props;
if (nav.routes.length === 2 && nav.routes[1].routeName === 'Main') {
@@ -61,8 +69,21 @@ class AppWithNavigationState extends React.Component {
}
componentWillUnmount() {
+ AppState.removeEventListener('change', this._handleAppStateChange);
BackHandler.removeEventListener('hardwareBackPress');
}
+
+ _handleAppStateChange = (nextAppState) => {
+ const { keepDaemonRunning } = this.props;
+ if (AppState.currentState &&
+ AppState.currentState.match(/inactive|background/) &&
+ NativeModules.DaemonServiceControl) {
+ if (!keepDaemonRunning) {
+ // terminate the daemon background service when is suspended / inactive
+ NativeModules.DaemonServiceControl.stopService();
+ }
+ }
+ }
render() {
const { dispatch, nav } = this.props;
@@ -80,6 +101,8 @@ class AppWithNavigationState extends React.Component {
const mapStateToProps = state => ({
nav: state.nav,
+ keepDaemonRunning: makeSelectClientSetting(SETTINGS.KEEP_DAEMON_RUNNING)(state),
+ showNsfw: makeSelectClientSetting(SETTINGS.SHOW_NSFW)(state)
});
export default connect(mapStateToProps)(AppWithNavigationState);
\ No newline at end of file
diff --git a/app/src/component/mediaPlayer/view.js b/app/src/component/mediaPlayer/view.js
index 0718e715..1b76fc30 100644
--- a/app/src/component/mediaPlayer/view.js
+++ b/app/src/component/mediaPlayer/view.js
@@ -22,7 +22,7 @@ class MediaPlayer extends React.PureComponent {
resizeMode: 'stretch',
duration: 0.0,
currentTime: 0.0,
- paused: false,
+ paused: true,
fullscreenMode: false,
areControlsVisible: true,
controlsTimeout: -1,
@@ -142,7 +142,7 @@ class MediaPlayer extends React.PureComponent {
return val;
}
- seekTo = (time = 0) => {
+ seekTo(time = 0) {
if (time > this.state.duration) {
return;
}
diff --git a/app/src/index.js b/app/src/index.js
index c3352310..826645d6 100644
--- a/app/src/index.js
+++ b/app/src/index.js
@@ -1,7 +1,7 @@
import React from 'react';
import { Provider, connect } from 'react-redux';
import DiscoverPage from './page/discover';
-import { AppRegistry, StyleSheet, Text, View, AsyncStorage } from 'react-native';
+import { AppRegistry, AppState, StyleSheet, Text, View, AsyncStorage, NativeModules } from 'react-native';
import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
import {
StackNavigator, addNavigationHelpers
@@ -20,6 +20,7 @@ import {
searchReducer,
walletReducer
} from 'lbry-redux';
+import settingsReducer from './redux/reducers/settings';
import { reactNavigationMiddleware } from './utils/redux';
function isFunction(object) {
@@ -64,7 +65,8 @@ const reducers = combineReducers({
fileInfo: fileInfoReducer,
search: searchReducer,
wallet: walletReducer,
- nav: navigatorReducer
+ nav: navigatorReducer,
+ settings: settingsReducer
});
const bulkThunk = createBulkThunkMiddleware();
diff --git a/app/src/page/settings/index.js b/app/src/page/settings/index.js
index e69de29b..3d05e8e7 100644
--- a/app/src/page/settings/index.js
+++ b/app/src/page/settings/index.js
@@ -0,0 +1,16 @@
+import { connect } from 'react-redux';
+import { SETTINGS } from 'lbry-redux';
+import { doSetClientSetting } from '../../redux/actions/settings';
+import { makeSelectClientSetting } from '../../redux/selectors/settings';
+import SettingsPage from './view';
+
+const select = state => ({
+ keepDaemonRunning: makeSelectClientSetting(SETTINGS.KEEP_DAEMON_RUNNING)(state),
+ showNsfw: makeSelectClientSetting(SETTINGS.SHOW_NSFW)(state),
+});
+
+const perform = dispatch => ({
+ setClientSetting: (key, value) => dispatch(doSetClientSetting(key, value)),
+});
+
+export default connect(select, perform)(SettingsPage);
diff --git a/app/src/page/settings/view.js b/app/src/page/settings/view.js
index e69de29b..9c7bb53d 100644
--- a/app/src/page/settings/view.js
+++ b/app/src/page/settings/view.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import { SETTINGS } from 'lbry-redux';
+import { Text, View, ScrollView, Switch } from 'react-native';
+import settingsStyle from '../../styles/settings';
+
+class SettingsPage extends React.PureComponent {
+ static navigationOptions = {
+ title: 'Settings'
+ }
+
+ render() {
+ const {
+ keepDaemonRunning,
+ showNsfw,
+ setClientSetting
+ } = this.props;
+
+ return (
+
+ Settings
+
+
+
+ Keep the daemon background service running when the app is suspended.
+ Enable this option for quicker app launch and to keep the synchronisation with the blockchain up to date.
+
+
+ setClientSetting(SETTINGS.KEEP_DAEMON_RUNNING, value)} />
+
+
+
+
+ );
+ }
+}
+
+export default SettingsPage;
diff --git a/app/src/redux/actions/settings.js b/app/src/redux/actions/settings.js
new file mode 100644
index 00000000..aa9f9e61
--- /dev/null
+++ b/app/src/redux/actions/settings.js
@@ -0,0 +1,11 @@
+import { ACTIONS } from 'lbry-redux';
+
+export function doSetClientSetting(key, value) {
+ return {
+ type: ACTIONS.CLIENT_SETTING_CHANGED,
+ data: {
+ key,
+ value,
+ },
+ };
+}
diff --git a/app/src/redux/reducers/settings.js b/app/src/redux/reducers/settings.js
new file mode 100644
index 00000000..8a76e391
--- /dev/null
+++ b/app/src/redux/reducers/settings.js
@@ -0,0 +1,26 @@
+import { ACTIONS } from 'lbry-redux';
+
+const reducers = {};
+const defaultState = {
+ clientSettings: {
+ keepDaemonRunning: true,
+ showNsfw: false
+ }
+};
+
+reducers[ACTIONS.CLIENT_SETTING_CHANGED] = (state, action) => {
+ const { key, value } = action.data;
+ const clientSettings = Object.assign({}, state.clientSettings);
+
+ clientSettings[key] = value;
+
+ return Object.assign({}, state, {
+ clientSettings,
+ });
+};
+
+export default function reducer(state = defaultState, action) {
+ const handler = reducers[action.type];
+ if (handler) return handler(state, action);
+ return state;
+}
diff --git a/app/src/redux/selectors/settings.js b/app/src/redux/selectors/settings.js
new file mode 100644
index 00000000..1c4f0b7f
--- /dev/null
+++ b/app/src/redux/selectors/settings.js
@@ -0,0 +1,19 @@
+import { SETTINGS } from 'lbry-redux';
+import { createSelector } from 'reselect';
+
+const selectState = state => state.settings || {};
+
+export const selectDaemonSettings = createSelector(selectState, state => state.daemonSettings);
+
+export const selectClientSettings = createSelector(
+ selectState,
+ state => state.clientSettings || {}
+);
+
+export const makeSelectClientSetting = setting =>
+ createSelector(selectClientSettings, settings => (settings ? settings[setting] : undefined));
+
+// refactor me
+export const selectShowNsfw = makeSelectClientSetting(SETTINGS.SHOW_NSFW);
+
+export const selectKeepDaemonRunning = makeSelectClientSetting(SETTINGS.KEEP_DAEMON_RUNNING);
diff --git a/app/src/styles/mediaPlayer.js b/app/src/styles/mediaPlayer.js
index e689162c..91bac902 100644
--- a/app/src/styles/mediaPlayer.js
+++ b/app/src/styles/mediaPlayer.js
@@ -77,7 +77,7 @@ const mediaPlayerStyle = StyleSheet.create({
seekerCircle: {
borderRadius: 12,
position: 'relative',
- top: 8,
+ top: 16,
left: 8,
height: 12,
width: 12,
@@ -85,15 +85,15 @@ const mediaPlayerStyle = StyleSheet.create({
},
seekerHandle: {
position: 'absolute',
- height: 28,
- width: 28,
+ height: 36,
+ width: 36,
bottom: -12,
marginLeft: -8
},
bigSeekerCircle: {
borderRadius: 24,
position: 'relative',
- top: 2,
+ top: 10,
left: 8,
height: 24,
width: 24,
diff --git a/app/src/styles/settings.js b/app/src/styles/settings.js
new file mode 100644
index 00000000..34ed785f
--- /dev/null
+++ b/app/src/styles/settings.js
@@ -0,0 +1,37 @@
+import { StyleSheet } from 'react-native';
+
+const settingsStyle = StyleSheet.create({
+ title: {
+ fontSize: 20,
+ fontWeight: 'bold',
+ margin: 16
+ },
+ scrollContainer: {
+ paddingLeft: 16,
+ paddingRight: 16,
+ paddingBottom: 16
+ },
+ row: {
+ marginBottom: 12,
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'space-between'
+ },
+ switchText: {
+ width: '70%'
+ },
+ switchContainer: {
+ width: '25%'
+ },
+ label: {
+ fontSize: 14,
+ fontFamily: 'Metropolis-Regular'
+ },
+ description: {
+ fontSize: 12,
+ fontFamily: 'Metropolis-Regular',
+ color: '#aaaaaa'
+ }
+});
+
+export default settingsStyle;
\ No newline at end of file
diff --git a/src/main/assets/index.android.bundle b/src/main/assets/index.android.bundle
index dc1541da..a59fcdf9 100644
--- a/src/main/assets/index.android.bundle
+++ b/src/main/assets/index.android.bundle
@@ -1439,7 +1439,11 @@ __d(function (global, require, module, exports, _dependencyMap) {
var _lbryRedux = require(_dependencyMap[11], "lbry-redux");
- var _redux2 = require(_dependencyMap[12], "./utils/redux");
+ var _settings = require(_dependencyMap[12], "./redux/reducers/settings");
+
+ var _settings2 = babelHelpers.interopRequireDefault(_settings);
+
+ var _redux2 = require(_dependencyMap[13], "./utils/redux");
function isFunction(object) {
return typeof object === 'function';
@@ -1498,7 +1502,8 @@ __d(function (global, require, module, exports, _dependencyMap) {
fileInfo: _lbryRedux.fileInfoReducer,
search: _lbryRedux.searchReducer,
wallet: _lbryRedux.walletReducer,
- nav: navigatorReducer
+ nav: navigatorReducer,
+ settings: _settings2.default
});
var bulkThunk = createBulkThunkMiddleware();
var middleware = [_reduxThunk2.default, bulkThunk, _redux2.reactNavigationMiddleware];
@@ -1536,13 +1541,13 @@ __d(function (global, require, module, exports, _dependencyMap) {
store: store,
__source: {
fileName: _jsxFileName,
- lineNumber: 107
+ lineNumber: 109
}
},
_react2.default.createElement(_AppNavigator2.default, {
__source: {
fileName: _jsxFileName,
- lineNumber: 108
+ lineNumber: 110
}
})
);
@@ -1556,7 +1561,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
});
exports.default = LBRYApp;
-},11,[12,22,61,66,36,376,609,633,645,647,654,62,628],"LBRYApp/src/index.js");
+},11,[12,22,61,66,36,376,609,639,651,653,660,62,661,634],"LBRYApp/src/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -7671,8 +7676,8 @@ __d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
});
- exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = undefined;
- exports.selectCurrentParams = exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.ACTIONS = exports.Notification = undefined;
+ exports.selectBlocks = exports.selectDraftTransactionError = exports.selectDraftTransactionAddress = exports.selectDraftTransactionAmount = exports.selectDraftTransaction = exports.selectGettingNewAddress = exports.selectReceiveAddress = exports.selectIsSendingSupport = exports.selectIsFetchingTransactions = exports.selectHasTransactions = exports.selectRecentTransactions = exports.selectTransactionItems = exports.selectTransactionsById = exports.selectBalance = exports.makeSelectBlockDate = exports.selectWunderBarIcon = exports.selectWunderBarAddress = exports.selectSearchUrisByQuery = exports.selectIsSearching = exports.selectSearchQuery = exports.makeSelectSearchUris = exports.selectActiveHistoryEntry = exports.selectHistoryStack = exports.selectHistoryIndex = exports.selectIsForwardDisabled = exports.selectIsBackDisabled = exports.selectPathAfterAuth = exports.selectPageTitle = exports.selectHeaderLinks = exports.selectCurrentParams = undefined;
+ exports.selectCurrentPage = exports.selectCurrentPath = exports.makeSelectCurrentParam = exports.computePageFromPath = exports.selectTotalDownloadProgress = exports.selectDownloadingFileInfos = exports.selectFileInfosDownloaded = exports.selectUrisLoading = exports.selectDownloadingByOutpoint = exports.selectIsFetchingFileListDownloadedOrPublished = exports.selectIsFetchingFileList = exports.selectFileInfosByOutpoint = exports.makeSelectLoadingForUri = exports.makeSelectDownloadingForUri = exports.makeSelectFileInfoForUri = exports.selectFetchingCostInfo = exports.selectCostForCurrentPageUri = exports.selectAllCostInfoByUri = exports.makeSelectCostInfoForUri = exports.makeSelectFetchingCostInfoForUri = exports.selectRewardContentClaimIds = exports.selectChannelClaimCounts = exports.selectPlayingUri = exports.selectFetchingFeaturedUris = exports.selectFeaturedUris = exports.selectResolvingUris = exports.selectMyChannelClaims = exports.selectFetchingMyChannels = exports.selectMyClaimsOutpoints = exports.selectAllMyClaimsByOutpoint = exports.selectMyClaimsWithoutChannels = exports.selectMyClaims = exports.selectPendingClaims = exports.selectIsFetchingClaimListMine = exports.selectAllFetchingChannelClaims = exports.selectMyActiveClaims = exports.selectAbandoningIds = exports.selectMyClaimsRaw = exports.selectAllClaimsByChannel = exports.selectClaimsByUri = exports.selectClaimsById = exports.makeSelectTotalPagesForChannel = exports.makeSelectTotalItemsForChannel = exports.makeSelectIsUriResolving = exports.makeSelectContentTypeForUri = exports.makeSelectTitleForUri = exports.makeSelectMetadataForUri = exports.makeSelectClaimsInChannelForCurrentPage = exports.makeSelectFetchingChannelClaims = exports.makeSelectClaimIsMine = exports.makeSelectClaimForUri = exports.selectNotification = exports.walletReducer = exports.searchReducer = exports.notificationsReducer = exports.fileInfoReducer = exports.costInfoReducer = exports.claimsReducer = exports.formatFullPrice = exports.formatCredits = exports.toQueryString = exports.parseQueryParams = exports.batchActions = exports.doSendSupport = exports.doSetDraftTransactionAddress = exports.doSetDraftTransactionAmount = exports.doSendDraftTransaction = exports.doCheckAddressIsMine = exports.doGetNewAddress = exports.doFetchBlock = exports.doFetchTransactions = exports.doBalanceSubscribe = exports.doUpdateBalance = exports.doSearch = exports.doFetchFileInfosAndPublishedClaims = exports.doFileList = exports.doFetchFileInfo = exports.doFetchCostInfoForUri = exports.doFetchRewardedContent = exports.doFetchFeaturedUris = exports.doResolveUri = exports.doResolveUris = exports.doAbandonClaim = exports.doFetchClaimListMine = exports.doShowSnackBar = exports.doCloseModal = exports.doOpenModal = exports.doNotify = exports.isURIClaimable = exports.isURIValid = exports.normalizeURI = exports.buildURI = exports.parseURI = exports.regexAddress = exports.regexInvalidURI = exports.Lbryapi = exports.Lbry = exports.SETTINGS = exports.ACTIONS = exports.Notification = undefined;
var _Notification = __webpack_require__(9);
@@ -8509,6 +8514,10 @@ __d(function (global, require, module, exports, _dependencyMap) {
var ACTIONS = _interopRequireWildcard(_action_types);
+ var _settings = __webpack_require__(37);
+
+ var SETTINGS = _interopRequireWildcard(_settings);
+
var _lbry = __webpack_require__(5);
var _lbry2 = _interopRequireDefault(_lbry);
@@ -8541,6 +8550,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
exports.ACTIONS = ACTIONS;
+ exports.SETTINGS = SETTINGS;
exports.Lbry = _lbry2.default;
exports.Lbryapi = _lbryapi2.default;
}, function (module, exports, __webpack_require__) {
@@ -10674,6 +10684,24 @@ __d(function (global, require, module, exports, _dependencyMap) {
return 'icon-file';
}
});
+ }, function (module, exports, __webpack_require__) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var CREDIT_REQUIRED_ACKNOWLEDGED = exports.CREDIT_REQUIRED_ACKNOWLEDGED = 'credit_required_acknowledged';
+ var NEW_USER_ACKNOWLEDGED = exports.NEW_USER_ACKNOWLEDGED = 'welcome_acknowledged';
+ var EMAIL_COLLECTION_ACKNOWLEDGED = exports.EMAIL_COLLECTION_ACKNOWLEDGED = 'email_collection_acknowledged';
+ var LANGUAGE = exports.LANGUAGE = 'language';
+ var SHOW_NSFW = exports.SHOW_NSFW = 'showNsfw';
+ var SHOW_UNAVAILABLE = exports.SHOW_UNAVAILABLE = 'showUnavailable';
+ var INSTANT_PURCHASE_ENABLED = exports.INSTANT_PURCHASE_ENABLED = 'instantPurchaseEnabled';
+ var INSTANT_PURCHASE_MAX = exports.INSTANT_PURCHASE_MAX = 'instantPurchaseMax';
+ var THEME = exports.THEME = 'theme';
+ var THEMES = exports.THEMES = 'themes';
+ var AUTOMATIC_DARK_MODE_ENABLED = exports.AUTOMATIC_DARK_MODE_ENABLED = 'automaticDarkModeEnabled';
+ var KEEP_DAEMON_RUNNING = exports.KEEP_DAEMON_RUNNING = 'keepDaemonRunning';
}]);
});
},62,[],"lbry-redux/build/index.js");
@@ -74522,26 +74550,34 @@ __d(function (global, require, module, exports, _dependencyMap) {
var _file2 = babelHelpers.interopRequireDefault(_file);
- var _splash = require(_dependencyMap[3], "../page/splash");
+ var _settings = require(_dependencyMap[3], "../page/settings");
+
+ var _settings2 = babelHelpers.interopRequireDefault(_settings);
+
+ var _splash = require(_dependencyMap[4], "../page/splash");
var _splash2 = babelHelpers.interopRequireDefault(_splash);
- var _reactNavigation = require(_dependencyMap[4], "react-navigation");
+ var _reactNavigation = require(_dependencyMap[5], "react-navigation");
- var _reactRedux = require(_dependencyMap[5], "react-redux");
+ var _reactRedux = require(_dependencyMap[6], "react-redux");
- var _redux = require(_dependencyMap[6], "../utils/redux");
+ var _redux = require(_dependencyMap[7], "../utils/redux");
- var _reactNative = require(_dependencyMap[7], "react-native");
+ var _reactNative = require(_dependencyMap[8], "react-native");
- var _Feather = require(_dependencyMap[8], "react-native-vector-icons/Feather");
+ var _lbryRedux = require(_dependencyMap[9], "lbry-redux");
+
+ var _Feather = require(_dependencyMap[10], "react-native-vector-icons/Feather");
var _Feather2 = babelHelpers.interopRequireDefault(_Feather);
- var _discover3 = require(_dependencyMap[9], "../styles/discover");
+ var _discover3 = require(_dependencyMap[11], "../styles/discover");
var _discover4 = babelHelpers.interopRequireDefault(_discover3);
+ var _settings3 = require(_dependencyMap[12], "../redux/selectors/settings");
+
var discoverStack = (0, _reactNavigation.StackNavigator)({
Discover: {
screen: _discover2.default,
@@ -74558,7 +74594,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
},
__source: {
fileName: _jsxFileName,
- lineNumber: 17
+ lineNumber: 20
}
})
};
@@ -74577,6 +74613,10 @@ __d(function (global, require, module, exports, _dependencyMap) {
var drawer = (0, _reactNavigation.DrawerNavigator)({
Discover: {
screen: discoverStack
+ },
+ Settings: {
+ screen: _settings2.default,
+ headerMode: 'screen'
}
}, {
drawerWidth: 300,
@@ -74597,13 +74637,32 @@ __d(function (global, require, module, exports, _dependencyMap) {
babelHelpers.inherits(AppWithNavigationState, _React$Component);
function AppWithNavigationState() {
+ var _ref2;
+
+ var _temp, _this, _ret;
+
babelHelpers.classCallCheck(this, AppWithNavigationState);
- return babelHelpers.possibleConstructorReturn(this, (AppWithNavigationState.__proto__ || Object.getPrototypeOf(AppWithNavigationState)).apply(this, arguments));
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return _ret = (_temp = (_this = babelHelpers.possibleConstructorReturn(this, (_ref2 = AppWithNavigationState.__proto__ || Object.getPrototypeOf(AppWithNavigationState)).call.apply(_ref2, [this].concat(args))), _this), _this._handleAppStateChange = function (nextAppState) {
+ var keepDaemonRunning = _this.props.keepDaemonRunning;
+
+ if (_reactNative.AppState.currentState && _reactNative.AppState.currentState.match(/inactive|background/) && _reactNative.NativeModules.DaemonServiceControl) {
+ if (!keepDaemonRunning) {
+ _reactNative.NativeModules.DaemonServiceControl.stopService();
+ }
+ }
+ }, _temp), babelHelpers.possibleConstructorReturn(_this, _ret);
}
babelHelpers.createClass(AppWithNavigationState, [{
key: "componentWillMount",
value: function componentWillMount() {
+ _reactNative.AppState.addEventListener('change', this._handleAppStateChange);
+
_reactNative.BackHandler.addEventListener('hardwareBackPress', function () {
var _props = this.props,
dispatch = _props.dispatch,
@@ -74625,6 +74684,8 @@ __d(function (global, require, module, exports, _dependencyMap) {
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
+ _reactNative.AppState.removeEventListener('change', this._handleAppStateChange);
+
_reactNative.BackHandler.removeEventListener('hardwareBackPress');
}
}, {
@@ -74641,7 +74702,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}),
__source: {
fileName: _jsxFileName,
- lineNumber: 70
+ lineNumber: 91
}
});
}
@@ -74651,12 +74712,14 @@ __d(function (global, require, module, exports, _dependencyMap) {
var mapStateToProps = function mapStateToProps(state) {
return {
- nav: state.nav
+ nav: state.nav,
+ keepDaemonRunning: (0, _settings3.makeSelectClientSetting)(_lbryRedux.SETTINGS.KEEP_DAEMON_RUNNING)(state),
+ showNsfw: (0, _settings3.makeSelectClientSetting)(_lbryRedux.SETTINGS.SHOW_NSFW)(state)
};
};
exports.default = (0, _reactRedux.connect)(mapStateToProps)(AppWithNavigationState);
-},609,[12,61,610,625,376,22,628,66,455,454],"LBRYApp/src/component/AppNavigator.js");
+},609,[12,61,610,625,631,376,22,634,66,62,455,454,627],"LBRYApp/src/component/AppNavigator.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -75467,7 +75530,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
resizeMode: 'stretch',
duration: 0.0,
currentTime: 0.0,
- paused: false,
+ paused: true,
fullscreenMode: false,
areControlsVisible: true,
controlsTimeout: -1,
@@ -75540,18 +75603,6 @@ __d(function (global, require, module, exports, _dependencyMap) {
});
_this.video.seek(0);
- }, _this.seekTo = function () {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
-
- if (time > _this.state.duration) {
- return;
- }
-
- _this.video.seek(time);
-
- _this.setState({
- currentTime: time
- });
}, _temp), babelHelpers.possibleConstructorReturn(_this, _ret);
}
@@ -75629,6 +75680,20 @@ __d(function (global, require, module, exports, _dependencyMap) {
return val;
}
+ }, {
+ key: "seekTo",
+ value: function seekTo() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+ if (time > this.state.duration) {
+ return;
+ }
+
+ this.video.seek(time);
+ this.setState({
+ currentTime: time
+ });
+ }
}, {
key: "initSeeker",
value: function initSeeker() {
@@ -77234,7 +77299,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
seekerCircle: {
borderRadius: 12,
position: 'relative',
- top: 8,
+ top: 16,
left: 8,
height: 12,
width: 12,
@@ -77242,15 +77307,15 @@ __d(function (global, require, module, exports, _dependencyMap) {
},
seekerHandle: {
position: 'absolute',
- height: 28,
- width: 28,
+ height: 36,
+ width: 36,
bottom: -12,
marginLeft: -8
},
bigSeekerCircle: {
borderRadius: 24,
position: 'relative',
- top: 2,
+ top: 10,
left: 8,
height: 24,
width: 24,
@@ -77353,6 +77418,388 @@ __d(function (global, require, module, exports, _dependencyMap) {
var _reactRedux = require(_dependencyMap[0], "react-redux");
+ var _lbryRedux = require(_dependencyMap[1], "lbry-redux");
+
+ var _settings = require(_dependencyMap[2], "../../redux/actions/settings");
+
+ var _settings2 = require(_dependencyMap[3], "../../redux/selectors/settings");
+
+ var _view = require(_dependencyMap[4], "./view");
+
+ var _view2 = babelHelpers.interopRequireDefault(_view);
+
+ var select = function select(state) {
+ return {
+ keepDaemonRunning: (0, _settings2.makeSelectClientSetting)(_lbryRedux.SETTINGS.KEEP_DAEMON_RUNNING)(state),
+ showNsfw: (0, _settings2.makeSelectClientSetting)(_lbryRedux.SETTINGS.SHOW_NSFW)(state)
+ };
+ };
+
+ var perform = function perform(dispatch) {
+ return {
+ setClientSetting: function setClientSetting(key, value) {
+ return dispatch((0, _settings.doSetClientSetting)(key, value));
+ }
+ };
+ };
+
+ exports.default = (0, _reactRedux.connect)(select, perform)(_view2.default);
+},625,[22,62,626,627,629],"LBRYApp/src/page/settings/index.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.doSetClientSetting = doSetClientSetting;
+
+ var _lbryRedux = require(_dependencyMap[0], "lbry-redux");
+
+ function doSetClientSetting(key, value) {
+ return {
+ type: _lbryRedux.ACTIONS.CLIENT_SETTING_CHANGED,
+ data: {
+ key: key,
+ value: value
+ }
+ };
+ }
+},626,[62],"LBRYApp/src/redux/actions/settings.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.selectKeepDaemonRunning = exports.selectShowNsfw = exports.makeSelectClientSetting = exports.selectClientSettings = exports.selectDaemonSettings = undefined;
+
+ var _lbryRedux = require(_dependencyMap[0], "lbry-redux");
+
+ var _reselect = require(_dependencyMap[1], "reselect");
+
+ var selectState = function selectState(state) {
+ return state.settings || {};
+ };
+
+ var selectDaemonSettings = exports.selectDaemonSettings = (0, _reselect.createSelector)(selectState, function (state) {
+ return state.daemonSettings;
+ });
+ var selectClientSettings = exports.selectClientSettings = (0, _reselect.createSelector)(selectState, function (state) {
+ return state.clientSettings || {};
+ });
+
+ var makeSelectClientSetting = exports.makeSelectClientSetting = function makeSelectClientSetting(setting) {
+ return (0, _reselect.createSelector)(selectClientSettings, function (settings) {
+ return settings ? settings[setting] : undefined;
+ });
+ };
+
+ var selectShowNsfw = exports.selectShowNsfw = makeSelectClientSetting(_lbryRedux.SETTINGS.SHOW_NSFW);
+ var selectKeepDaemonRunning = exports.selectKeepDaemonRunning = makeSelectClientSetting(_lbryRedux.SETTINGS.KEEP_DAEMON_RUNNING);
+},627,[62,628],"LBRYApp/src/redux/selectors/settings.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ 'use strict';
+
+ exports.__esModule = true;
+ exports.defaultMemoize = defaultMemoize;
+ exports.createSelectorCreator = createSelectorCreator;
+ exports.createStructuredSelector = createStructuredSelector;
+
+ function defaultEqualityCheck(a, b) {
+ return a === b;
+ }
+
+ function areArgumentsShallowlyEqual(equalityCheck, prev, next) {
+ if (prev === null || next === null || prev.length !== next.length) {
+ return false;
+ }
+
+ var length = prev.length;
+
+ for (var i = 0; i < length; i++) {
+ if (!equalityCheck(prev[i], next[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function defaultMemoize(func) {
+ var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;
+ var lastArgs = null;
+ var lastResult = null;
+ return function () {
+ if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {
+ lastResult = func.apply(null, arguments);
+ }
+
+ lastArgs = arguments;
+ return lastResult;
+ };
+ }
+
+ function getDependencies(funcs) {
+ var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;
+
+ if (!dependencies.every(function (dep) {
+ return typeof dep === 'function';
+ })) {
+ var dependencyTypes = dependencies.map(function (dep) {
+ return typeof dep;
+ }).join(', ');
+ throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));
+ }
+
+ return dependencies;
+ }
+
+ function createSelectorCreator(memoize) {
+ for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ memoizeOptions[_key - 1] = arguments[_key];
+ }
+
+ return function () {
+ for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ funcs[_key2] = arguments[_key2];
+ }
+
+ var recomputations = 0;
+ var resultFunc = funcs.pop();
+ var dependencies = getDependencies(funcs);
+ var memoizedResultFunc = memoize.apply(undefined, [function () {
+ recomputations++;
+ return resultFunc.apply(null, arguments);
+ }].concat(memoizeOptions));
+ var selector = defaultMemoize(function () {
+ var params = [];
+ var length = dependencies.length;
+
+ for (var i = 0; i < length; i++) {
+ params.push(dependencies[i].apply(null, arguments));
+ }
+
+ return memoizedResultFunc.apply(null, params);
+ });
+ selector.resultFunc = resultFunc;
+
+ selector.recomputations = function () {
+ return recomputations;
+ };
+
+ selector.resetRecomputations = function () {
+ return recomputations = 0;
+ };
+
+ return selector;
+ };
+ }
+
+ var createSelector = exports.createSelector = createSelectorCreator(defaultMemoize);
+
+ function createStructuredSelector(selectors) {
+ var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector;
+
+ if (typeof selectors !== 'object') {
+ throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));
+ }
+
+ var objectKeys = Object.keys(selectors);
+ return selectorCreator(objectKeys.map(function (key) {
+ return selectors[key];
+ }), function () {
+ for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ values[_key3] = arguments[_key3];
+ }
+
+ return values.reduce(function (composition, value, index) {
+ composition[objectKeys[index]] = value;
+ return composition;
+ }, {});
+ });
+ }
+},628,[],"reselect/lib/index.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var _jsxFileName = "/home/akinwale/Dev/Python/lbry-android/app/src/page/settings/view.js";
+
+ var _react = require(_dependencyMap[0], "react");
+
+ var _react2 = babelHelpers.interopRequireDefault(_react);
+
+ var _lbryRedux = require(_dependencyMap[1], "lbry-redux");
+
+ var _reactNative = require(_dependencyMap[2], "react-native");
+
+ var _settings = require(_dependencyMap[3], "../../styles/settings");
+
+ var _settings2 = babelHelpers.interopRequireDefault(_settings);
+
+ var SettingsPage = function (_React$PureComponent) {
+ babelHelpers.inherits(SettingsPage, _React$PureComponent);
+
+ function SettingsPage() {
+ babelHelpers.classCallCheck(this, SettingsPage);
+ return babelHelpers.possibleConstructorReturn(this, (SettingsPage.__proto__ || Object.getPrototypeOf(SettingsPage)).apply(this, arguments));
+ }
+
+ babelHelpers.createClass(SettingsPage, [{
+ key: "render",
+ value: function render() {
+ var _props = this.props,
+ keepDaemonRunning = _props.keepDaemonRunning,
+ showNsfw = _props.showNsfw,
+ setClientSetting = _props.setClientSetting;
+ return _react2.default.createElement(
+ _reactNative.View,
+ {
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 19
+ }
+ },
+ _react2.default.createElement(
+ _reactNative.Text,
+ {
+ style: _settings2.default.title,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 20
+ }
+ },
+ "Settings"
+ ),
+ _react2.default.createElement(
+ _reactNative.ScrollView,
+ {
+ style: _settings2.default.scrollContainer,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 21
+ }
+ },
+ _react2.default.createElement(
+ _reactNative.View,
+ {
+ style: _settings2.default.row,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 22
+ }
+ },
+ _react2.default.createElement(
+ _reactNative.View,
+ {
+ style: _settings2.default.switchText,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 23
+ }
+ },
+ _react2.default.createElement(
+ _reactNative.Text,
+ {
+ style: _settings2.default.label,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 24
+ }
+ },
+ "Keep the daemon background service running when the app is suspended."
+ ),
+ _react2.default.createElement(
+ _reactNative.Text,
+ {
+ style: _settings2.default.description,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 25
+ }
+ },
+ "Enable this option for quicker app launch and to keep the synchronisation with the blockchain up to date."
+ )
+ ),
+ _react2.default.createElement(
+ _reactNative.View,
+ {
+ style: _settings2.default.switchContainer,
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 27
+ }
+ },
+ _react2.default.createElement(_reactNative.Switch, {
+ value: keepDaemonRunning,
+ onValueChange: function onValueChange(value) {
+ return setClientSetting(_lbryRedux.SETTINGS.KEEP_DAEMON_RUNNING, value);
+ },
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 28
+ }
+ })
+ )
+ )
+ )
+ );
+ }
+ }]);
+ return SettingsPage;
+ }(_react2.default.PureComponent);
+
+ SettingsPage.navigationOptions = {
+ title: 'Settings'
+ };
+ exports.default = SettingsPage;
+},629,[12,62,66,630],"LBRYApp/src/page/settings/view.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ var _reactNative = require(_dependencyMap[0], "react-native");
+
+ var settingsStyle = _reactNative.StyleSheet.create({
+ title: {
+ fontSize: 20,
+ fontWeight: 'bold',
+ margin: 16
+ },
+ scrollContainer: {
+ paddingLeft: 16,
+ paddingRight: 16,
+ paddingBottom: 16
+ },
+ row: {
+ marginBottom: 12,
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'space-between'
+ },
+ switchText: {
+ width: '70%'
+ },
+ switchContainer: {
+ width: '25%'
+ },
+ label: {
+ fontSize: 14,
+ fontFamily: 'Metropolis-Regular'
+ },
+ description: {
+ fontSize: 12,
+ fontFamily: 'Metropolis-Regular',
+ color: '#aaaaaa'
+ }
+ });
+
+ exports.default = settingsStyle;
+},630,[66],"LBRYApp/src/styles/settings.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ var _reactRedux = require(_dependencyMap[0], "react-redux");
+
var _view = require(_dependencyMap[1], "./view");
var _view2 = babelHelpers.interopRequireDefault(_view);
@@ -77366,7 +77813,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
};
exports.default = (0, _reactRedux.connect)(select, perform)(_view2.default);
-},625,[22,626],"LBRYApp/src/page/splash/index.js");
+},631,[22,632],"LBRYApp/src/page/splash/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -77536,7 +77983,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
title: 'Splash'
};
exports.default = SplashScreen;
-},626,[12,62,66,24,627],"LBRYApp/src/page/splash/view.js");
+},632,[12,62,66,24,633],"LBRYApp/src/page/splash/view.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -77577,7 +78024,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
});
exports.default = splashStyle;
-},627,[66],"LBRYApp/src/styles/splash.js");
+},633,[66],"LBRYApp/src/styles/splash.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -77592,7 +78039,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
var addListener = (0, _reactNavigationReduxHelpers.createReduxBoundAddListener)("root");
exports.reactNavigationMiddleware = reactNavigationMiddleware;
exports.addListener = addListener;
-},628,[629],"LBRYApp/src/utils/redux.js");
+},634,[635],"LBRYApp/src/utils/redux.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -77626,8 +78073,8 @@ __d(function (global, require, module, exports, _dependencyMap) {
var _reducer = require(_dependencyMap[2], "./reducer");
exports.createNavigationReducer = _reducer.createNavigationReducer;
-},629,[630,631,632],"react-navigation-redux-helpers/src/index.js");
-__d(function (global, require, module, exports, _dependencyMap) {},630,[],"react-navigation-redux-helpers/src/types.js");
+},635,[636,637,638],"react-navigation-redux-helpers/src/index.js");
+__d(function (global, require, module, exports, _dependencyMap) {},636,[],"react-navigation-redux-helpers/src/types.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -77704,7 +78151,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
exports.createReactNavigationReduxMiddleware = createReactNavigationReduxMiddleware;
exports.createReduxBoundAddListener = createReduxBoundAddListener;
exports.initializeListeners = initializeListeners;
-},631,[31,632],"react-navigation-redux-helpers/src/middleware.js");
+},637,[31,638],"react-navigation-redux-helpers/src/middleware.js");
__d(function (global, require, module, exports, _dependencyMap) {
Object.defineProperty(exports, "__esModule", {
value: true
@@ -77727,7 +78174,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
;
exports.createNavigationReducer = createNavigationReducer;
exports.initAction = initAction;
-},632,[376],"react-navigation-redux-helpers/src/reducer.js");
+},638,[376],"react-navigation-redux-helpers/src/reducer.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -77788,7 +78235,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
exports.persistStore = _persistStore2.default;
exports.purgeStoredState = _purgeStoredState2.default;
exports.storages = storages;
-},633,[634,637,642,643,644,640],"redux-persist/lib/index.js");
+},639,[640,643,648,649,650,646],"redux-persist/lib/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -77890,14 +78337,14 @@ __d(function (global, require, module, exports, _dependencyMap) {
});
return newState;
}
-},634,[635,636],"redux-persist/lib/autoRehydrate.js");
+},640,[641,642],"redux-persist/lib/autoRehydrate.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
exports.__esModule = true;
var KEY_PREFIX = exports.KEY_PREFIX = 'reduxPersist:';
var REHYDRATE = exports.REHYDRATE = 'persist/REHYDRATE';
-},635,[],"redux-persist/lib/constants.js");
+},641,[],"redux-persist/lib/constants.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -77928,7 +78375,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
if (!(0, _isPlainObject2.default)(a)) return false;
return true;
}
-},636,[38],"redux-persist/lib/utils/isStatePlainEnough.js");
+},642,[38],"redux-persist/lib/utils/isStatePlainEnough.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -78101,7 +78548,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
state[key] = value;
return state;
}
-},637,[635,638,640,641],"redux-persist/lib/createPersistor.js");
+},643,[641,644,646,647],"redux-persist/lib/createPersistor.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -78247,7 +78694,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
};
}
}
-},638,[639],"redux-persist/lib/defaults/asyncLocalStorage.js");
+},644,[645],"redux-persist/lib/defaults/asyncLocalStorage.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -78259,7 +78706,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
return setTimeout(fn, ms);
};
exports.default = setImmediate;
-},639,[],"redux-persist/lib/utils/setImmediate.js");
+},645,[],"redux-persist/lib/utils/setImmediate.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -78303,7 +78750,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
};
}
-},640,[635],"redux-persist/lib/purgeStoredState.js");
+},646,[641],"redux-persist/lib/purgeStoredState.js");
__d(function (global, require, module, exports, _dependencyMap) {
exports = module.exports = stringify;
exports.getSerialize = serializer;
@@ -78330,7 +78777,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
return replacer == null ? value : replacer.call(this, key, value);
};
}
-},641,[],"json-stringify-safe/stringify.js");
+},647,[],"json-stringify-safe/stringify.js");
__d(function (global, require, module, exports, _dependencyMap) {
"use strict";
@@ -78358,7 +78805,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
exports.default = createTransform;
-},642,[],"redux-persist/lib/createTransform.js");
+},648,[],"redux-persist/lib/createTransform.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -78470,7 +78917,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
function defaultDeserializer(serial) {
return JSON.parse(serial);
}
-},643,[635,638],"redux-persist/lib/getStoredState.js");
+},649,[641,644],"redux-persist/lib/getStoredState.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -78565,7 +79012,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
error: error
};
}
-},644,[635,643,637,639],"redux-persist/lib/persistStore.js");
+},650,[641,649,643,645],"redux-persist/lib/persistStore.js");
__d(function (global, require, module, exports, _dependencyMap) {
"use strict";
@@ -78615,7 +79062,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
}, config);
}
-},645,[633,646,641],"redux-persist-transform-compress/lib/index.js");
+},651,[639,652,647],"redux-persist-transform-compress/lib/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var LZString = function () {
var f = String.fromCharCode;
@@ -79192,7 +79639,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
} else if (typeof module !== 'undefined' && module != null) {
module.exports = LZString;
}
-},646,[],"lz-string/libs/lz-string.js");
+},652,[],"lz-string/libs/lz-string.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -79324,7 +79771,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
return subset;
}
-},647,[633,648,649,650,651,652,653],"redux-persist-transform-filter/dist/index.js");
+},653,[639,654,655,656,657,658,659],"redux-persist-transform-filter/dist/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var FUNC_ERROR_TEXT = 'Expected a function';
var HASH_UNDEFINED = '__lodash_hash_undefined__';
@@ -79711,7 +80158,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
module.exports = get;
-},648,[],"lodash.get/index.js");
+},654,[],"lodash.get/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var FUNC_ERROR_TEXT = 'Expected a function';
var HASH_UNDEFINED = '__lodash_hash_undefined__';
@@ -80131,7 +80578,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
module.exports = set;
-},649,[],"lodash.set/index.js");
+},655,[],"lodash.set/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var FUNC_ERROR_TEXT = 'Expected a function';
var HASH_UNDEFINED = '__lodash_hash_undefined__';
@@ -80558,7 +81005,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
module.exports = unset;
-},650,[],"lodash.unset/index.js");
+},656,[],"lodash.unset/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var LARGE_ARRAY_SIZE = 200;
var FUNC_ERROR_TEXT = 'Expected a function';
@@ -81720,7 +82167,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
module.exports = pickBy;
-},651,[],"lodash.pickby/index.js");
+},657,[],"lodash.pickby/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var MAX_SAFE_INTEGER = 9007199254740991;
var argsTag = '[object Arguments]',
@@ -81930,7 +82377,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
module.exports = isEmpty;
-},652,[],"lodash.isempty/index.js");
+},658,[],"lodash.isempty/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
var MAX_SAFE_INTEGER = 9007199254740991;
var argsTag = '[object Arguments]',
@@ -82074,7 +82521,7 @@ __d(function (global, require, module, exports, _dependencyMap) {
}
module.exports = forIn;
-},653,[],"lodash.forin/index.js");
+},659,[],"lodash.forin/index.js");
__d(function (global, require, module, exports, _dependencyMap) {
'use strict';
@@ -82099,6 +82546,41 @@ __d(function (global, require, module, exports, _dependencyMap) {
var thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;
exports['default'] = thunk;
-},654,[],"redux-thunk/lib/index.js");
+},660,[],"redux-thunk/lib/index.js");
+__d(function (global, require, module, exports, _dependencyMap) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = reducer;
+
+ var _lbryRedux = require(_dependencyMap[0], "lbry-redux");
+
+ var reducers = {};
+ var defaultState = {
+ clientSettings: {
+ keepDaemonRunning: true,
+ showNsfw: false
+ }
+ };
+
+ reducers[_lbryRedux.ACTIONS.CLIENT_SETTING_CHANGED] = function (state, action) {
+ var _action$data = action.data,
+ key = _action$data.key,
+ value = _action$data.value;
+ var clientSettings = babelHelpers.extends({}, state.clientSettings);
+ clientSettings[key] = value;
+ return babelHelpers.extends({}, state, {
+ clientSettings: clientSettings
+ });
+ };
+
+ function reducer() {
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState;
+ var action = arguments[1];
+ var handler = reducers[action.type];
+ if (handler) return handler(state, action);
+ return state;
+ }
+},661,[62],"LBRYApp/src/redux/reducers/settings.js");
require(76);
require(11);
\ No newline at end of file
diff --git a/src/main/assets/index.android.bundle.meta b/src/main/assets/index.android.bundle.meta
index 932b1877..b8e17ba9 100644
--- a/src/main/assets/index.android.bundle.meta
+++ b/src/main/assets/index.android.bundle.meta
@@ -1 +1 @@
-WhèÑ'ï¢Ã,š|!ÚÊ.ÔÿòR
\ No newline at end of file
+á…N†eº¸Îù‚ˆ™)5sCÊê
\ No newline at end of file
diff --git a/src/main/java/io/lbry/lbrynet/reactmodules/DaemonServiceControlModule.java b/src/main/java/io/lbry/lbrynet/reactmodules/DaemonServiceControlModule.java
new file mode 100644
index 00000000..0580c134
--- /dev/null
+++ b/src/main/java/io/lbry/lbrynet/reactmodules/DaemonServiceControlModule.java
@@ -0,0 +1,31 @@
+package io.lbry.lbrynet.reactmodules;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+
+import io.lbry.lbrynet.LbrynetService;
+import io.lbry.lbrynet.ServiceHelper;
+
+public class DaemonServiceControlModule extends ReactContextBaseJavaModule {
+ private Context context;
+
+ public DaemonServiceControlModule(ReactApplicationContext reactContext) {
+ super(reactContext);
+ this.context = reactContext;
+ }
+
+ @Override
+ public String getName() {
+ return "DaemonServiceControl";
+ }
+
+ @ReactMethod
+ public void stopService() {
+ ServiceHelper.stop(context, LbrynetService.class);
+ }
+}
diff --git a/src/main/java/io/lbry/lbrynet/reactmodules/ScreenOrientationModule.java b/src/main/java/io/lbry/lbrynet/reactmodules/ScreenOrientationModule.java
index d5e06456..9d50b83c 100644
--- a/src/main/java/io/lbry/lbrynet/reactmodules/ScreenOrientationModule.java
+++ b/src/main/java/io/lbry/lbrynet/reactmodules/ScreenOrientationModule.java
@@ -8,10 +8,6 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
-/**
- * Created by akinwale on 3/19/18.
- */
-
public class ScreenOrientationModule extends ReactContextBaseJavaModule {
private Context context;
diff --git a/src/main/java/io/lbry/lbrynet/reactpackages/LbryReactPackage.java b/src/main/java/io/lbry/lbrynet/reactpackages/LbryReactPackage.java
index ae194528..ec2fd3a3 100644
--- a/src/main/java/io/lbry/lbrynet/reactpackages/LbryReactPackage.java
+++ b/src/main/java/io/lbry/lbrynet/reactpackages/LbryReactPackage.java
@@ -5,6 +5,7 @@ import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
+import io.lbry.lbrynet.reactmodules.DaemonServiceControlModule;
import io.lbry.lbrynet.reactmodules.DownloadManagerModule;
import io.lbry.lbrynet.reactmodules.ScreenOrientationModule;
@@ -22,6 +23,7 @@ public class LbryReactPackage implements ReactPackage {
public List createNativeModules(ReactApplicationContext reactContext) {
List modules = new ArrayList<>();
+ modules.add(new DaemonServiceControlModule(reactContext));
modules.add(new DownloadManagerModule(reactContext));
modules.add(new ScreenOrientationModule(reactContext));