Move modified dependencies to another repository. Reorganize dependencies
This commit is contained in:
parent
c1ebccd0f4
commit
ff906e8ee7
20 changed files with 47 additions and 3813 deletions
|
@ -95,9 +95,11 @@ dependencies {
|
|||
final STORIO_VERSION = '1.8.0'
|
||||
final MOCKITO_VERSION = '1.10.19'
|
||||
|
||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||
compile project(":SubsamplingScaleImageView")
|
||||
// Modified dependencies
|
||||
compile 'com.github.inorichi:subsampling-scale-image-view:7dc97eb'
|
||||
compile 'com.github.inorichi:ReactiveNetwork:69092ed'
|
||||
|
||||
// Android support library
|
||||
compile "com.android.support:support-v4:$SUPPORT_LIBRARY_VERSION"
|
||||
compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
|
||||
compile "com.android.support:cardview-v7:$SUPPORT_LIBRARY_VERSION"
|
||||
|
@ -107,39 +109,65 @@ dependencies {
|
|||
compile "com.android.support:percent:$SUPPORT_LIBRARY_VERSION"
|
||||
compile "com.android.support:preference-v7:$SUPPORT_LIBRARY_VERSION"
|
||||
compile "com.android.support:preference-v14:$SUPPORT_LIBRARY_VERSION"
|
||||
compile "com.squareup.okhttp3:okhttp:$OKHTTP_VERSION"
|
||||
compile "com.squareup.okhttp3:okhttp-urlconnection:$OKHTTP_VERSION"
|
||||
compile 'com.squareup.okio:okio:1.6.0'
|
||||
compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
|
||||
compile "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
|
||||
compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION"
|
||||
compile 'com.jakewharton:disklrucache:2.0.2'
|
||||
compile 'com.google.code.gson:gson:2.6.2'
|
||||
compile 'org.jsoup:jsoup:1.8.3'
|
||||
|
||||
// ReactiveX
|
||||
compile 'io.reactivex:rxandroid:1.1.0'
|
||||
compile 'io.reactivex:rxjava:1.1.1'
|
||||
compile 'com.f2prateek.rx.preferences:rx-preferences:1.0.1'
|
||||
|
||||
// Network client
|
||||
compile "com.squareup.okhttp3:okhttp:$OKHTTP_VERSION"
|
||||
compile "com.squareup.okhttp3:okhttp-urlconnection:$OKHTTP_VERSION"
|
||||
|
||||
// REST
|
||||
compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
|
||||
compile "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
|
||||
compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION"
|
||||
|
||||
// IO
|
||||
compile 'com.squareup.okio:okio:1.6.0'
|
||||
|
||||
// JSON
|
||||
compile 'com.google.code.gson:gson:2.6.2'
|
||||
|
||||
// Disk cache
|
||||
compile 'com.jakewharton:disklrucache:2.0.2'
|
||||
|
||||
// Parse HTML
|
||||
compile 'org.jsoup:jsoup:1.8.3'
|
||||
|
||||
// Database
|
||||
compile "com.pushtorefresh.storio:sqlite:$STORIO_VERSION"
|
||||
compile "com.pushtorefresh.storio:sqlite-annotations:$STORIO_VERSION"
|
||||
kapt "com.pushtorefresh.storio:sqlite-annotations-processor:$STORIO_VERSION"
|
||||
|
||||
// Model View Presenter
|
||||
compile 'info.android15.nucleus:nucleus:2.0.5'
|
||||
|
||||
// Dependency injection
|
||||
compile "com.google.dagger:dagger:$DAGGER_VERSION"
|
||||
kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
|
||||
provided 'org.glassfish:javax.annotation:10.0-b28'
|
||||
|
||||
// Image library
|
||||
compile 'com.github.bumptech.glide:glide:3.7.0'
|
||||
|
||||
// Logging
|
||||
compile 'com.jakewharton.timber:timber:4.1.2'
|
||||
|
||||
// Crash reports
|
||||
compile 'ch.acra:acra:4.8.5'
|
||||
|
||||
// UI
|
||||
compile 'com.github.dmytrodanylyk.android-process-button:library:1.0.4'
|
||||
compile 'eu.davidea:flexible-adapter:4.2.0'
|
||||
compile 'com.nononsenseapps:filepicker:2.5.2'
|
||||
compile 'com.github.amulyakhare:TextDrawable:558677e'
|
||||
|
||||
compile "com.google.dagger:dagger:$DAGGER_VERSION"
|
||||
kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
|
||||
kapt "com.pushtorefresh.storio:sqlite-annotations-processor:$STORIO_VERSION"
|
||||
provided 'org.glassfish:javax.annotation:10.0-b28'
|
||||
|
||||
compile('com.github.afollestad.material-dialogs:core:0.8.5.5@aar') {
|
||||
transitive = true
|
||||
}
|
||||
|
||||
|
||||
// Tests
|
||||
testCompile 'junit:junit:4.12'
|
||||
testCompile 'org.assertj:assertj-core:1.7.1'
|
||||
testCompile "org.mockito:mockito-core:$MOCKITO_VERSION"
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
* 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 + '\'' + '}';
|
||||
}
|
||||
}
|
|
@ -1,142 +0,0 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
1
libs/SubsamplingScaleImageView/.gitignore
vendored
1
libs/SubsamplingScaleImageView/.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
build/
|
|
@ -1,7 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.davemorrissey.labs.subscaleview"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0">
|
||||
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14"/>
|
||||
</manifest>
|
|
@ -1,41 +0,0 @@
|
|||
apply plugin: 'com.android.library'
|
||||
|
||||
group = 'com.davemorrissey.labs'
|
||||
version = '3.4.1'
|
||||
|
||||
dependencies {
|
||||
compile fileTree(dir: 'libs', include: '*.jar')
|
||||
compile "com.android.support:support-annotations:23.1.1"
|
||||
compile 'com.github.suckgamony.RapidDecoder:library:7cdfca4'
|
||||
compile 'com.github.suckgamony.RapidDecoder:jpeg-decoder:7cdfca4'
|
||||
compile 'com.github.suckgamony.RapidDecoder:png-decoder:7cdfca4'
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 23
|
||||
buildToolsVersion "23.0.3"
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
manifest.srcFile 'AndroidManifest.xml'
|
||||
java.srcDirs = ['src']
|
||||
resources.srcDirs = ['src']
|
||||
aidl.srcDirs = ['src']
|
||||
renderscript.srcDirs = ['src']
|
||||
res.srcDirs = ['res']
|
||||
assets.srcDirs = ['assets']
|
||||
}
|
||||
|
||||
// Move the tests to tests/java, tests/res, etc...
|
||||
instrumentTest.setRoot('tests')
|
||||
|
||||
// Move the build types to build-types/<type>
|
||||
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
|
||||
// This moves them out of them default location under src/<type>/... which would
|
||||
// conflict with src/ being used by the main source set.
|
||||
// Adding new build types or product flavors should be accompanied
|
||||
// by a similar customization.
|
||||
debug.setRoot('build-types/debug')
|
||||
release.setRoot('build-types/release')
|
||||
}
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-19
|
||||
android.library=true
|
|
@ -1,28 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2014 David Morrissey
|
||||
|
||||
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.
|
||||
-->
|
||||
<resources>
|
||||
|
||||
<declare-styleable name="SubsamplingScaleImageView">
|
||||
<attr name="src" format="reference"/>
|
||||
<attr name="assetName" format="string"/>
|
||||
<attr name="panEnabled" format="boolean"/>
|
||||
<attr name="zoomEnabled" format="boolean"/>
|
||||
<attr name="quickScaleEnabled" format="boolean"/>
|
||||
<attr name="tileBackgroundColor" format="color"/>
|
||||
</declare-styleable>
|
||||
|
||||
</resources>
|
|
@ -1,233 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLDecoder;
|
||||
|
||||
/**
|
||||
* Helper class used to set the source and additional attributes from a variety of sources. Supports
|
||||
* use of a bitmap, asset, resource, external file or any other URI.
|
||||
*
|
||||
* When you are using a preview image, you must set the dimensions of the full size image on the
|
||||
* ImageSource object for the full size image using the {@link #dimensions(int, int)} method.
|
||||
*/
|
||||
public final class ImageSource {
|
||||
|
||||
static final String FILE_SCHEME = "file:///";
|
||||
static final String ASSET_SCHEME = "file:///android_asset/";
|
||||
|
||||
private final Uri uri;
|
||||
private final Bitmap bitmap;
|
||||
private final Integer resource;
|
||||
private boolean tile;
|
||||
private int sWidth;
|
||||
private int sHeight;
|
||||
private Rect sRegion;
|
||||
private boolean cached;
|
||||
|
||||
private ImageSource(Bitmap bitmap, boolean cached) {
|
||||
this.bitmap = bitmap;
|
||||
this.uri = null;
|
||||
this.resource = null;
|
||||
this.tile = false;
|
||||
this.sWidth = bitmap.getWidth();
|
||||
this.sHeight = bitmap.getHeight();
|
||||
this.cached = cached;
|
||||
}
|
||||
|
||||
private ImageSource(Uri uri) {
|
||||
// #114 If file doesn't exist, attempt to url decode the URI and try again
|
||||
String uriString = uri.toString();
|
||||
if (uriString.startsWith(FILE_SCHEME)) {
|
||||
File uriFile = new File(uriString.substring(FILE_SCHEME.length() - 1));
|
||||
if (!uriFile.exists()) {
|
||||
try {
|
||||
uri = Uri.parse(URLDecoder.decode(uriString, "UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
// Fallback to encoded URI. This exception is not expected.
|
||||
}
|
||||
}
|
||||
}
|
||||
this.bitmap = null;
|
||||
this.uri = uri;
|
||||
this.resource = null;
|
||||
this.tile = true;
|
||||
}
|
||||
|
||||
private ImageSource(int resource) {
|
||||
this.bitmap = null;
|
||||
this.uri = null;
|
||||
this.resource = resource;
|
||||
this.tile = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance from a resource. The correct resource for the device screen resolution will be used.
|
||||
* @param resId resource ID.
|
||||
*/
|
||||
public static ImageSource resource(int resId) {
|
||||
return new ImageSource(resId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance from an asset name.
|
||||
* @param assetName asset name.
|
||||
*/
|
||||
public static ImageSource asset(String assetName) {
|
||||
if (assetName == null) {
|
||||
throw new NullPointerException("Asset name must not be null");
|
||||
}
|
||||
return uri(ASSET_SCHEME + assetName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance from a URI. If the URI does not start with a scheme, it's assumed to be the URI
|
||||
* of a file.
|
||||
* @param uri image URI.
|
||||
*/
|
||||
public static ImageSource uri(String uri) {
|
||||
if (uri == null) {
|
||||
throw new NullPointerException("Uri must not be null");
|
||||
}
|
||||
if (!uri.contains("://")) {
|
||||
if (uri.startsWith("/")) {
|
||||
uri = uri.substring(1);
|
||||
}
|
||||
uri = FILE_SCHEME + uri;
|
||||
}
|
||||
return new ImageSource(Uri.parse(uri));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance from a URI.
|
||||
* @param uri image URI.
|
||||
*/
|
||||
public static ImageSource uri(Uri uri) {
|
||||
if (uri == null) {
|
||||
throw new NullPointerException("Uri must not be null");
|
||||
}
|
||||
return new ImageSource(uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a loaded bitmap for display.
|
||||
* @param bitmap bitmap to be displayed.
|
||||
*/
|
||||
public static ImageSource bitmap(Bitmap bitmap) {
|
||||
if (bitmap == null) {
|
||||
throw new NullPointerException("Bitmap must not be null");
|
||||
}
|
||||
return new ImageSource(bitmap, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a loaded and cached bitmap for display. This bitmap will not be recycled when it is no
|
||||
* longer needed. Use this method if you loaded the bitmap with an image loader such as Picasso
|
||||
* or Volley.
|
||||
* @param bitmap bitmap to be displayed.
|
||||
*/
|
||||
public static ImageSource cachedBitmap(Bitmap bitmap) {
|
||||
if (bitmap == null) {
|
||||
throw new NullPointerException("Bitmap must not be null");
|
||||
}
|
||||
return new ImageSource(bitmap, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable tiling of the image. This does not apply to preview images which are always loaded as a single bitmap.,
|
||||
* and tiling cannot be disabled when displaying a region of the source image.
|
||||
* @return this instance for chaining.
|
||||
*/
|
||||
public ImageSource tilingEnabled() {
|
||||
return tiling(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable tiling of the image. This does not apply to preview images which are always loaded as a single bitmap,
|
||||
* and tiling cannot be disabled when displaying a region of the source image.
|
||||
* @return this instance for chaining.
|
||||
*/
|
||||
public ImageSource tilingDisabled() {
|
||||
return tiling(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable or disable tiling of the image. This does not apply to preview images which are always loaded as a single bitmap,
|
||||
* and tiling cannot be disabled when displaying a region of the source image.
|
||||
* @return this instance for chaining.
|
||||
*/
|
||||
public ImageSource tiling(boolean tile) {
|
||||
this.tile = tile;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a region of the source image. Region must be set independently for the full size image and the preview if
|
||||
* you are using one.
|
||||
* @return this instance for chaining.
|
||||
*/
|
||||
public ImageSource region(Rect sRegion) {
|
||||
this.sRegion = sRegion;
|
||||
setInvariants();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Declare the dimensions of the image. This is only required for a full size image, when you are specifying a URI
|
||||
* and also a preview image. When displaying a bitmap object, or not using a preview, you do not need to declare
|
||||
* the image dimensions. Note if the declared dimensions are found to be incorrect, the view will reset.
|
||||
* @return this instance for chaining.
|
||||
*/
|
||||
public ImageSource dimensions(int sWidth, int sHeight) {
|
||||
if (bitmap == null) {
|
||||
this.sWidth = sWidth;
|
||||
this.sHeight = sHeight;
|
||||
}
|
||||
setInvariants();
|
||||
return this;
|
||||
}
|
||||
|
||||
private void setInvariants() {
|
||||
if (this.sRegion != null) {
|
||||
this.tile = true;
|
||||
this.sWidth = this.sRegion.width();
|
||||
this.sHeight = this.sRegion.height();
|
||||
}
|
||||
}
|
||||
|
||||
protected final Uri getUri() {
|
||||
return uri;
|
||||
}
|
||||
|
||||
protected final Bitmap getBitmap() {
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
protected final Integer getResource() {
|
||||
return resource;
|
||||
}
|
||||
|
||||
protected final boolean getTile() {
|
||||
return tile;
|
||||
}
|
||||
|
||||
protected final int getSWidth() {
|
||||
return sWidth;
|
||||
}
|
||||
|
||||
protected final int getSHeight() {
|
||||
return sHeight;
|
||||
}
|
||||
|
||||
protected final Rect getSRegion() {
|
||||
return sRegion;
|
||||
}
|
||||
|
||||
protected final boolean isCached() {
|
||||
return cached;
|
||||
}
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
Copyright 2014 David Morrissey
|
||||
|
||||
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.davemorrissey.labs.subscaleview;
|
||||
|
||||
import android.graphics.PointF;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Wraps the scale, center and orientation of a displayed image for easy restoration on screen rotate.
|
||||
*/
|
||||
public class ImageViewState implements Serializable {
|
||||
|
||||
private float scale;
|
||||
|
||||
private float centerX;
|
||||
|
||||
private float centerY;
|
||||
|
||||
private int orientation;
|
||||
|
||||
public ImageViewState(float scale, PointF center, int orientation) {
|
||||
this.scale = scale;
|
||||
this.centerX = center.x;
|
||||
this.centerY = center.y;
|
||||
this.orientation = orientation;
|
||||
}
|
||||
|
||||
public float getScale() {
|
||||
return scale;
|
||||
}
|
||||
|
||||
public PointF getCenter() {
|
||||
return new PointF(centerX, centerY);
|
||||
}
|
||||
|
||||
public int getOrientation() {
|
||||
return orientation;
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,20 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
/**
|
||||
* Compatibility factory to instantiate decoders with empty public constructors.
|
||||
* @param <T> The base type of the decoder this factory will produce.
|
||||
*/
|
||||
public class CompatDecoderFactory <T> implements DecoderFactory<T> {
|
||||
private Class<? extends T> clazz;
|
||||
|
||||
public CompatDecoderFactory(@NonNull Class<? extends T> clazz) {
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T make() throws IllegalAccessException, InstantiationException {
|
||||
return clazz.newInstance();
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
/**
|
||||
* Interface for decoder (and region decoder) factories.
|
||||
* @param <T> the class of decoder that will be produced.
|
||||
*/
|
||||
public interface DecoderFactory<T> {
|
||||
/**
|
||||
* Produce a new instance of a decoder with type {@link T}.
|
||||
* @return a new instance of your decoder.
|
||||
*/
|
||||
T make() throws IllegalAccessException, InstantiationException;
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
|
||||
/**
|
||||
* Interface for image decoding classes, allowing the default {@link android.graphics.BitmapRegionDecoder}
|
||||
* based on the Skia library to be replaced with a custom class.
|
||||
*/
|
||||
public interface ImageDecoder {
|
||||
|
||||
/**
|
||||
* Decode an image. When possible, initial setup work once in this method. This method
|
||||
* must return the dimensions of the image. The URI can be in one of the following formats:
|
||||
* File: file:///scard/picture.jpg
|
||||
* Asset: file:///android_asset/picture.png
|
||||
* Resource: android.resource://com.example.app/drawable/picture
|
||||
* @param context Application context. A reference may be held, but must be cleared on recycle.
|
||||
* @param uri URI of the image.
|
||||
* @return Dimensions of the image.
|
||||
* @throws Exception if initialisation fails.
|
||||
*/
|
||||
Bitmap decode(Context context, Uri uri) throws Exception;
|
||||
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
|
||||
/**
|
||||
* Interface for image decoding classes, allowing the default {@link android.graphics.BitmapRegionDecoder}
|
||||
* based on the Skia library to be replaced with a custom class.
|
||||
*/
|
||||
public interface ImageRegionDecoder {
|
||||
|
||||
/**
|
||||
* Initialise the decoder. When possible, initial setup work once in this method. This method
|
||||
* must return the dimensions of the image. The URI can be in one of the following formats:
|
||||
* File: file:///scard/picture.jpg
|
||||
* Asset: file:///android_asset/picture.png
|
||||
* Resource: android.resource://com.example.app/drawable/picture
|
||||
* @param context Application context. A reference may be held, but must be cleared on recycle.
|
||||
* @param uri URI of the image.
|
||||
* @return Dimensions of the image.
|
||||
* @throws Exception if initialisation fails.
|
||||
*/
|
||||
Point init(Context context, Uri uri) throws Exception;
|
||||
|
||||
/**
|
||||
* Decode a region of the image with the given sample size. This method is called off the UI thread so it can safely
|
||||
* load the image on the current thread. It is called from an {@link android.os.AsyncTask} running in a single
|
||||
* threaded executor, and while a synchronization lock is held on this object, so will never be called concurrently
|
||||
* even if the decoder implementation supports it.
|
||||
* @param sRect Source image rectangle to decode.
|
||||
* @param sampleSize Sample size.
|
||||
* @return The decoded region. It is safe to return null if decoding fails.
|
||||
*/
|
||||
Bitmap decodeRegion(Rect sRect, int sampleSize);
|
||||
|
||||
/**
|
||||
* Status check. Should return false before initialisation and after recycle.
|
||||
* @return true if the decoder is ready to be used.
|
||||
*/
|
||||
boolean isReady();
|
||||
|
||||
/**
|
||||
* This method will be called when the decoder is no longer required. It should clean up any resources still in use.
|
||||
*/
|
||||
void recycle();
|
||||
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.net.Uri;
|
||||
|
||||
import rapid.decoder.BitmapDecoder;
|
||||
|
||||
/**
|
||||
* A very simple implementation of {@link com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder}
|
||||
* using the RapidDecoder library (https://github.com/suckgamony/RapidDecoder). For PNGs, this can
|
||||
* give more reliable decoding and better performance. For JPGs, it is slower and can run out of
|
||||
* memory with large images, but has better support for grayscale and CMYK images.
|
||||
*
|
||||
* This is an incomplete and untested implementation provided as an example only.
|
||||
*/
|
||||
public class RapidImageDecoder implements ImageDecoder {
|
||||
|
||||
@Override
|
||||
public Bitmap decode(Context context, Uri uri) throws Exception {
|
||||
return BitmapDecoder.from(context, uri).useBuiltInDecoder(true).config(Bitmap.Config.RGB_565).decode();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
|
||||
import rapid.decoder.BitmapDecoder;
|
||||
|
||||
/**
|
||||
* A very simple implementation of {@link com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder}
|
||||
* using the RapidDecoder library (https://github.com/suckgamony/RapidDecoder). For PNGs, this can
|
||||
* give more reliable decoding and better performance. For JPGs, it is slower and can run out of
|
||||
* memory with large images, but has better support for grayscale and CMYK images.
|
||||
*
|
||||
* This is an incomplete and untested implementation provided as an example only.
|
||||
*/
|
||||
public class RapidImageRegionDecoder implements ImageRegionDecoder {
|
||||
|
||||
private BitmapDecoder decoder;
|
||||
|
||||
@Override
|
||||
public Point init(Context context, Uri uri) throws Exception {
|
||||
decoder = BitmapDecoder.from(context, uri);
|
||||
decoder.useBuiltInDecoder(true);
|
||||
int width = decoder.sourceWidth();
|
||||
int height = decoder.sourceHeight();
|
||||
if (width == 0 || height == 0)
|
||||
throw new Exception("Rapid image decoder returned empty image - image format may not be supported");
|
||||
return new Point(width, height);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Bitmap decodeRegion(Rect sRect, int sampleSize) {
|
||||
try {
|
||||
return decoder.reset().region(sRect).scale(sRect.width() / sampleSize, sRect.height() / sampleSize).decode();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Rapid image decoder returned null bitmap - image format may not be supported");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return decoder != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recycle() {
|
||||
BitmapDecoder.destroyMemoryCache();
|
||||
BitmapDecoder.destroyDiskCache();
|
||||
decoder.reset();
|
||||
decoder = null;
|
||||
}
|
||||
}
|
|
@ -1,79 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Default implementation of {@link com.davemorrissey.labs.subscaleview.decoder.ImageDecoder}
|
||||
* using Android's {@link android.graphics.BitmapFactory}, based on the Skia library. This
|
||||
* works well in most circumstances and has reasonable performance, however it has some problems
|
||||
* with grayscale, indexed and CMYK images.
|
||||
*/
|
||||
public class SkiaImageDecoder implements ImageDecoder {
|
||||
|
||||
private static final String FILE_PREFIX = "file://";
|
||||
private static final String ASSET_PREFIX = FILE_PREFIX + "/android_asset/";
|
||||
private static final String RESOURCE_PREFIX = ContentResolver.SCHEME_ANDROID_RESOURCE + "://";
|
||||
|
||||
@Override
|
||||
public Bitmap decode(Context context, Uri uri) throws Exception {
|
||||
String uriString = uri.toString();
|
||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||
Bitmap bitmap;
|
||||
options.inPreferredConfig = Bitmap.Config.RGB_565;
|
||||
if (uriString.startsWith(RESOURCE_PREFIX)) {
|
||||
Resources res;
|
||||
String packageName = uri.getAuthority();
|
||||
if (context.getPackageName().equals(packageName)) {
|
||||
res = context.getResources();
|
||||
} else {
|
||||
PackageManager pm = context.getPackageManager();
|
||||
res = pm.getResourcesForApplication(packageName);
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
List<String> segments = uri.getPathSegments();
|
||||
int size = segments.size();
|
||||
if (size == 2 && segments.get(0).equals("drawable")) {
|
||||
String resName = segments.get(1);
|
||||
id = res.getIdentifier(resName, "drawable", packageName);
|
||||
} else if (size == 1 && TextUtils.isDigitsOnly(segments.get(0))) {
|
||||
try {
|
||||
id = Integer.parseInt(segments.get(0));
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
bitmap = BitmapFactory.decodeResource(context.getResources(), id, options);
|
||||
} else if (uriString.startsWith(ASSET_PREFIX)) {
|
||||
String assetName = uriString.substring(ASSET_PREFIX.length());
|
||||
bitmap = BitmapFactory.decodeStream(context.getAssets().open(assetName), null, options);
|
||||
} else if (uriString.startsWith(FILE_PREFIX)) {
|
||||
bitmap = BitmapFactory.decodeFile(uriString.substring(FILE_PREFIX.length()), options);
|
||||
} else {
|
||||
InputStream inputStream = null;
|
||||
try {
|
||||
ContentResolver contentResolver = context.getContentResolver();
|
||||
inputStream = contentResolver.openInputStream(uri);
|
||||
bitmap = BitmapFactory.decodeStream(inputStream, null, options);
|
||||
} finally {
|
||||
if (inputStream != null) {
|
||||
try { inputStream.close(); } catch (Exception e) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bitmap == null) {
|
||||
throw new RuntimeException("Skia image region decoder returned null bitmap - image format may not be supported");
|
||||
}
|
||||
return bitmap;
|
||||
}
|
||||
}
|
|
@ -1,101 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.decoder;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.AssetManager;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.*;
|
||||
import android.graphics.Bitmap.Config;
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Default implementation of {@link com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder}
|
||||
* using Android's {@link android.graphics.BitmapRegionDecoder}, based on the Skia library. This
|
||||
* works well in most circumstances and has reasonable performance due to the cached decoder instance,
|
||||
* however it has some problems with grayscale, indexed and CMYK images.
|
||||
*/
|
||||
public class SkiaImageRegionDecoder implements ImageRegionDecoder {
|
||||
|
||||
private BitmapRegionDecoder decoder;
|
||||
private final Object decoderLock = new Object();
|
||||
|
||||
private static final String FILE_PREFIX = "file://";
|
||||
private static final String ASSET_PREFIX = FILE_PREFIX + "/android_asset/";
|
||||
private static final String RESOURCE_PREFIX = ContentResolver.SCHEME_ANDROID_RESOURCE + "://";
|
||||
|
||||
@Override
|
||||
public Point init(Context context, Uri uri) throws Exception {
|
||||
String uriString = uri.toString();
|
||||
if (uriString.startsWith(RESOURCE_PREFIX)) {
|
||||
Resources res;
|
||||
String packageName = uri.getAuthority();
|
||||
if (context.getPackageName().equals(packageName)) {
|
||||
res = context.getResources();
|
||||
} else {
|
||||
PackageManager pm = context.getPackageManager();
|
||||
res = pm.getResourcesForApplication(packageName);
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
List<String> segments = uri.getPathSegments();
|
||||
int size = segments.size();
|
||||
if (size == 2 && segments.get(0).equals("drawable")) {
|
||||
String resName = segments.get(1);
|
||||
id = res.getIdentifier(resName, "drawable", packageName);
|
||||
} else if (size == 1 && TextUtils.isDigitsOnly(segments.get(0))) {
|
||||
try {
|
||||
id = Integer.parseInt(segments.get(0));
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
decoder = BitmapRegionDecoder.newInstance(context.getResources().openRawResource(id), false);
|
||||
} else if (uriString.startsWith(ASSET_PREFIX)) {
|
||||
String assetName = uriString.substring(ASSET_PREFIX.length());
|
||||
decoder = BitmapRegionDecoder.newInstance(context.getAssets().open(assetName, AssetManager.ACCESS_RANDOM), false);
|
||||
} else if (uriString.startsWith(FILE_PREFIX)) {
|
||||
decoder = BitmapRegionDecoder.newInstance(uriString.substring(FILE_PREFIX.length()), false);
|
||||
} else {
|
||||
InputStream inputStream = null;
|
||||
try {
|
||||
ContentResolver contentResolver = context.getContentResolver();
|
||||
inputStream = contentResolver.openInputStream(uri);
|
||||
decoder = BitmapRegionDecoder.newInstance(inputStream, false);
|
||||
} finally {
|
||||
if (inputStream != null) {
|
||||
try { inputStream.close(); } catch (Exception e) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Point(decoder.getWidth(), decoder.getHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bitmap decodeRegion(Rect sRect, int sampleSize) {
|
||||
synchronized (decoderLock) {
|
||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||
options.inSampleSize = sampleSize;
|
||||
options.inPreferredConfig = Config.RGB_565;
|
||||
Bitmap bitmap = decoder.decodeRegion(sRect, options);
|
||||
if (bitmap == null) {
|
||||
throw new RuntimeException("Skia image decoder returned null bitmap - image format may not be supported");
|
||||
}
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return decoder != null && !decoder.isRecycled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recycle() {
|
||||
decoder.recycle();
|
||||
}
|
||||
}
|
|
@ -1,2 +1 @@
|
|||
include ':app', ':SubsamplingScaleImageView'
|
||||
project(':SubsamplingScaleImageView').projectDir = new File('libs/SubsamplingScaleImageView')
|
||||
include ':app'
|
||||
|
|
Reference in a new issue