├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values
│ │ │ │ └── strings.xml
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ └── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ ├── java
│ │ │ └── proxypref
│ │ │ │ └── test
│ │ │ │ └── TestActivity.java
│ │ └── AndroidManifest.xml
│ └── androidTest
│ │ └── java
│ │ └── proxypref
│ │ └── test
│ │ └── TestActivityTest.java
└── build.gradle
├── app-no-rx
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values
│ │ │ │ └── strings.xml
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ └── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ ├── java
│ │ │ └── proxypref
│ │ │ │ └── test
│ │ │ │ └── TestActivity.java
│ │ └── AndroidManifest.xml
│ └── androidTest
│ │ └── java
│ │ └── proxypref
│ │ └── test
│ │ └── TestActivityTest.java
└── build.gradle
├── proxypref
├── .gitignore
├── gradle.properties
├── src
│ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── proxypref
│ │ │ ├── annotation
│ │ │ ├── DefaultLong.java
│ │ │ ├── DefaultSet.java
│ │ │ ├── Preference.java
│ │ │ ├── DefaultFloat.java
│ │ │ ├── DefaultInteger.java
│ │ │ ├── DefaultString.java
│ │ │ └── DefaultBoolean.java
│ │ │ ├── ProxyPreferences.java
│ │ │ ├── method
│ │ │ ├── MethodInfo.java
│ │ │ ├── RxDelegate.java
│ │ │ ├── OnSharedPreferenceChangeListenerOnSubscribe.java
│ │ │ ├── DataType.java
│ │ │ └── MethodType.java
│ │ │ └── ProxyHandler.java
│ └── test
│ │ └── java
│ │ └── proxypref
│ │ ├── method
│ │ └── Coverage.java
│ │ ├── Coverage.java
│ │ ├── DefaultValuesTest.java
│ │ ├── ProxyHandlerKeyTest.java
│ │ ├── TestUtil.java
│ │ ├── ProxyHandlerRxAssertionsTest.java
│ │ ├── ProxyHandlerTest.java
│ │ ├── ProxyHandlerAssertionsTest.java
│ │ ├── ProxyHandlerRxTest.java
│ │ └── ProxyHandlerTypesTest.java
└── build.gradle
├── settings.gradle
├── .gitignore
├── gradle
├── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
└── gradle-mvn-push.gradle
├── gradle.properties
├── LICENSE.txt
├── gradlew.bat
├── README.md
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app-no-rx/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/proxypref/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':proxypref', ':app', ':app-no-rx'
2 |
--------------------------------------------------------------------------------
/proxypref/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=ProxyPref
2 | POM_ARTIFACT_ID=proxypref
3 | POM_PACKAGING=jar
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /.gradle
2 | /local.properties
3 | /.idea
4 | /build
5 | /captures
6 | *.iml
7 | .DS_Store
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ProxyPreferences
3 |
4 |
--------------------------------------------------------------------------------
/app-no-rx/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ProxyPreferences
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app-no-rx/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app-no-rx/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app-no-rx/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app-no-rx/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app-no-rx/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app-no-rx/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app-no-rx/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/konmik/proxypref/HEAD/app-no-rx/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/proxypref/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/proxypref/src/test/java/proxypref/method/Coverage.java:
--------------------------------------------------------------------------------
1 | package proxypref.method;
2 |
3 | import org.junit.Test;
4 |
5 | public class Coverage {
6 | @Test
7 | public void instantiate_utility_classes() throws Exception {
8 | new RxDelegate();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Sep 15 19:32:27 MSK 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
7 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/DefaultLong.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface DefaultLong {
8 | long value();
9 | }
10 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/DefaultSet.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface DefaultSet {
8 | String[] value();
9 | }
10 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/Preference.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface Preference {
8 | String value();
9 | }
10 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/DefaultFloat.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface DefaultFloat {
8 | float value();
9 | }
10 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/DefaultInteger.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface DefaultInteger {
8 | int value();
9 | }
10 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/DefaultString.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface DefaultString {
8 | String value();
9 | }
10 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/annotation/DefaultBoolean.java:
--------------------------------------------------------------------------------
1 | package proxypref.annotation;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 |
6 | @Retention(RetentionPolicy.RUNTIME)
7 | public @interface DefaultBoolean {
8 | boolean value();
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/proxypref/test/TestActivity.java:
--------------------------------------------------------------------------------
1 | package proxypref.test;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 |
6 | public class TestActivity extends Activity {
7 | @Override
8 | protected void onCreate(Bundle savedInstanceState) {
9 | super.onCreate(savedInstanceState);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/app-no-rx/src/main/java/proxypref/test/TestActivity.java:
--------------------------------------------------------------------------------
1 | package proxypref.test;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 |
6 | public class TestActivity extends Activity {
7 | @Override
8 | protected void onCreate(Bundle savedInstanceState) {
9 | super.onCreate(savedInstanceState);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/proxypref/src/test/java/proxypref/Coverage.java:
--------------------------------------------------------------------------------
1 | package proxypref;
2 |
3 | import org.junit.Test;
4 |
5 | import info.android15.proxypreferences.BuildConfig;
6 |
7 | public class Coverage {
8 | @Test
9 | public void instantiate_utility_classes() throws Exception {
10 | new ProxyPreferences();
11 | new BuildConfig();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app-no-rx/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/ProxyPreferences.java:
--------------------------------------------------------------------------------
1 | package proxypref;
2 |
3 | import android.content.SharedPreferences;
4 |
5 | import java.lang.reflect.Proxy;
6 |
7 | public class ProxyPreferences {
8 |
9 | public static T build(Class tClass, SharedPreferences pref) {
10 | //noinspection unchecked
11 | return (T)Proxy.newProxyInstance(tClass.getClassLoader(), new Class>[]{tClass}, new ProxyHandler(pref, false));
12 | }
13 |
14 | public static T buildWithRx(Class tClass, SharedPreferences pref) {
15 | //noinspection unchecked
16 | return (T)Proxy.newProxyInstance(tClass.getClassLoader(), new Class>[]{tClass}, new ProxyHandler(pref, true));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | VERSION_CODE=2
2 | VERSION_NAME=0.2.0
3 | GROUP=info.android15.proxypref
4 |
5 | POM_DESCRIPTION=ProxyPref is a simple Android library, which allows to easily access SharedPreferences.
6 | POM_URL=https://github.com/konmik/proxypref
7 | POM_SCM_URL=https://github.com/konmik/proxypref
8 | POM_SCM_CONNECTION=scm:git@github.com:konmik/proxypref.git
9 | POM_SCM_DEV_CONNECTION=scm:git@github.com:konimk/proxypref.git
10 | POM_LICENCE_NAME=MIT
11 | POM_LICENCE_URL=http://opensource.org/licenses/MIT
12 | POM_LICENCE_DIST=repo
13 | POM_DEVELOPER_ID=sirstripy
14 | POM_DEVELOPER_NAME=Konstantin Mikheev
15 |
16 | #RELEASE_REPOSITORY_URL=file://C:/Users/konmik/.m2/repository
17 | #SNAPSHOT_REPOSITORY_URL=file://C:/Users/konmik/.m2/repository
18 |
--------------------------------------------------------------------------------
/app-no-rx/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.1"
6 |
7 | defaultConfig {
8 | applicationId "proxypref.test"
9 | minSdkVersion 14
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 |
15 | defaultConfig {
16 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
17 | }
18 | }
19 |
20 | dependencies {
21 | compile project(':proxypref')
22 | androidTestCompile 'com.android.support.test:runner:0.4'
23 | androidTestCompile 'com.android.support.test:rules:0.4'
24 | androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
25 | }
26 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.1"
6 |
7 | defaultConfig {
8 | applicationId "proxypref.test"
9 | minSdkVersion 14
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 |
15 | defaultConfig {
16 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
17 | }
18 | }
19 |
20 | dependencies {
21 | compile project(':proxypref')
22 | compile 'io.reactivex:rxjava:1.0.14'
23 | androidTestCompile 'com.android.support.test:runner:0.4'
24 | androidTestCompile 'com.android.support.test:rules:0.4'
25 | androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
26 | }
27 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/method/MethodInfo.java:
--------------------------------------------------------------------------------
1 | package proxypref.method;
2 |
3 | import android.content.SharedPreferences;
4 |
5 | import java.lang.reflect.Method;
6 |
7 | public class MethodInfo {
8 |
9 | private final MethodType methodType;
10 | private final DataType dataType;
11 | private final String key;
12 | private final Object defValue;
13 |
14 | public MethodInfo(Method method, boolean rx) {
15 | this.methodType = MethodType.from(method, rx);
16 | this.dataType = methodType.getDataType(method);
17 | this.key = methodType.getKey(method);
18 | this.defValue = dataType.getDefaultValue(method);
19 | }
20 |
21 | public Object invoke(SharedPreferences pref, Object[] args) {
22 | return methodType.invoke(dataType, key, pref, args, defValue);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/ProxyHandler.java:
--------------------------------------------------------------------------------
1 | package proxypref;
2 |
3 | import android.content.SharedPreferences;
4 |
5 | import java.lang.reflect.InvocationHandler;
6 | import java.lang.reflect.Method;
7 | import java.util.HashMap;
8 |
9 | import proxypref.method.MethodInfo;
10 |
11 | class ProxyHandler implements InvocationHandler {
12 |
13 | private final SharedPreferences pref;
14 | private final boolean rx;
15 |
16 | public ProxyHandler(SharedPreferences pref, boolean rx) {
17 | this.pref = pref;
18 | this.rx = rx;
19 | }
20 |
21 | private static HashMap methods = new HashMap<>();
22 |
23 | @Override
24 | public Object invoke(Object proxy, final Method method, Object[] args) throws Throwable {
25 | MethodInfo methodInfo = methods.get(method);
26 | if (methodInfo == null)
27 | methods.put(method, methodInfo = new MethodInfo(method, rx));
28 | return methodInfo.invoke(pref, args);
29 | }
30 |
31 | public static void clearCache() {
32 | methods.clear();
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/method/RxDelegate.java:
--------------------------------------------------------------------------------
1 | package proxypref.method;
2 |
3 | import android.content.SharedPreferences;
4 |
5 | import rx.Observable;
6 | import rx.functions.Action1;
7 | import rx.functions.Func0;
8 |
9 | class RxDelegate {
10 |
11 | static Object createAction1(final DataType dataType, final String key, final SharedPreferences pref, final Object defValue) {
12 | return new Action1() {
13 | @Override
14 | public void call(Object o) {
15 | MethodType.SET.invoke(dataType, key, pref, new Object[]{o}, defValue);
16 | }
17 | };
18 | }
19 |
20 | static Object createObservable(final DataType dataType, final String key, final SharedPreferences pref, final Object[] args, final Object defValue) {
21 | return Observable.create(new OnSharedPreferenceChangeListenerOnSubscribe(pref, key, new Func0() {
22 | @Override
23 | public Object call() {
24 | return MethodType.GET.invoke(dataType, key, pref, args, defValue);
25 | }
26 | }));
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/proxypref/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.1"
6 |
7 | defaultConfig {
8 | minSdkVersion 14
9 | targetSdkVersion 23
10 | versionCode 1
11 | versionName "1.0"
12 | }
13 | }
14 |
15 | configurations {
16 | compileJavadoc
17 | }
18 |
19 | dependencies {
20 | compile "com.android.support:support-annotations:23.0.1"
21 | provided 'io.reactivex:rxjava:1.0.14'
22 | testCompile 'io.reactivex:rxjava:1.0.14'
23 | testCompile 'junit:junit:4.12'
24 | testCompile 'org.mockito:mockito-all:1.10.19'
25 | }
26 |
27 | android.libraryVariants.all { variant ->
28 | def name = variant.buildType.name
29 | if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
30 | return; // Skip debug builds.
31 | }
32 | def task = project.tasks.create "jar${name.capitalize()}", Jar
33 | task.dependsOn variant.javaCompile
34 | task.from variant.javaCompile.destinationDir
35 | artifacts.add('archives', task);
36 | }
37 |
38 | apply from: '../gradle/gradle-mvn-push.gradle'
39 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Konstantin Mikheev sirstripy-at-gmail-com
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/proxypref/src/main/java/proxypref/method/OnSharedPreferenceChangeListenerOnSubscribe.java:
--------------------------------------------------------------------------------
1 | package proxypref.method;
2 |
3 | import android.content.SharedPreferences;
4 |
5 | import rx.Observable;
6 | import rx.Subscriber;
7 | import rx.functions.Action0;
8 | import rx.functions.Func0;
9 | import rx.subscriptions.Subscriptions;
10 |
11 | public class OnSharedPreferenceChangeListenerOnSubscribe implements Observable.OnSubscribe