mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-03-26 07:04:05 +08:00
Load assets from same folder as JSbundle (Android)
Summary: https://github.com/facebook/react-native/issues/3679 was only partially fixed as the behaviour only works on iOS. This implements the same behaviour for Android. If the JSBundle was loaded from the assets folder, this will load images from the built-in resources. Else, load the image from the same folder as the JS bundle. EDIT: For added clarity: On iOS, Bundle Location: 'file:///Path/To/Sample.app/main.bundle' httpServerLocation: '/assets/module/a/' Name: 'logo' type: 'png' **Resolved Asset location: '/Path/To/Sample.app/assets/module/a/logo.png'** On Android, Bundle Location: 'file:///sdcard/Path/To/main.bundle' httpServerLocation: '/assets/module/a/', name: 'logo' type: 'png' **Resolved Asset location: 'file:///sdcard/Path/To/drawable_mdpi/module_a_logo.png'** Closes https://github.com/facebook/react-native/pull/4527 Reviewed By: svcscm Differential Revision: D2788005 Pulled By: mkonicek fb-gh-sync-id: 3f6462a7ee6370a92dd6727ac422c5de346c3ff1
This commit is contained in:
committed by
facebook-github-bot-9
parent
ffd4f991f5
commit
e730a9fdd0
@@ -8,7 +8,9 @@
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
jest.dontMock('../getAssetDestPathAndroid');
|
||||
jest
|
||||
.dontMock('../getAssetDestPathAndroid')
|
||||
.dontMock('../assetPathUtils');
|
||||
|
||||
const getAssetDestPathAndroid = require('../getAssetDestPathAndroid');
|
||||
|
||||
|
||||
56
local-cli/bundle/assetPathUtils.js
Normal file
56
local-cli/bundle/assetPathUtils.js
Normal file
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
function getAndroidAssetSuffix(scale) {
|
||||
switch (scale) {
|
||||
case 0.75: return 'ldpi';
|
||||
case 1: return 'mdpi';
|
||||
case 1.5: return 'hdpi';
|
||||
case 2: return 'xhdpi';
|
||||
case 3: return 'xxhdpi';
|
||||
case 4: return 'xxxhdpi';
|
||||
}
|
||||
}
|
||||
|
||||
function getAndroidDrawableFolderName(asset, scale) {
|
||||
var suffix = getAndroidAssetSuffix(scale);
|
||||
if (!suffix) {
|
||||
throw new Error(
|
||||
'Don\'t know which android drawable suffix to use for asset: ' +
|
||||
JSON.stringify(asset)
|
||||
);
|
||||
}
|
||||
const androidFolder = 'drawable-' + suffix;
|
||||
return androidFolder;
|
||||
}
|
||||
|
||||
function getAndroidResourceIdentifier(asset) {
|
||||
var folderPath = getBasePath(asset);
|
||||
return (folderPath + '/' + asset.name)
|
||||
.toLowerCase()
|
||||
.replace(/\//g, '_') // Encode folder structure in file name
|
||||
.replace(/([^a-z0-9_])/g, '') // Remove illegal chars
|
||||
.replace(/^assets_/, ''); // Remove "assets_" prefix
|
||||
}
|
||||
|
||||
function getBasePath(asset) {
|
||||
var basePath = asset.httpServerLocation;
|
||||
if (basePath[0] === '/') {
|
||||
basePath = basePath.substr(1);
|
||||
}
|
||||
return basePath;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getAndroidAssetSuffix: getAndroidAssetSuffix,
|
||||
getAndroidDrawableFolderName: getAndroidDrawableFolderName,
|
||||
getAndroidResourceIdentifier: getAndroidResourceIdentifier,
|
||||
getBasePath: getBasePath
|
||||
};
|
||||
@@ -9,34 +9,11 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
|
||||
function getAndroidAssetSuffix(scale) {
|
||||
switch (scale) {
|
||||
case 0.75: return 'ldpi';
|
||||
case 1: return 'mdpi';
|
||||
case 1.5: return 'hdpi';
|
||||
case 2: return 'xhdpi';
|
||||
case 3: return 'xxhdpi';
|
||||
case 4: return 'xxxhdpi';
|
||||
}
|
||||
}
|
||||
const assetPathUtils = require('./assetPathUtils');
|
||||
|
||||
function getAssetDestPathAndroid(asset, scale) {
|
||||
var suffix = getAndroidAssetSuffix(scale);
|
||||
if (!suffix) {
|
||||
throw new Error(
|
||||
'Don\'t know which android drawable suffix to use for asset: ' +
|
||||
JSON.stringify(asset)
|
||||
);
|
||||
}
|
||||
const androidFolder = 'drawable-' + suffix;
|
||||
// TODO: reuse this logic from https://fburl.com/151101135
|
||||
const fileName = (asset.httpServerLocation.substr(1) + '/' + asset.name)
|
||||
.toLowerCase()
|
||||
.replace(/\//g, '_') // Encode folder structure in file name
|
||||
.replace(/([^a-z0-9_])/g, '') // Remove illegal chars
|
||||
.replace(/^assets_/, ''); // Remove "assets_" prefix
|
||||
|
||||
const androidFolder = assetPathUtils.getAndroidDrawableFolderName(asset, scale);
|
||||
const fileName = assetPathUtils.getAndroidResourceIdentifier(asset);
|
||||
return path.join(androidFolder, fileName + '.' + asset.type);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user