Open link in customTabs on Android. (#168)

* Open link in customTabs on Android.
This commit is contained in:
Saket Kumar 2017-12-28 23:10:10 +05:30 committed by Guilherme Gazzo
parent f5a9234600
commit 8a815d040d
11 changed files with 105 additions and 9 deletions

View File

@ -155,6 +155,7 @@ dependencies {
compile project(':realm') compile project(':realm')
compile fileTree(dir: "libs", include: ["*.jar"]) compile fileTree(dir: "libs", include: ["*.jar"])
compile "com.android.support:appcompat-v7:23.0.1" compile "com.android.support:appcompat-v7:23.0.1"
compile 'com.android.support:customtabs:23.0.1'
compile "com.facebook.react:react-native:+" // From node_modules compile "com.facebook.react:react-native:+" // From node_modules
} }

View File

@ -0,0 +1,37 @@
package com.rocketchatrn;
import android.net.Uri;
import android.support.customtabs.CustomTabsIntent;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
/**
* Launches custom tabs.
*/
public class CustomTabsAndroid extends ReactContextBaseJavaModule {
public ReactApplicationContext context;
public CustomTabsAndroid(ReactApplicationContext reactContext) {
super(reactContext);
this.context = reactContext;
}
@Override
public String getName() {
return "CustomTabsAndroid";
}
@ReactMethod
public void openURL(String url) throws NullPointerException {
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(getReactApplicationContext().getCurrentActivity(), Uri.parse(url));
}
}

View File

@ -0,0 +1,33 @@
package com.rocketchatrn;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class RocketChatNativePackage implements ReactPackage {
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
List<ViewManager> managers = new ArrayList<>();
return managers;
}
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new CustomTabsAndroid(reactContext));
return modules;
}
}

View File

@ -5,6 +5,8 @@ import Video from 'react-native-video';
import Icon from 'react-native-vector-icons/MaterialIcons'; import Icon from 'react-native-vector-icons/MaterialIcons';
import Slider from 'react-native-slider'; import Slider from 'react-native-slider';
import Markdown from './Markdown'; import Markdown from './Markdown';
import openLink from '../../utils/openLink';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
audioContainer: { audioContainer: {

View File

@ -1,11 +1,13 @@
import React from 'react'; import React from 'react';
import { View, Text, TouchableOpacity, StyleSheet, Linking } from 'react-native'; import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import moment from 'moment'; import moment from 'moment';
import Markdown from './Markdown'; import Markdown from './Markdown';
import QuoteMark from './QuoteMark'; import QuoteMark from './QuoteMark';
import Avatar from '../Avatar'; import Avatar from '../Avatar';
import openLink from '../../utils/openLink';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
button: { button: {
@ -60,7 +62,7 @@ const onPress = (attachment) => {
if (!url) { if (!url) {
return; return;
} }
Linking.openURL(attachment.title_link || attachment.author_link); openLink(attachment.title_link || attachment.author_link);
}; };
// Support <http://link|Text> // Support <http://link|Text>

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import { View, Text, TouchableOpacity, Linking, StyleSheet, Image } from 'react-native'; import { View, Text, TouchableOpacity, StyleSheet, Image } from 'react-native';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import QuoteMark from './QuoteMark'; import QuoteMark from './QuoteMark';
import openLink from '../../utils/openLink';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
button: { button: {
@ -42,7 +43,7 @@ const styles = StyleSheet.create({
}); });
const onPress = (url) => { const onPress = (url) => {
Linking.openURL(url); openLink(url);
}; };
const Url = ({ url }) => { const Url = ({ url }) => {
if (!url) { if (!url) {

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { View, StyleSheet, TouchableOpacity, Image, Linking, Platform } from 'react-native'; import { View, StyleSheet, TouchableOpacity, Image, Platform } from 'react-native';
import Modal from 'react-native-modal'; import Modal from 'react-native-modal';
import VideoPlayer from 'react-native-video-controls'; import VideoPlayer from 'react-native-video-controls';
import Markdown from './Markdown'; import Markdown from './Markdown';
import openLink from '../../utils/openLink';
const SUPPORTED_TYPES = ['video/quicktime', 'video/mp4', ...(Platform.OS === 'ios' ? [] : ['video/webm', 'video/3gp', 'video/mkv'])]; const SUPPORTED_TYPES = ['video/quicktime', 'video/mp4', ...(Platform.OS === 'ios' ? [] : ['video/webm', 'video/3gp', 'video/mkv'])];
const isTypeSupported = type => SUPPORTED_TYPES.indexOf(type) !== -1; const isTypeSupported = type => SUPPORTED_TYPES.indexOf(type) !== -1;
@ -53,7 +54,7 @@ export default class Video extends React.PureComponent {
if (isTypeSupported(this.props.file.video_type)) { if (isTypeSupported(this.props.file.video_type)) {
return this.toggleModal(); return this.toggleModal();
} }
Linking.openURL(this.state.uri); openLink(this.state.uri);
} }
render() { render() {

View File

@ -0,0 +1,9 @@
/**
* This exposes the native CustomTabsAndroid module as a JS module. This has a
* function 'openURL' which takes the following parameters:
*
* 1. String url: A url to be opened in customTabs
*/
import { NativeModules } from 'react-native';
module.exports = NativeModules.CustomTabsAndroid;

View File

@ -0,0 +1,5 @@
import CustomTabsAndroid from '../nativeModules/CustomTabsAndroid';
const openLink = (url: string) => CustomTabsAndroid.openURL(url);
export default openLink;

View File

@ -0,0 +1,5 @@
import { Linking } from 'react-native';
const openLink = (url: string) => Linking.openURL(url);
export default openLink;

6
package-lock.json generated
View File

@ -230,9 +230,9 @@
} }
}, },
"@storybook/addons": { "@storybook/addons": {
"version": "3.2.19", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-3.2.19.tgz", "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-3.3.1.tgz",
"integrity": "sha512-HIJA+xlAZboKECTKaqLvrZZrvb0SVUKvGasxAd43mlS1+Un6sXXTs+f/5dI+fwUaBsCLalaTOJ1vQy3NoC5xoQ==" "integrity": "sha512-fdKampdNVFUY+WPqI+Ci0bjurm3fpEwOomyHNJqU41CGlaxFon5dm7R2+LZUbUH8X/UAc9f1ECJUFETV7ZoVpA=="
}, },
"@storybook/mantra-core": { "@storybook/mantra-core": {
"version": "1.7.2", "version": "1.7.2",