소스 검색

Include reactive network as library

inorichi 9 년 전
부모
커밋
cb3c3af865

+ 1 - 1
app/build.gradle

@@ -99,6 +99,7 @@ dependencies {
 
     compile fileTree(dir: 'libs', include: ['*.jar'])
     compile project(":SubsamplingScaleImageView")
+    compile project(":ReactiveNetwork")
 
     compile "com.android.support:support-v4:$SUPPORT_LIBRARY_VERSION"
     compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
@@ -130,7 +131,6 @@ dependencies {
     compile 'eu.davidea:flexible-adapter:4.2.0'
     compile 'com.nononsenseapps:filepicker:2.5.1'
     compile 'com.github.amulyakhare:TextDrawable:558677e'
-    compile 'com.github.pwittchen:reactivenetwork:0.1.5'
 
     compile "org.greenrobot:eventbus:$EVENTBUS_VERSION"
     apt "org.greenrobot:eventbus-annotation-processor:$EVENTBUS_VERSION"

+ 1 - 0
libs/ReactiveNetwork/.gitignore

@@ -0,0 +1 @@
+/build

+ 40 - 0
libs/ReactiveNetwork/build.gradle

@@ -0,0 +1,40 @@
+apply plugin: 'com.android.library'
+
+android {
+  compileSdkVersion 23
+  buildToolsVersion "23.0.2"
+
+  defaultConfig {
+    minSdkVersion 9
+    targetSdkVersion 23
+    versionCode 1
+    versionName "1.0"
+    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+  }
+
+  buildTypes {
+    release {
+      minifyEnabled false
+      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+    }
+  }
+
+  packagingOptions {
+    exclude 'LICENSE.txt'
+    exclude 'META-INF/LICENSE.txt'
+  }
+}
+
+dependencies {
+  compile 'io.reactivex:rxjava:1.1.0'
+  compile 'io.reactivex:rxandroid:1.1.0'
+
+  androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
+  androidTestCompile('com.google.truth:truth:0.27') {
+    exclude group: 'junit' // Android has JUnit built in
+  }
+}
+
+task wrapper(type: Wrapper) {
+  gradleVersion = '2.2.1'
+}

+ 17 - 0
libs/ReactiveNetwork/proguard-rules.pro

@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /home/piotr/Android/Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}

+ 64 - 0
libs/ReactiveNetwork/src/androidTest/java/com/github/pwittchen/reactivenetwork/library/ConnectivityStatusTest.java

@@ -0,0 +1,64 @@
+package com.github.pwittchen.reactivenetwork.library;
+
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import rx.functions.Func1;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(AndroidJUnit4.class) public class ConnectivityStatusTest {
+
+  @Test public void testStatusShouldBeEqualToGivenValue() {
+    // given
+    ConnectivityStatus givenStatus = ConnectivityStatus.WIFI_CONNECTED;
+
+    // when
+    Func1<ConnectivityStatus, Boolean> equalTo = ConnectivityStatus.isEqualTo(givenStatus);
+    Boolean shouldBeEqualToGivenStatus = equalTo.call(givenStatus);
+
+    // then
+    assertThat(shouldBeEqualToGivenStatus).isTrue();
+  }
+
+  @Test public void testStatusShouldBeEqualToOneOfGivenMultipleValues() {
+    // given
+    ConnectivityStatus mobileConnected = ConnectivityStatus.MOBILE_CONNECTED;
+    ConnectivityStatus givenStatuses[] =
+        { ConnectivityStatus.WIFI_CONNECTED, ConnectivityStatus.MOBILE_CONNECTED };
+
+    // when
+    Func1<ConnectivityStatus, Boolean> equalTo = ConnectivityStatus.isEqualTo(givenStatuses);
+    Boolean shouldBeEqualToGivenStatus = equalTo.call(mobileConnected);
+
+    // then
+    assertThat(shouldBeEqualToGivenStatus).isTrue();
+  }
+
+  @Test public void testStatusShouldNotBeEqualToGivenValue() {
+    // given
+    ConnectivityStatus oneStatus = ConnectivityStatus.WIFI_CONNECTED;
+    ConnectivityStatus anotherStatus = ConnectivityStatus.MOBILE_CONNECTED;
+
+    // when
+    Func1<ConnectivityStatus, Boolean> notEqualTo = ConnectivityStatus.isNotEqualTo(oneStatus);
+    Boolean shouldBeEqualToGivenStatus = notEqualTo.call(anotherStatus);
+
+    // then
+    assertThat(shouldBeEqualToGivenStatus).isTrue();
+  }
+
+  @Test public void testStatusShouldNotBeEqualToOneOfGivenMultipleValues() {
+    // given
+    ConnectivityStatus offline = ConnectivityStatus.OFFLINE;
+    ConnectivityStatus givenStatuses[] =
+        { ConnectivityStatus.WIFI_CONNECTED, ConnectivityStatus.MOBILE_CONNECTED };
+
+    // when
+    Func1<ConnectivityStatus, Boolean> notEqualTo = ConnectivityStatus.isNotEqualTo(givenStatuses);
+    Boolean shouldBeEqualToGivenStatus = notEqualTo.call(offline);
+
+    // then
+    assertThat(shouldBeEqualToGivenStatus).isTrue();
+  }
+}

+ 21 - 0
libs/ReactiveNetwork/src/androidTest/java/com/github/pwittchen/reactivenetwork/library/ReactiveNetworkTest.java

@@ -0,0 +1,21 @@
+package com.github.pwittchen.reactivenetwork.library;
+
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(AndroidJUnit4.class) public class ReactiveNetworkTest {
+
+  @Test public void testReactiveNetworkObjectShouldNotBeNull() {
+    // given
+    ReactiveNetwork reactiveNetwork;
+
+    // when
+    reactiveNetwork = new ReactiveNetwork();
+
+    // then
+    assertThat(reactiveNetwork).isNotNull();
+  }
+}

+ 10 - 0
libs/ReactiveNetwork/src/main/AndroidManifest.xml

@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.github.pwittchen.reactivenetwork.library"
+    >
+
+  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+
+  <application/>
+
+</manifest>

+ 84 - 0
libs/ReactiveNetwork/src/main/java/com/github/pwittchen/reactivenetwork/library/ConnectivityStatus.java

@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 Piotr Wittchen
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.pwittchen.reactivenetwork.library;
+
+import rx.functions.Func1;
+
+public enum ConnectivityStatus {
+  UNKNOWN("unknown"),
+  WIFI_CONNECTED("connected to WiFi"),
+  WIFI_CONNECTED_HAS_INTERNET("connected to WiFi (Internet available)"),
+  WIFI_CONNECTED_HAS_NO_INTERNET("connected to WiFi (Internet not available)"),
+  MOBILE_CONNECTED("connected to mobile network"),
+  OFFLINE("offline");
+
+  public final String description;
+
+  ConnectivityStatus(final String description) {
+    this.description = description;
+  }
+
+  /**
+   * Creates a function, which checks
+   * if single connectivity status or many statuses
+   * are equal to current status. It can be used inside filter(...)
+   * method from RxJava
+   *
+   * @param statuses many connectivity statuses or single status
+   * @return Func1<ConnectivityStatus, Boolean> from RxJava
+   */
+  public static Func1<ConnectivityStatus, Boolean> isEqualTo(final ConnectivityStatus... statuses) {
+    return new Func1<ConnectivityStatus, Boolean>() {
+      @Override public Boolean call(ConnectivityStatus connectivityStatus) {
+        boolean statuesAreEqual = false;
+
+        for (ConnectivityStatus singleStatus : statuses) {
+          statuesAreEqual = singleStatus == connectivityStatus;
+        }
+
+        return statuesAreEqual;
+      }
+    };
+  }
+
+  /**
+   * Creates a function, which checks
+   * if single connectivity status or many statuses
+   * are not equal to current status. It can be used inside filter(...)
+   * method from RxJava
+   *
+   * @param statuses many connectivity statuses or single status
+   * @return Func1<ConnectivityStatus, Boolean> from RxJava
+   */
+  public static Func1<ConnectivityStatus, Boolean> isNotEqualTo(
+      final ConnectivityStatus... statuses) {
+    return new Func1<ConnectivityStatus, Boolean>() {
+      @Override public Boolean call(ConnectivityStatus connectivityStatus) {
+        boolean statuesAreNotEqual = false;
+
+        for (ConnectivityStatus singleStatus : statuses) {
+          statuesAreNotEqual = singleStatus != connectivityStatus;
+        }
+
+        return statuesAreNotEqual;
+      }
+    };
+  }
+
+  @Override public String toString() {
+    return "ConnectivityStatus{" + "description='" + description + '\'' + '}';
+  }
+}

+ 142 - 0
libs/ReactiveNetwork/src/main/java/com/github/pwittchen/reactivenetwork/library/ReactiveNetwork.java

@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2015 Piotr Wittchen
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.pwittchen.reactivenetwork.library;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Looper;
+
+import rx.Observable;
+import rx.Scheduler;
+import rx.Subscriber;
+import rx.Subscription;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action0;
+import rx.subscriptions.Subscriptions;
+
+/**
+ * ReactiveNetwork is an Android library
+ * listening network connection state and change of the WiFi signal strength
+ * with RxJava Observables. It can be easily used with RxAndroid.
+ */
+public class ReactiveNetwork {
+  private boolean checkInternet = false;
+  private ConnectivityStatus status = ConnectivityStatus.UNKNOWN;
+
+  /**
+   * Enables Internet connection check.
+   * When it's called WIFI_CONNECTED_HAS_INTERNET and WIFI_CONNECTED_HAS_NO_INTERNET statuses
+   * can be emitted by observeConnectivity(context) method. When it isn't called
+   * only WIFI_CONNECTED can by emitted by observeConnectivity(context) method.
+   *
+   * @return ReactiveNetwork object
+   */
+  public ReactiveNetwork enableInternetCheck() {
+    checkInternet = true;
+    return this;
+  }
+
+  /**
+   * Observes ConnectivityStatus,
+   * which can be WIFI_CONNECTED, MOBILE_CONNECTED or OFFLINE
+   *
+   * @param context Context of the activity or an application
+   * @return RxJava Observable with ConnectivityStatus
+   */
+  public Observable<ConnectivityStatus> observeConnectivity(final Context context) {
+    final IntentFilter filter = new IntentFilter();
+    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+
+    return Observable.create(new Observable.OnSubscribe<ConnectivityStatus>() {
+      @Override public void call(final Subscriber<? super ConnectivityStatus> subscriber) {
+        final BroadcastReceiver receiver = new BroadcastReceiver() {
+          @Override public void onReceive(Context context, Intent intent) {
+            final ConnectivityStatus newStatus = getConnectivityStatus(context, checkInternet);
+
+            // we need to perform check below,
+            // because after going off-line, onReceive() is called twice
+            if (newStatus != status) {
+              status = newStatus;
+              subscriber.onNext(newStatus);
+            }
+          }
+        };
+
+        context.registerReceiver(receiver, filter);
+
+        subscriber.add(unsubscribeInUiThread(new Action0() {
+          @Override public void call() {
+            context.unregisterReceiver(receiver);
+          }
+        }));
+      }
+    }).defaultIfEmpty(ConnectivityStatus.OFFLINE);
+  }
+
+  public ConnectivityStatus getConnectivityStatus(final Context context,
+      final boolean checkInternet) {
+    final String service = Context.CONNECTIVITY_SERVICE;
+    final ConnectivityManager manager = (ConnectivityManager) context.getSystemService(service);
+    final NetworkInfo networkInfo = manager.getActiveNetworkInfo();
+
+    if (networkInfo == null) {
+      return ConnectivityStatus.OFFLINE;
+    }
+
+    if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+      if (checkInternet) {
+        return getWifiInternetStatus(networkInfo);
+      } else {
+        return ConnectivityStatus.WIFI_CONNECTED;
+      }
+    } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
+      return ConnectivityStatus.MOBILE_CONNECTED;
+    }
+
+    return ConnectivityStatus.OFFLINE;
+  }
+
+  private ConnectivityStatus getWifiInternetStatus(final NetworkInfo networkInfo) {
+    if (networkInfo.isConnected()) {
+      return ConnectivityStatus.WIFI_CONNECTED_HAS_INTERNET;
+    } else {
+      return ConnectivityStatus.WIFI_CONNECTED_HAS_NO_INTERNET;
+    }
+  }
+
+  private Subscription unsubscribeInUiThread(final Action0 unsubscribe) {
+    return Subscriptions.create(new Action0() {
+
+      @Override public void call() {
+        if (Looper.getMainLooper() == Looper.myLooper()) {
+          unsubscribe.call();
+        } else {
+          final Scheduler.Worker inner = AndroidSchedulers.mainThread().createWorker();
+          inner.schedule(new Action0() {
+            @Override public void call() {
+              unsubscribe.call();
+              inner.unsubscribe();
+            }
+          });
+        }
+      }
+    });
+  }
+}

+ 3 - 2
settings.gradle

@@ -1,2 +1,3 @@
-include ':app', ':SubsamplingScaleImageView'
-project(':SubsamplingScaleImageView').projectDir = new File('libs/SubsamplingScaleImageView')
+include ':app', ':SubsamplingScaleImageView', ':ReactiveNetwork'
+project(':SubsamplingScaleImageView').projectDir = new File('libs/SubsamplingScaleImageView')
+project(':ReactiveNetwork').projectDir = new File('libs/ReactiveNetwork')