Skip to content
This repository was archived by the owner on Mar 4, 2023. It is now read-only.

Commit ff82049

Browse files
committed
wip shared prefs
1 parent 2dc2d9e commit ff82049

File tree

7 files changed

+269
-11
lines changed

7 files changed

+269
-11
lines changed

Demo/main.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "opener.h"
66
#ifdef Q_OS_ANDROID
77
#include <contentdevice.h>
8+
#include <sharedpreferences.h>
89
#endif
910

1011
int main(int argc, char *argv[])
@@ -29,6 +30,14 @@ int main(int argc, char *argv[])
2930
device.close();
3031
} else
3132
qCritical() << "ContentDevice:" << device.errorString();
33+
34+
auto prefs = SharedPreferences::getPreferences();
35+
QObject::connect(prefs, &SharedPreferences::loaded, prefs, [prefs](){
36+
qDebug() << "init state" << prefs->data();
37+
prefs->setValue("test1", "test2");
38+
prefs->setValue("test2", 42);
39+
prefs->remove("test2");
40+
});
3241
#endif
3342

3443
QQmlApplicationEngine engine;

android/src/de/skycoder42/androidutils/AndroidUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public void onDispatched(String name , Map data) {
2121

2222
if (name.equals("AndroidUtils.hapticFeedback"))
2323
AndroidUtils.hapticFeedback((Integer)data.get("feedbackConstant"));
24-
if (name.equals("AndroidUtils.setStatusBarColor"))
25-
AndroidUtils.setStatusBarColor((String)data.get("color"));
24+
else if (name.equals("AndroidUtils.setStatusBarColor"))
25+
AndroidUtils.setStatusBarColor((String)data.get("color"));
2626
}
2727
});
2828
}

android/src/de/skycoder42/androidutils/FileChooser.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
import androidnative.SystemDispatcher;
1212

