X Tutup
Skip to content

Commit b36abb0

Browse files
author
Justin McPherson
committed
Initial support for ImageLoader
1 parent cc8a340 commit b36abb0

File tree

6 files changed

+149
-12
lines changed

6 files changed

+149
-12
lines changed

Libraries/Image/Image.ubuntu.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
var React = require('React');
77
var PropTypes = React.PropTypes;
88

9+
var NativeModules = require('NativeModules');
910
var ImageResizeMode = require('ImageResizeMode');
1011
var ImageStylePropTypes = require('ImageStylePropTypes');
1112
var StyleSheetPropType = require('StyleSheetPropType');
@@ -15,6 +16,10 @@ var ReactNativeViewAttributes = require('ReactNativeViewAttributes');
1516
var requireNativeComponent = require('requireNativeComponent');
1617
var resolveAssetSource = require('resolveAssetSource');
1718

19+
var {
20+
ImageLoader,
21+
} = NativeModules;
22+
1823
var Image = React.createClass({
1924
propTypes: {
2025
style: StyleSheetPropType(ImageStylePropTypes),
@@ -23,6 +28,9 @@ var Image = React.createClass({
2328

2429
statics: {
2530
resizeMode: ImageResizeMode,
31+
prefetch(url: string) {
32+
return ImageLoader.prefetchImage(url);
33+
},
2634
},
2735

2836
mixins: [NativeMethodsMixin],

ReactUbuntu/runtime/src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ set(
5050
reactrawtextmanager.cpp
5151
reacttextmanager.cpp
5252
reactimagemanager.cpp
53+
reactimageloader.cpp
5354
reactattachedproperties.cpp
5455
reactflexlayout.cpp
5556
reacttextproperties.cpp

ReactUbuntu/runtime/src/reactbridge.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11

2+
#include <QStandardPaths>
23
#include <QMap>
34
#include <QPluginLoader>
45
#include <QJsonDocument>
56
#include <QQuickItem>
67
#include <QTimer>
8+
#include <QNetworkAccessManager>
9+
#include <QNetworkDiskCache>
710

811
#include "reactbridge.h"
912
#include "reactsourcecode.h"
@@ -23,6 +26,7 @@
2326
#include "reacttextmanager.h"
2427
#include "reactimagemanager.h"
2528
#include "reactuimanager.h"
29+
#include "reactimageloader.h"
2630

2731
#include "ubuntuscrollviewmanager.h"
2832
#include "ubuntunavigatormanager.h"
@@ -35,14 +39,15 @@
3539
class ReactBridgePrivate
3640
{
3741
public:
38-
bool ready;
39-
ReactExecutor* executor;
40-
QQmlEngine* qmlEngine;
41-
QQuickItem* visualParent;
42-
QNetworkAccessManager* nam;
43-
ReactUIManager* uiManager;
44-
ReactSourceCode* sourceCode;
45-
ReactEventDispatcher* eventDispatcher;
42+
bool ready = false;
43+
ReactExecutor* executor = nullptr;
44+
QQmlEngine* qmlEngine = nullptr;
45+
QQuickItem* visualParent = nullptr;
46+
QNetworkAccessManager* nam = nullptr;
47+
ReactUIManager* uiManager = nullptr;
48+
ReactImageLoader* imageLoader = nullptr;
49+
ReactSourceCode* sourceCode = nullptr;
50+
ReactEventDispatcher* eventDispatcher = nullptr;
4651
QUrl bundleUrl;
4752
QMap<int, ReactModuleData*> modules;
4853

@@ -88,10 +93,6 @@ ReactBridge::ReactBridge(QObject* parent)
8893

8994
setupExecutor();
9095

91-
d->qmlEngine = nullptr;
92-
d->nam = nullptr;
93-
d->visualParent = nullptr;
94-
d->uiManager = nullptr;
9596
d->eventDispatcher = new ReactEventDispatcher(this);
9697
}
9798

@@ -210,6 +211,13 @@ void ReactBridge::setNetworkAccessManager(QNetworkAccessManager* nam)
210211
if (d->nam == nam)
211212
return;
212213
d->nam = nam;
214+
215+
if (d->nam->cache() == nullptr) {
216+
// TODO: cache size
217+
auto cache = new QNetworkDiskCache(d->nam);
218+
cache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
219+
d->nam->setCache(cache);
220+
}
213221
}
214222

215223
QUrl ReactBridge::bundleUrl() const
@@ -240,6 +248,11 @@ ReactUIManager* ReactBridge::uiManager() const
240248
return d_func()->uiManager;
241249
}
242250

251+
ReactImageLoader* ReactBridge::imageLoader() const
252+
{
253+
return d_func()->imageLoader;
254+
}
255+
243256
void ReactBridge::sourcesFinished()
244257
{
245258
Q_D(ReactBridge);
@@ -271,6 +284,8 @@ void ReactBridge::initModules()
271284
// Special cases // TODO:
272285
d->sourceCode = new ReactSourceCode;
273286
modules << d->sourceCode;
287+
d->imageLoader = new ReactImageLoader;
288+
modules << d->imageLoader;
274289
d->uiManager = new ReactUIManager; // XXX: this needs to be at end, FIXME:
275290
modules << d->uiManager;
276291

ReactUbuntu/runtime/src/reactbridge.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class QQmlEngine;
1111
class QNetworkAccessManager;
1212
class ReactModuleData;
1313
class ReactUIManager;
14+
class ReactImageLoader;
1415
class ReactEventDispatcher;
1516

1617

@@ -25,6 +26,7 @@ class ReactBridge : public QObject
2526
Q_PROPERTY(QUrl bundleUrl READ bundleUrl WRITE setBundleUrl)
2627
Q_PROPERTY(QList<ReactModuleData*> modules READ modules)
2728
Q_PROPERTY(ReactUIManager* uiManager READ uiManager)
29+
Q_PROPERTY(ReactImageLoader* imageLoader READ imageLoader)
2830

2931
enum Fields { FieldRequestModuleIDs, FieldMethodIDs, FieldParams };
3032

@@ -60,6 +62,7 @@ class ReactBridge : public QObject
6062
ReactEventDispatcher* eventDispatcher() const;
6163
QList<ReactModuleData*> modules() const;
6264
ReactUIManager* uiManager() const;
65+
ReactImageLoader* imageLoader() const;
6366

6467
Q_SIGNALS:
6568
void readyChanged();
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
#include <QNetworkRequest>
3+
#include <QNetworkReply>
4+
5+
#include "reactimageloader.h"
6+
#include "reactbridge.h"
7+
8+
9+
class ReactImageLoaderPrivate {
10+
public:
11+
ReactBridge* bridge = nullptr;
12+
};
13+
14+
15+
void ReactImageLoader::prefetchImage(
16+
const QString& url,
17+
const ReactModuleInterface::ListArgumentBlock& resolve,
18+
const ReactModuleInterface::ListArgumentBlock& reject
19+
) {
20+
Q_D(ReactImageLoader);
21+
22+
QNetworkRequest request(url);
23+
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
24+
QNetworkReply* reply = d->bridge->networkAccessManager()->get(request);
25+
connect(reply, &QNetworkReply::finished, [=]() {
26+
reply->deleteLater();
27+
if (reply->error() != QNetworkReply::NoError) {
28+
reject(d->bridge, QVariantList{QVariantMap{{"code", reply->errorString()}}});
29+
return;
30+
}
31+
resolve(d->bridge, QVariantList{true});
32+
});
33+
}
34+
35+
36+
ReactImageLoader::ReactImageLoader(QObject* parent)
37+
: QObject(parent)
38+
, d_ptr(new ReactImageLoaderPrivate)
39+
{
40+
}
41+
42+
ReactImageLoader::~ReactImageLoader()
43+
{
44+
}
45+
46+
void ReactImageLoader::setBridge(ReactBridge* bridge)
47+
{
48+
d_func()->bridge = bridge;
49+
}
50+
51+
QString ReactImageLoader::moduleName()
52+
{
53+
return "RCTImageLoader";
54+
}
55+
56+
QList<ReactModuleMethod*> ReactImageLoader::methodsToExport()
57+
{
58+
return QList<ReactModuleMethod*>{};
59+
}
60+
61+
QVariantMap ReactImageLoader::constantsToExport()
62+
{
63+
return QVariantMap{};
64+
}
65+
66+
QUrl ReactImageLoader::provideUriFromSourceUrl(const QUrl& source)
67+
{
68+
return source;
69+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#ifndef REACTIMAGELOADER_H
2+
#define REACTIMAGELOADER_H
3+
4+
#include <QUrl>
5+
6+
#include "reactmoduleinterface.h"
7+
8+
9+
class ReactImageLoaderPrivate;
10+
class ReactImageLoader
11+
: public QObject
12+
, public ReactModuleInterface
13+
{
14+
Q_OBJECT
15+
// Q_PLUGIN_METADATA(IID ReactModuleInterface_IID)
16+
Q_INTERFACES(ReactModuleInterface)
17+
18+
Q_INVOKABLE REACT_PROMISE
19+
void prefetchImage(const QString& url,
20+
const ReactModuleInterface::ListArgumentBlock& resolve,
21+
const ReactModuleInterface::ListArgumentBlock& reject);
22+
23+
Q_DECLARE_PRIVATE(ReactImageLoader)
24+
25+
public:
26+
ReactImageLoader(QObject* parent = 0);
27+
~ReactImageLoader();
28+
29+
void setBridge(ReactBridge* bridge) override;
30+
31+
QString moduleName() override;
32+
QList<ReactModuleMethod*> methodsToExport() override;
33+
QVariantMap constantsToExport() override;
34+
35+
QUrl provideUriFromSourceUrl(const QUrl& source);
36+
37+
private:
38+
QScopedPointer<ReactImageLoaderPrivate> d_ptr;
39+
};
40+
41+
#endif // REACTIMAGELOADER_H

0 commit comments

Comments
 (0)
X Tutup