1313
public class FileChooser {
14-
public static final int CHOOSE_CONTENT_ACTION = 0x1091c657;
15-
public static final int CHOOSE_PERSISTENT_ACTION = 0x1091c658;
14+
private static final int CHOOSE_CONTENT_ACTION = 0x1091c657;
15+
private static final int CHOOSE_PERSISTENT_ACTION = 0x1091c658;
1616

17-
public static final String GET_CONTENT_MESSAGE = "AndroidUtils.FileChooser.getContent";
18-
public static final String OPEN_DOCUMENT_MESSAGE = "AndroidUtils.FileChooser.openDocument";
19-
public static final String CREATE_DOCUMENT_MESSAGE = "AndroidUtils.FileChooser.createDocument";
20-
public static final String CONTENT_CHOOSEN_MESSAGE = "AndroidUtils.FileChooser.contentChoosen";
17+
private static final String GET_CONTENT_MESSAGE = "AndroidUtils.FileChooser.getContent";
18+
private static final String OPEN_DOCUMENT_MESSAGE = "AndroidUtils.FileChooser.openDocument";
19+
private static final String CREATE_DOCUMENT_MESSAGE = "AndroidUtils.FileChooser.createDocument";
20+
private static final String CONTENT_CHOOSEN_MESSAGE = "AndroidUtils.FileChooser.contentChoosen";
2121

2222
static {
2323
SystemDispatcher.addListener(new SystemDispatcher.Listener() {
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package de.skycoder42.androidutils;
2+
3+
import java.util.Map;
4+
import java.util.AbstractMap;
5+
import java.util.HashMap;
6+
import android.content.Context;
7+
import android.content.SharedPreferences;
8+
import org.qtproject.qt5.android.QtNative;
9+
import androidnative.SystemDispatcher;
10+
11+
public class PrefHelper {
12+
private static final String DATA_CHANGED_MESSAGE = "AndroidUtils.PrefHelper.changed.";
13+
private static final String DATA_LOADED_MESSAGE = "AndroidUtils.PrefHelper.loaded.";
14+
15+
static {
16+
SystemDispatcher.addListener(new SystemDispatcher.Listener() {
17+
18+
public void onDispatched(String name , Map data) {
19+
if (name.equals("AndroidUtils.PrefHelper.getPrefs"))
20+
getPrefs((String)data.get("id"));
21+
else if (name.equals("AndroidUtils.PrefHelper.getSharedPrefs"))
22+
getSharedPrefs((String)data.get("id"), (String)data.get("name"));
23+
else if (name.equals("AndroidUtils.PrefHelper.remPrefs"))
24+
remPrefs((String)data.get("id"));
25+
else if (name.equals("AndroidUtils.PrefHelper.save"))
26+
save((String)data.get("id"), (String)data.get("key"), data.get("value"));
27+
else if (name.equals("AndroidUtils.PrefHelper.remove"))
28+
remove((String)data.get("id"), (String)data.get("key"));
29+
}
30+
});
31+
}
32+
33+
interface HelperListener extends SharedPreferences.OnSharedPreferenceChangeListener {
34+
SharedPreferences preferences();
35+
}
36+
37+
static Map<String, HelperListener> _activePrefs = new HashMap<>();
38+
39+
static void getPrefs(String id) {
40+
registerPrefs(id, QtNative.activity().getPreferences(Context.MODE_PRIVATE));
41+
}
42+
43+
static void getSharedPrefs(String id, String name) {
44+
Context c = QtNative.activity();
45+
if(c == null)
46+
c = QtNative.service();
47+
registerPrefs(id, c.getSharedPreferences(name, Context.MODE_PRIVATE));
48+
}
49+
50+
static void remPrefs(final String id) {
51+
HelperListener listener = _activePrefs.remove(id);
52+
listener.preferences().unregisterOnSharedPreferenceChangeListener(listener);
53+
}
54+
55+
static void save(String id, String key, Object value) {
56+
SharedPreferences.Editor prefs = _activePrefs.get(id).preferences().edit();
57+
if (value.getClass() == Boolean.class) {
58+
prefs.putBoolean(key, (Boolean)value);
59+
} else if (value.getClass() == Float.class) {
60+
prefs.putFloat(key, (Float)value);
61+
} else if (value.getClass() == Integer.class) {
62+
prefs.putInt(key, (Integer)value);
63+
} else if (value.getClass() == Long.class) {
64+
prefs.putLong(key, (Long)value);
65+
} else if (value.getClass() == String.class) {
66+
prefs.putString(key, (String)value);
67+
}
68+
prefs.apply();
69+
}
70+
71+
static void remove(String id, String key) {
72+
SharedPreferences.Editor prefs = _activePrefs.get(id).preferences().edit();
73+
prefs.remove(key);
74+
prefs.apply();
75+
}
76+
77+
static void registerPrefs(final String id, final SharedPreferences preferences) {
78+
HelperListener listener = new HelperListener() {
79+
80+
public SharedPreferences preferences() {
81+
return preferences;
82+
}
83+
84+
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
85+
if(prefs.contains(key)) {
86+
Map<String, ?> data = prefs.getAll();
87+
Map reply = new HashMap();
88+
reply.put("key", key);
89+
reply.put("value", data.get(key));
90+
SystemDispatcher.dispatch(DATA_CHANGED_MESSAGE + id, reply);
91+
} else {
92+
Map reply = new HashMap();
93+
reply.put("key", key);
94+
reply.put("removed", true);
95+
SystemDispatcher.dispatch(DATA_CHANGED_MESSAGE + id, reply);
96+
}
97+
}
98+
};
99+
_activePrefs.put(id, listener);
100+
preferences.registerOnSharedPreferenceChangeListener(listener);
101+
102+
SystemDispatcher.dispatch(DATA_LOADED_MESSAGE + id, preferences.getAll());
103+
}
104+
}

de_skycoder42_androidutils.pri

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ android: QT *= androidextras
22

33
HEADERS += \
44
$$PWD/androidutils.h \
5-
$$PWD/filechooser.h
5+
$$PWD/filechooser.h \
6+
$$PWD/sharedpreferences.h
67

78
SOURCES += \
89
$$PWD/androidutils.cpp \
9-
$$PWD/filechooser.cpp
10+
$$PWD/filechooser.cpp \
11+
$$PWD/sharedpreferences.cpp
1012
RESOURCES += \
1113
$$PWD/de_skycoder42_androidutils.qrc
1214

@@ -16,7 +18,8 @@ DISTFILES += \
1618
$$PWD/android/androidutils.gradle \
1719
$$PWD/android/src/de/skycoder42/androidutils/AlarmReceiver.java \
1820
$$PWD/android/src/de/skycoder42/androidutils/AndroidUtils.java \
19-
$$PWD/android/src/de/skycoder42/androidutils/FileChooser.java
21+
$$PWD/android/src/de/skycoder42/androidutils/FileChooser.java \
22+
$$PWD/android/src/de/skycoder42/androidutils/PrefHelper.java
2023

2124
android {
2225
HEADERS += $$PWD/contentdevice.h

sharedpreferences.cpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#include "sharedpreferences.h"
2+
3+
#include <QUuid>
4+
#include <AndroidNative/systemdispatcher.h>
5+
6+
SharedPreferences::SharedPreferences(const QString &id, QObject *parent) :
7+
QObject(parent),
8+
_id(id),
9+
_data()
10+
{
11+
AndroidNative::SystemDispatcher::instance()->loadClass(QStringLiteral("de.skycoder42.androidutils.PrefHelper"));
12+
13+
connect(AndroidNative::SystemDispatcher::instance(), &AndroidNative::SystemDispatcher::dispatched,
14+
this, &SharedPreferences::dispatched,
15+
Qt::QueuedConnection);
16+
}
17+
18+
SharedPreferences::~SharedPreferences()
19+
{
20+
AndroidNative::SystemDispatcher::instance()->dispatch(QStringLiteral("AndroidUtils.PrefHelper.remPrefs"), {
21+
{QStringLiteral("id"), _id}
22+
});
23+
}
24+
25+
SharedPreferences *SharedPreferences::getPreferences(QObject *parent)
26+
{
27+
auto id = QUuid::createUuid().toString();
28+
auto prefs = new SharedPreferences(id, parent);
29+
AndroidNative::SystemDispatcher::instance()->dispatch(QStringLiteral("AndroidUtils.PrefHelper.getPrefs"), {
30+
{QStringLiteral("id"), id}
31+
});
32+
return prefs;
33+
}
34+
35+
SharedPreferences *SharedPreferences::getSharedPreferences(const QString &name, QObject *parent)
36+
{
37+
auto id = QUuid::createUuid().toString();
38+
auto prefs = new SharedPreferences(id, parent);
39+
AndroidNative::SystemDispatcher::instance()->dispatch(QStringLiteral("AndroidUtils.PrefHelper.getSharedPrefs"), {
40+
{QStringLiteral("id"), id},
41+
{QStringLiteral("name"), name}
42+
});
43+
return prefs;
44+
}
45+
46+
QStringList SharedPreferences::keys() const
47+
{
48+
return _data.keys();
49+
}
50+
51+
bool SharedPreferences::contains(const QString &key) const
52+
{
53+
return _data.contains(key);
54+
}
55+
56+
QVariant SharedPreferences::value(const QString &key) const
57+
{
58+
return _data.value(key);
59+
}
60+
61+
QVariantMap SharedPreferences::data() const
62+
{
63+
return _data;
64+
}
65+
66+
void SharedPreferences::setValue(const QString &key, const QVariant &value)
67+
{
68+
_data.insert(key, value);
69+
AndroidNative::SystemDispatcher::instance()->dispatch(QStringLiteral("AndroidUtils.PrefHelper.save"), {
70+
{QStringLiteral("id"), _id},
71+
{QStringLiteral("key"), key},
72+
{QStringLiteral("value"), value}
73+
});
74+
}
75+
76+
void SharedPreferences::remove(const QString &key)
77+
{
78+
_data.remove(key);
79+
AndroidNative::SystemDispatcher::instance()->dispatch(QStringLiteral("AndroidUtils.PrefHelper.remove"), {
80+
{QStringLiteral("id"), _id},
81+
{QStringLiteral("key"), key}
82+
});
83+
}
84+
85+
void SharedPreferences::dispatched(const QString &message, const QVariantMap &data)
86+
{
87+
if(message == QStringLiteral("AndroidUtils.PrefHelper.changed.") + _id) {
88+
auto key = data.value(QStringLiteral("key")).toString();
89+
auto removed = data.value(QStringLiteral("removed"), false).toBool();
90+
auto value = data.value(QStringLiteral("value"));
91+
if(removed) {
92+
if(_data.remove(key) > 0)
93+
emit changed(key, QVariant());
94+
} else {
95+
_data.insert(key, value);
96+
emit changed(key, value);
97+
}
98+
} else if(message == QStringLiteral("AndroidUtils.PrefHelper.loaded.") + _id)
99+
_data = data;
100+
}

sharedpreferences.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#ifndef SHAREDPREFERENCES_H
2+
#define SHAREDPREFERENCES_H
3+
4+
#include <QObject>
5+
#include <QString>
6+
#include <QVariant>
7+
8+
class SharedPreferences : public QObject
9+
{
10+
Q_OBJECT
11+
12+
public:
13+
~SharedPreferences();
14+
15+
static SharedPreferences *getPreferences(QObject *parent = nullptr);
16+
static SharedPreferences *getSharedPreferences(const QString &name, QObject *parent = nullptr);
17+
18+
Q_INVOKABLE QStringList keys() const;
19+
Q_INVOKABLE bool contains(const QString &key) const;
20+
Q_INVOKABLE QVariant value(const QString &key) const;
21+
22+
Q_INVOKABLE QVariantMap data() const;
23+
24+
public slots:
25+
void setValue(const QString &key, const QVariant &value);
26+
void remove(const QString &key);
27+
28+
signals:
29+
void loaded();
30+
void changed(const QString &key, const QVariant &value);
31+
32+
private slots:
33+
void dispatched(const QString &message, const QVariantMap &data);
34+
35+
private:
36+
const QString _id;
37+
QVariantMap _data;
38+
39+
explicit SharedPreferences(const QString &id, QObject *parent = nullptr);
40+
};
41+
42+
#endif // SHAREDPREFERENCES_H

0 commit comments

Comments
 (0)