Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc38c8c135 | ||
|
|
4e462a1903 | ||
|
|
43bc5ab50c | ||
|
|
fed04784db | ||
|
|
4dbf5a45e8 | ||
|
|
5d22e70ded | ||
|
|
a3cae20478 | ||
|
|
f7cfbf1b34 | ||
|
|
4d4358f806 | ||
|
|
6ca3c3261e | ||
|
|
635a0b3af1 | ||
|
|
4288bc790d | ||
|
|
c52c91e1c0 |
No files matched your search
+11
-10
@@ -2,6 +2,8 @@ import java.nio.file.Paths
|
||||
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
}
|
||||
|
||||
android {
|
||||
@@ -16,6 +18,8 @@ android {
|
||||
splits {
|
||||
abi {
|
||||
enable = true
|
||||
reset()
|
||||
include 'arm64-v8a', 'x86_64'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,12 +36,11 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "io.github.nekoinverter.ehviewer"
|
||||
minSdkVersion 26
|
||||
minSdkVersion 31
|
||||
targetSdkVersion 32
|
||||
versionCode 100011
|
||||
versionName "1.7.26.4"
|
||||
versionCode 114515
|
||||
versionName "1.7.26.6"
|
||||
resConfigs 'zh', 'zh-rCN', 'zh-rHK', 'zh-rTW', 'es', 'ja', 'ko', 'fr', 'de', 'th'
|
||||
testOptions.unitTests.includeAndroidResources = true
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@@ -45,6 +48,10 @@ android {
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '11'
|
||||
}
|
||||
|
||||
lint {
|
||||
abortOnError true
|
||||
checkReleaseBuilds false
|
||||
@@ -118,9 +125,6 @@ dependencies {
|
||||
implementation 'com.github.seven332:yorozuya-thread:0.1.1'
|
||||
implementation 'com.github.seven332:yorozuya-collect:0.1.4'
|
||||
implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0'
|
||||
implementation 'com.microsoft.appcenter:appcenter-analytics:4.4.3'
|
||||
implementation 'com.microsoft.appcenter:appcenter-crashes:4.4.3'
|
||||
implementation 'com.microsoft.appcenter:appcenter-distribute:4.4.3'
|
||||
implementation 'com.squareup.okhttp3:okhttp:4.9.2'
|
||||
implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.2'
|
||||
implementation 'com.takisoft.preferencex:preferencex:1.1.0'
|
||||
@@ -137,9 +141,6 @@ dependencies {
|
||||
implementation 'org.greenrobot:greendao:3.3.0'
|
||||
implementation 'org.jsoup:jsoup:1.14.3'
|
||||
implementation projects.native
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.2.1'
|
||||
testImplementation 'org.jooq:joor:0.9.6'
|
||||
}
|
||||
|
||||
configurations.all {
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
package com.hippo.ehviewer;
|
||||
|
||||
import android.app.Application;
|
||||
import android.test.ApplicationTestCase;
|
||||
|
||||
/**
|
||||
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
|
||||
*/
|
||||
public class ApplicationTest extends ApplicationTestCase<Application> {
|
||||
public ApplicationTest() {
|
||||
super(Application.class);
|
||||
}
|
||||
}
|
||||
@@ -1,164 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.RectF;
|
||||
import android.os.Environment;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class CardBgTest extends TestCase {
|
||||
|
||||
private static final float[] TOP_ALPHA = {
|
||||
0f, // Dump
|
||||
0.12f,
|
||||
0.16f,
|
||||
0.19f,
|
||||
0.25f,
|
||||
0.30f,
|
||||
};
|
||||
|
||||
private static final float[] TOP_OFFSET = {
|
||||
0f, // Dump
|
||||
1f,
|
||||
3f,
|
||||
10f,
|
||||
14f,
|
||||
19f,
|
||||
};
|
||||
|
||||
private static final float[] TOP_BLUR = {
|
||||
0f, // Dump
|
||||
1.5f,
|
||||
3f,
|
||||
10f,
|
||||
14f,
|
||||
19f,
|
||||
};
|
||||
|
||||
private static final float[] BOTTOM_ALPHA = {
|
||||
0f, // Dump
|
||||
0.24f,
|
||||
0.23f,
|
||||
0.23f,
|
||||
0.22f,
|
||||
0.22f,
|
||||
};
|
||||
|
||||
private static final float[] BOTTOM_OFFSET = {
|
||||
0f, // Dump
|
||||
1f,
|
||||
3f,
|
||||
6f,
|
||||
10f,
|
||||
15f,
|
||||
};
|
||||
|
||||
private static final float[] BOTTOM_BLUR = {
|
||||
0f, // Dump
|
||||
1f,
|
||||
3f,
|
||||
3f,
|
||||
5f,
|
||||
6f,
|
||||
};
|
||||
|
||||
private static final int MAX_SIZE = 200;
|
||||
|
||||
|
||||
public void testGen() throws FileNotFoundException {
|
||||
genCardBg(Color.WHITE, 2, 2);
|
||||
}
|
||||
|
||||
private Path getPath(float radius, float base) {
|
||||
RectF rectF = new RectF();
|
||||
Path path = new Path();
|
||||
path.moveTo(base / 2, -base / 2 - radius);
|
||||
rectF.set(base / 2 - radius, -base / 2 - radius, base / 2 + radius, -base / 2 + radius);
|
||||
path.arcTo(rectF, -90, 90);
|
||||
path.lineTo(base / 2 + radius, base / 2);
|
||||
rectF.set(base / 2 - radius, base / 2 - radius, base / 2 + radius, base / 2 + radius);
|
||||
path.arcTo(rectF, 0, 90);
|
||||
path.lineTo(-base / 2, base / 2 + radius);
|
||||
rectF.set(-base / 2 - radius, base / 2 - radius, -base / 2 + radius, base / 2 + radius);
|
||||
path.arcTo(rectF, 90, 90);
|
||||
path.lineTo(-base / 2 - radius, -base / 2);
|
||||
rectF.set(-base / 2 - radius, -base / 2 - radius, -base / 2 + radius, -base / 2 + radius);
|
||||
path.arcTo(rectF, 180, 90);
|
||||
path.close();
|
||||
return path;
|
||||
}
|
||||
|
||||
private void genCardBg(int color, float radius, int elevation) throws FileNotFoundException {
|
||||
|
||||
float base = 4;
|
||||
float topAlpha = TOP_ALPHA[elevation];
|
||||
float topOffset = TOP_OFFSET[elevation];
|
||||
float topBlur = TOP_BLUR[elevation];
|
||||
float bottomAlpha = BOTTOM_ALPHA[elevation];
|
||||
float bottomOffset = BOTTOM_OFFSET[elevation];
|
||||
float bottomBlur = BOTTOM_BLUR[elevation];
|
||||
|
||||
|
||||
float ratio = 3;
|
||||
|
||||
|
||||
doGenCardBg(new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "test.png")),
|
||||
color, radius * ratio, base * ratio,
|
||||
topAlpha, topOffset * ratio, topBlur * ratio,
|
||||
bottomAlpha, bottomOffset * ratio, bottomBlur * ratio);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private int getColor(float alpha) {
|
||||
return Color.argb((int) (alpha * 0xff), 0, 0, 0);
|
||||
}
|
||||
|
||||
private void doGenCardBg(OutputStream os, int color, float radius, float base,
|
||||
float topAlpha, float topOffset, float topBlur,
|
||||
float bottomAlpha, float bottomOffset, float bottomBlur) throws FileNotFoundException {
|
||||
|
||||
Path path = getPath(radius, base);
|
||||
path.offset(MAX_SIZE / 2, MAX_SIZE / 2);
|
||||
|
||||
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
|
||||
paint.setColor(color);
|
||||
Bitmap bitmap = Bitmap.createBitmap(MAX_SIZE, MAX_SIZE, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(bitmap);
|
||||
|
||||
// Draw bottom
|
||||
paint.setShadowLayer(bottomBlur, 0, bottomOffset, getColor(bottomAlpha));
|
||||
canvas.drawPath(path, paint);
|
||||
|
||||
// Draw top
|
||||
paint.setShadowLayer(topBlur, 0, topOffset, getColor(topAlpha));
|
||||
canvas.drawPath(path, paint);
|
||||
|
||||
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class CookieDBTest extends TestCase {
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
|
||||
public class DumpTest extends TestCase {
|
||||
|
||||
|
||||
public void testDump() {
|
||||
String str = "M12.1,18.55L12,18.65L11.89,18.55C7.14,14.24 4,11.39 4,8.5C4,6.5 5.5,5 7.5,5C9.04,5 10.54,6 11.07,7.36H12.93C13.46,6 14.96,5 16.5,5C18.5,5 20,6.5 20,8.5C20,11.39 16.86,14.24 12.1,18.55";
|
||||
System.out.println(str.replaceAll("\\d+(\\.\\d+)?", "12"));
|
||||
}
|
||||
|
||||
public void testDumpURL() {
|
||||
String str1 = "http://exhentai.org/?f_doujinshi=1&f_manga=0&f_artistcg=0&f_gamecg=1&f_western=1&f_non-h=1&f_imageset=0&f_cosplay=0&f_asianporn=1&f_misc=1&f_search=&f_apply=Apply+Filter";
|
||||
String str2 = "http://exhentai.org/3?f_search=hentai&f_apply=Apply+Filter";
|
||||
try {
|
||||
URL url = new URL(str2);
|
||||
|
||||
|
||||
System.out.println(url.getHost());
|
||||
System.out.println(url.getPath());
|
||||
System.out.println(url.getQuery());
|
||||
|
||||
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright 2016 Hippo Seven
|
||||
~
|
||||
~ 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>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright 2016 Hippo Seven
|
||||
~
|
||||
~ 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>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright 2016 Hippo Seven
|
||||
~
|
||||
~ 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>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright 2016 Hippo Seven
|
||||
~
|
||||
~ 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>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright 2016 Hippo Seven
|
||||
~
|
||||
~ 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>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright 2016 Hippo Seven
|
||||
~
|
||||
~ 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>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,32 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<shortcut
|
||||
android:enabled="true"
|
||||
android:icon="@drawable/ic_shortcut_start"
|
||||
android:shortcutDisabledMessage="@string/download_start_all"
|
||||
android:shortcutId="start_all"
|
||||
android:shortcutLongLabel="@string/download_start_all"
|
||||
android:shortcutShortLabel="@string/download_start_all">
|
||||
<intent
|
||||
android:action="start_all"
|
||||
android:targetClass="com.hippo.ehviewer.shortcuts.ShortcutsActivity"
|
||||
android:targetPackage="io.github.nekoinverter.ehviewer.debug" />
|
||||
<categories android:name="android.shortcut.conversation" />
|
||||
</shortcut>
|
||||
|
||||
<shortcut
|
||||
android:enabled="true"
|
||||
android:icon="@drawable/ic_shortcut_stop"
|
||||
android:shortcutDisabledMessage="@string/download_stop_all"
|
||||
android:shortcutId="stop_all"
|
||||
android:shortcutLongLabel="@string/download_stop_all"
|
||||
android:shortcutShortLabel="@string/download_stop_all">
|
||||
<intent
|
||||
android:action="stop_all"
|
||||
android:targetClass="com.hippo.ehviewer.shortcuts.ShortcutsActivity"
|
||||
android:targetPackage="io.github.nekoinverter.ehviewer.debug" />
|
||||
<categories android:name="android.shortcut.conversation" />
|
||||
</shortcut>
|
||||
|
||||
</shortcuts>
|
||||
@@ -41,7 +41,8 @@
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="UnusedAttribute">
|
||||
tools:ignore="UnusedAttribute"
|
||||
android:dataExtractionRules="@xml/data_extraction_rules">
|
||||
|
||||
<activity
|
||||
android:name="com.hippo.ehviewer.ui.MainActivity"
|
||||
|
||||
@@ -22,11 +22,10 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.R;
|
||||
|
||||
public class CheckBoxDialogBuilder extends AlertDialog.Builder {
|
||||
public class CheckBoxDialogBuilder extends MaterialAlertDialogBuilder {
|
||||
|
||||
private final CheckBox mCheckBox;
|
||||
|
||||
|
||||
@@ -29,10 +29,11 @@ import android.widget.TextView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.hippo.ehviewer.R;
|
||||
|
||||
public class EditTextDialogBuilder extends AlertDialog.Builder implements EditText.OnEditorActionListener {
|
||||
public class EditTextDialogBuilder extends MaterialAlertDialogBuilder implements EditText.OnEditorActionListener {
|
||||
|
||||
private final TextInputLayout mTextInputLayout;
|
||||
private final EditText mEditText;
|
||||
|
||||
@@ -27,10 +27,11 @@ import android.widget.ListView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.yorozuya.ViewUtils;
|
||||
|
||||
public class ListCheckBoxDialogBuilder extends AlertDialog.Builder {
|
||||
public class ListCheckBoxDialogBuilder extends MaterialAlertDialogBuilder {
|
||||
|
||||
private final CheckBox mCheckBox;
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
|
||||
package com.hippo.easyrecyclerview;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.hardware.SensorManager;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
@@ -24,12 +26,18 @@ import android.util.SparseBooleanArray;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.widget.Checkable;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.collection.LongSparseArray;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.BridgeRecyclerView;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
||||
|
||||
import com.hippo.ehviewer.Settings;
|
||||
import com.hippo.yorozuya.NumberUtils;
|
||||
@@ -38,7 +46,7 @@ import com.hippo.yorozuya.NumberUtils;
|
||||
* Add setChoiceMode for RecyclerView
|
||||
*/
|
||||
// Get some code from twoway-view and AbsListView.
|
||||
public class EasyRecyclerView extends ScrollLessRecyclerView {
|
||||
public class EasyRecyclerView extends BridgeRecyclerView {
|
||||
|
||||
/**
|
||||
* Represents an invalid position. All valid positions are in the range 0 to 1 less than the
|
||||
@@ -70,6 +78,14 @@ public class EasyRecyclerView extends ScrollLessRecyclerView {
|
||||
* The list allows multiple choices in custom action
|
||||
*/
|
||||
public static final int CHOICE_MODE_MULTIPLE_CUSTOM = 4;
|
||||
private static final float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
|
||||
// Fling friction
|
||||
private final float mFlingFriction = ViewConfiguration.getScrollFriction();
|
||||
public float pageScrollThreshold;
|
||||
double flingMoveDistanceX;
|
||||
double flingMoveDistanceY;
|
||||
boolean canScrollVertical = true;
|
||||
boolean canScrollHorizontally = true;
|
||||
|
||||
/**
|
||||
* Controls if/how the user may choose/check items in the list
|
||||
@@ -119,19 +135,29 @@ public class EasyRecyclerView extends ScrollLessRecyclerView {
|
||||
private LongSparseArray<Integer> mCheckedIdStates;
|
||||
|
||||
private Adapter<?> mAdapter;
|
||||
private boolean isScrollBefore = false;
|
||||
private int initialTouchX;
|
||||
private int initialTouchY;
|
||||
// A context-specific coefficient adjusted to physical values.
|
||||
private float mPhysicalCoeff;
|
||||
private int defaultOverflowItemScrollKeep;
|
||||
private boolean enableScroll = false;
|
||||
|
||||
public EasyRecyclerView(Context context) {
|
||||
super(context);
|
||||
EasyRecyclerView.this.init(context);
|
||||
setEnableScroll(!Settings.getEInkMode());
|
||||
}
|
||||
|
||||
public EasyRecyclerView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
EasyRecyclerView.this.init(context);
|
||||
setEnableScroll(!Settings.getEInkMode());
|
||||
}
|
||||
|
||||
public EasyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
EasyRecyclerView.this.init(context);
|
||||
setEnableScroll(!Settings.getEInkMode());
|
||||
}
|
||||
|
||||
@@ -532,6 +558,301 @@ public class EasyRecyclerView extends ScrollLessRecyclerView {
|
||||
}
|
||||
}
|
||||
|
||||
private void init(Context context) {
|
||||
float scale = context.getResources().getDisplayMetrics().density;
|
||||
final float ppi = scale * 160.0f;
|
||||
mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
|
||||
* 39.37f // inch/meter
|
||||
* ppi
|
||||
* 0.84f; // look and feel tuning
|
||||
pageScrollThreshold = scale * 80;
|
||||
}
|
||||
|
||||
public void setPageScrollThreshold(float pageScrollThreshold) {
|
||||
this.pageScrollThreshold = pageScrollThreshold;
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent e) {
|
||||
if (enableScroll) {
|
||||
return super.onTouchEvent(e);
|
||||
}
|
||||
boolean superTouchResult = super.onTouchEvent(e);
|
||||
if (superTouchResult) {
|
||||
switch (e.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
initialTouchX = (int) (e.getX() + 0.5f);
|
||||
initialTouchY = (int) (e.getY() + 0.5f);
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
if (initialTouchX < 0 || initialTouchY < 0) {
|
||||
initialTouchX = (int) (e.getX() + 0.5f);
|
||||
initialTouchY = (int) (e.getY() + 0.5f);
|
||||
}
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (isScrollBefore) {
|
||||
int moveDistanceX = (int) (initialTouchX - e.getX() + flingMoveDistanceX);
|
||||
int moveDistanceY = (int) (initialTouchY - e.getY() + flingMoveDistanceY);
|
||||
onTouchScroll(moveDistanceX, moveDistanceY);
|
||||
initialTouchX = initialTouchY = -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
isScrollBefore = getScrollState() == SCROLL_STATE_DRAGGING;
|
||||
}
|
||||
return superTouchResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scrollByInternal(int x, int y, MotionEvent ev, int type) {
|
||||
if (enableScroll) {
|
||||
return super.scrollByInternal(x, y, ev, type);
|
||||
}
|
||||
//disable drag scroll effect,e-ink screen don't need it
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean fling(int velocityX, int velocityY) {
|
||||
if (enableScroll) {
|
||||
return super.fling(velocityX, velocityY);
|
||||
}
|
||||
flingMoveDistanceX = getSplineFlingDistance(velocityX) * Math.signum(velocityX);
|
||||
flingMoveDistanceY = getSplineFlingDistance(velocityY) * Math.signum(velocityY);
|
||||
//disable fling scroll effect,e-ink screen don't need it
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void onTouchScroll(int dx, int dy) {
|
||||
canScrollVertical = true;
|
||||
canScrollHorizontally = true;
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout != null) {
|
||||
if (dy > pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
canScrollVertical = false;
|
||||
onScrollDown();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
canScrollHorizontally = false;
|
||||
onScrollRight();
|
||||
}
|
||||
} else if (dy < -pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
canScrollVertical = false;
|
||||
onScrollUp();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
canScrollHorizontally = false;
|
||||
onScrollLeft();
|
||||
}
|
||||
}
|
||||
|
||||
if (dx > pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
onScrollDown();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
onScrollRight();
|
||||
}
|
||||
} else if (dx < -pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
onScrollUp();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
onScrollLeft();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollLeft() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int firstVisiblePosition = realLayout.findFirstVisibleItemPosition();
|
||||
ViewHolder firstVisibleItem = findViewHolderForAdapterPosition(firstVisiblePosition);
|
||||
|
||||
if (firstVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item width overscreen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (firstVisibleItem.itemView.getMeasuredWidth() > getMeasuredWidth()) {
|
||||
super.scrollByInternal(-getMeasuredWidth() + defaultOverflowItemScrollKeep, 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (firstVisibleItem.itemView.getMeasuredWidth() == getMeasuredWidth()) {
|
||||
super.scrollByInternal(-getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(firstVisibleItem.itemView.getRight() - getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] firstVisiblePosition = realLayout.findFirstVisibleItemPositions(null);
|
||||
ViewHolder[] firstVisibleItems = new ViewHolder[firstVisiblePosition.length];
|
||||
for (int i = 0; i < firstVisiblePosition.length; i++) {
|
||||
firstVisibleItems[i] = findViewHolderForAdapterPosition(firstVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = Integer.MAX_VALUE;
|
||||
for (ViewHolder firstVisibleItem : firstVisibleItems) {
|
||||
if (firstVisibleItem != null) {
|
||||
if (firstVisibleItem.itemView.getRight() < scrollDistance) {
|
||||
scrollDistance = firstVisibleItem.itemView.getRight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (scrollDistance == getMeasuredWidth()) {
|
||||
scrollDistance = 0;
|
||||
}
|
||||
super.scrollByInternal(scrollDistance - getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollRight() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int lastVisiblePosition = realLayout.findLastVisibleItemPosition();
|
||||
ViewHolder lastVisibleItem = findViewHolderForAdapterPosition(lastVisiblePosition);
|
||||
|
||||
if (lastVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item width overflow screen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (lastVisibleItem.itemView.getMeasuredWidth() > getMeasuredWidth()) {
|
||||
super.scrollByInternal(getMeasuredWidth() - defaultOverflowItemScrollKeep, 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (lastVisibleItem.itemView.getMeasuredWidth() == getMeasuredWidth()) {
|
||||
super.scrollByInternal(getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(lastVisibleItem.itemView.getLeft(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] lastVisiblePosition = realLayout.findLastVisibleItemPositions(null);
|
||||
ViewHolder[] lastVisibleItems = new ViewHolder[lastVisiblePosition.length];
|
||||
for (int i = 0; i < lastVisiblePosition.length; i++) {
|
||||
lastVisibleItems[i] = findViewHolderForAdapterPosition(lastVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = 0;
|
||||
for (ViewHolder lastVisibleItem : lastVisibleItems) {
|
||||
if (lastVisibleItem != null) {
|
||||
if (lastVisibleItem.itemView.getLeft() > scrollDistance) {
|
||||
scrollDistance = lastVisibleItem.itemView.getLeft();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scrollDistance == 0) {
|
||||
scrollDistance = getMeasuredWidth();
|
||||
}
|
||||
super.scrollByInternal(scrollDistance, 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollUp() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int firstVisiblePosition = realLayout.findFirstVisibleItemPosition();
|
||||
ViewHolder firstVisibleItem = findViewHolderForAdapterPosition(firstVisiblePosition);
|
||||
|
||||
if (firstVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item height overscreen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (firstVisibleItem.itemView.getMeasuredHeight() > getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, -getMeasuredHeight() + defaultOverflowItemScrollKeep, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (firstVisibleItem.itemView.getMeasuredHeight() == getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, -getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(0, firstVisibleItem.itemView.getBottom() - getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] firstVisiblePosition = realLayout.findFirstVisibleItemPositions(null);
|
||||
ViewHolder[] firstVisibleItems = new ViewHolder[firstVisiblePosition.length];
|
||||
for (int i = 0; i < firstVisiblePosition.length; i++) {
|
||||
firstVisibleItems[i] = findViewHolderForAdapterPosition(firstVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = Integer.MAX_VALUE;
|
||||
for (ViewHolder firstVisibleItem : firstVisibleItems) {
|
||||
if (firstVisibleItem != null) {
|
||||
if (firstVisibleItem.itemView.getBottom() < scrollDistance) {
|
||||
scrollDistance = firstVisibleItem.itemView.getBaseline();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scrollDistance == getMeasuredWidth()) {
|
||||
scrollDistance = 0;
|
||||
}
|
||||
super.scrollByInternal(0, scrollDistance - getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollDown() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int lastVisiblePosition = realLayout.findLastVisibleItemPosition();
|
||||
ViewHolder lastVisibleItem = findViewHolderForAdapterPosition(lastVisiblePosition);
|
||||
|
||||
if (lastVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item height overflow screen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (lastVisibleItem.itemView.getMeasuredHeight() > getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, getMeasuredHeight() - defaultOverflowItemScrollKeep, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (lastVisibleItem.itemView.getMeasuredHeight() == getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(0, lastVisibleItem.itemView.getTop(), null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] lastVisiblePosition = realLayout.findLastVisibleItemPositions(null);
|
||||
ViewHolder[] lastVisibleItems = new ViewHolder[lastVisiblePosition.length];
|
||||
for (int i = 0; i < lastVisiblePosition.length; i++) {
|
||||
lastVisibleItems[i] = findViewHolderForAdapterPosition(lastVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = 0;
|
||||
for (ViewHolder lastVisibleItem : lastVisibleItems) {
|
||||
if (lastVisibleItem != null) {
|
||||
if (lastVisibleItem.itemView.getTop() > scrollDistance) {
|
||||
scrollDistance = lastVisibleItem.itemView.getTop();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scrollDistance == 0) {
|
||||
scrollDistance = getMeasuredHeight();
|
||||
}
|
||||
super.scrollByInternal(0, scrollDistance, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
defaultOverflowItemScrollKeep = (int) (h * 0.05f);
|
||||
}
|
||||
|
||||
private double getSplineDeceleration(int velocity) {
|
||||
return Math.log(0.35f * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
|
||||
}
|
||||
|
||||
private double getSplineFlingDistance(int velocity) {
|
||||
final double l = getSplineDeceleration(velocity);
|
||||
final double decelMinusOne = DECELERATION_RATE - 1.0;
|
||||
return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
|
||||
}
|
||||
|
||||
public void setEnableScroll(boolean enableScroll) {
|
||||
this.enableScroll = enableScroll;
|
||||
}
|
||||
|
||||
public boolean isEnableScroll() {
|
||||
return enableScroll;
|
||||
}
|
||||
|
||||
/**
|
||||
* This saved state class is a Parcelable and should not extend
|
||||
* {@link android.view.View.BaseSavedState} nor {@link android.view.AbsSavedState}
|
||||
|
||||
@@ -1,349 +0,0 @@
|
||||
package com.hippo.easyrecyclerview;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.hardware.SensorManager;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ViewConfiguration;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.BridgeRecyclerView;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
||||
|
||||
public class ScrollLessRecyclerView extends BridgeRecyclerView {
|
||||
|
||||
private boolean isScrollBefore = false;
|
||||
private int initialTouchX;
|
||||
private int initialTouchY;
|
||||
|
||||
// A context-specific coefficient adjusted to physical values.
|
||||
private float mPhysicalCoeff;
|
||||
// Fling friction
|
||||
private final float mFlingFriction = ViewConfiguration.getScrollFriction();
|
||||
private static final float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
|
||||
|
||||
public float pageScrollThreshold;
|
||||
private int defaultOverflowItemScrollKeep;
|
||||
|
||||
private boolean enableScroll = false;
|
||||
|
||||
public ScrollLessRecyclerView(@NonNull Context context) {
|
||||
super(context);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public ScrollLessRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public ScrollLessRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init(context);
|
||||
}
|
||||
|
||||
private void init(Context context) {
|
||||
float scale = context.getResources().getDisplayMetrics().density;
|
||||
final float ppi = scale * 160.0f;
|
||||
mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
|
||||
* 39.37f // inch/meter
|
||||
* ppi
|
||||
* 0.84f; // look and feel tuning
|
||||
pageScrollThreshold = scale * 80;
|
||||
}
|
||||
|
||||
public void setPageScrollThreshold(float pageScrollThreshold) {
|
||||
this.pageScrollThreshold = pageScrollThreshold;
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent e) {
|
||||
if (enableScroll) {
|
||||
return super.onTouchEvent(e);
|
||||
}
|
||||
boolean superTouchResult = super.onTouchEvent(e);
|
||||
if (superTouchResult) {
|
||||
switch (e.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
initialTouchX = (int) (e.getX() + 0.5f);
|
||||
initialTouchY = (int) (e.getY() + 0.5f);
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
if (initialTouchX < 0 || initialTouchY < 0) {
|
||||
initialTouchX = (int) (e.getX() + 0.5f);
|
||||
initialTouchY = (int) (e.getY() + 0.5f);
|
||||
}
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (isScrollBefore) {
|
||||
int moveDistanceX = (int) (initialTouchX - e.getX() + flingMoveDistanceX);
|
||||
int moveDistanceY = (int) (initialTouchY - e.getY() + flingMoveDistanceY);
|
||||
onTouchScroll(moveDistanceX, moveDistanceY);
|
||||
initialTouchX = initialTouchY = -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
isScrollBefore = getScrollState() == SCROLL_STATE_DRAGGING;
|
||||
}
|
||||
return superTouchResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scrollByInternal(int x, int y, MotionEvent ev, int type) {
|
||||
if (enableScroll) {
|
||||
return super.scrollByInternal(x, y, ev, type);
|
||||
}
|
||||
//disable drag scroll effect,e-ink screen don't need it
|
||||
return false;
|
||||
}
|
||||
|
||||
double flingMoveDistanceX;
|
||||
double flingMoveDistanceY;
|
||||
|
||||
@Override
|
||||
public boolean fling(int velocityX, int velocityY) {
|
||||
if (enableScroll) {
|
||||
return super.fling(velocityX, velocityY);
|
||||
}
|
||||
flingMoveDistanceX = getSplineFlingDistance(velocityX) * Math.signum(velocityX);
|
||||
flingMoveDistanceY = getSplineFlingDistance(velocityY) * Math.signum(velocityY);
|
||||
//disable fling scroll effect,e-ink screen don't need it
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean canScrollVertical = true;
|
||||
boolean canScrollHorizontally = true;
|
||||
|
||||
protected void onTouchScroll(int dx, int dy) {
|
||||
canScrollVertical = true;
|
||||
canScrollHorizontally = true;
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout != null) {
|
||||
if (dy > pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
canScrollVertical = false;
|
||||
onScrollDown();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
canScrollHorizontally = false;
|
||||
onScrollRight();
|
||||
}
|
||||
} else if (dy < -pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
canScrollVertical = false;
|
||||
onScrollUp();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
canScrollHorizontally = false;
|
||||
onScrollLeft();
|
||||
}
|
||||
}
|
||||
|
||||
if (dx > pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
onScrollDown();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
onScrollRight();
|
||||
}
|
||||
} else if (dx < -pageScrollThreshold) {
|
||||
if (canScrollVertical && layout.canScrollVertically()) {
|
||||
onScrollUp();
|
||||
} else if (canScrollHorizontally && layout.canScrollHorizontally()) {
|
||||
onScrollLeft();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollLeft() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int firstVisiblePosition = realLayout.findFirstVisibleItemPosition();
|
||||
ViewHolder firstVisibleItem = findViewHolderForAdapterPosition(firstVisiblePosition);
|
||||
|
||||
if (firstVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item width overscreen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (firstVisibleItem.itemView.getMeasuredWidth() > getMeasuredWidth()) {
|
||||
super.scrollByInternal(-getMeasuredWidth() + defaultOverflowItemScrollKeep, 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (firstVisibleItem.itemView.getMeasuredWidth() == getMeasuredWidth()) {
|
||||
super.scrollByInternal(-getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(firstVisibleItem.itemView.getRight() - getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] firstVisiblePosition = realLayout.findFirstVisibleItemPositions(null);
|
||||
ViewHolder[] firstVisibleItems = new ViewHolder[firstVisiblePosition.length];
|
||||
for (int i = 0; i < firstVisiblePosition.length; i++) {
|
||||
firstVisibleItems[i] = findViewHolderForAdapterPosition(firstVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = Integer.MAX_VALUE;
|
||||
for (ViewHolder firstVisibleItem : firstVisibleItems) {
|
||||
if (firstVisibleItem != null) {
|
||||
if (firstVisibleItem.itemView.getRight() < scrollDistance) {
|
||||
scrollDistance = firstVisibleItem.itemView.getRight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (scrollDistance == getMeasuredWidth()) {
|
||||
scrollDistance = 0;
|
||||
}
|
||||
super.scrollByInternal(scrollDistance - getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollRight() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int lastVisiblePosition = realLayout.findLastVisibleItemPosition();
|
||||
ViewHolder lastVisibleItem = findViewHolderForAdapterPosition(lastVisiblePosition);
|
||||
|
||||
if (lastVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item width overflow screen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (lastVisibleItem.itemView.getMeasuredWidth() > getMeasuredWidth()) {
|
||||
super.scrollByInternal(getMeasuredWidth() - defaultOverflowItemScrollKeep, 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (lastVisibleItem.itemView.getMeasuredWidth() == getMeasuredWidth()) {
|
||||
super.scrollByInternal(getMeasuredWidth(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(lastVisibleItem.itemView.getLeft(), 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] lastVisiblePosition = realLayout.findLastVisibleItemPositions(null);
|
||||
ViewHolder[] lastVisibleItems = new ViewHolder[lastVisiblePosition.length];
|
||||
for (int i = 0; i < lastVisiblePosition.length; i++) {
|
||||
lastVisibleItems[i] = findViewHolderForAdapterPosition(lastVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = 0;
|
||||
for (ViewHolder lastVisibleItem : lastVisibleItems) {
|
||||
if (lastVisibleItem != null) {
|
||||
if (lastVisibleItem.itemView.getLeft() > scrollDistance) {
|
||||
scrollDistance = lastVisibleItem.itemView.getLeft();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scrollDistance == 0) {
|
||||
scrollDistance = getMeasuredWidth();
|
||||
}
|
||||
super.scrollByInternal(scrollDistance, 0, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollUp() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int firstVisiblePosition = realLayout.findFirstVisibleItemPosition();
|
||||
ViewHolder firstVisibleItem = findViewHolderForAdapterPosition(firstVisiblePosition);
|
||||
|
||||
if (firstVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item height overscreen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (firstVisibleItem.itemView.getMeasuredHeight() > getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, -getMeasuredHeight() + defaultOverflowItemScrollKeep, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (firstVisibleItem.itemView.getMeasuredHeight() == getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, -getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(0, firstVisibleItem.itemView.getBottom() - getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] firstVisiblePosition = realLayout.findFirstVisibleItemPositions(null);
|
||||
ViewHolder[] firstVisibleItems = new ViewHolder[firstVisiblePosition.length];
|
||||
for (int i = 0; i < firstVisiblePosition.length; i++) {
|
||||
firstVisibleItems[i] = findViewHolderForAdapterPosition(firstVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = Integer.MAX_VALUE;
|
||||
for (ViewHolder firstVisibleItem : firstVisibleItems) {
|
||||
if (firstVisibleItem != null) {
|
||||
if (firstVisibleItem.itemView.getBottom() < scrollDistance) {
|
||||
scrollDistance = firstVisibleItem.itemView.getBaseline();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scrollDistance == getMeasuredWidth()) {
|
||||
scrollDistance = 0;
|
||||
}
|
||||
super.scrollByInternal(0, scrollDistance - getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onScrollDown() {
|
||||
LayoutManager layout = getLayoutManager();
|
||||
if (layout instanceof LinearLayoutManager) {
|
||||
LinearLayoutManager realLayout = (LinearLayoutManager) layout;
|
||||
int lastVisiblePosition = realLayout.findLastVisibleItemPosition();
|
||||
ViewHolder lastVisibleItem = findViewHolderForAdapterPosition(lastVisiblePosition);
|
||||
|
||||
if (lastVisibleItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//when the item height overflow screen, findLastCompletelyVisibleItemPosition always return NO_POSITION
|
||||
if (lastVisibleItem.itemView.getMeasuredHeight() > getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, getMeasuredHeight() - defaultOverflowItemScrollKeep, null, ViewCompat.TYPE_TOUCH);
|
||||
} else if (lastVisibleItem.itemView.getMeasuredHeight() == getMeasuredHeight()) {
|
||||
super.scrollByInternal(0, getMeasuredHeight(), null, ViewCompat.TYPE_TOUCH);
|
||||
} else {
|
||||
super.scrollByInternal(0, lastVisibleItem.itemView.getTop(), null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
} else if (layout instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager realLayout = (StaggeredGridLayoutManager) layout;
|
||||
int[] lastVisiblePosition = realLayout.findLastVisibleItemPositions(null);
|
||||
ViewHolder[] lastVisibleItems = new ViewHolder[lastVisiblePosition.length];
|
||||
for (int i = 0; i < lastVisiblePosition.length; i++) {
|
||||
lastVisibleItems[i] = findViewHolderForAdapterPosition(lastVisiblePosition[i]);
|
||||
}
|
||||
int scrollDistance = 0;
|
||||
for (ViewHolder lastVisibleItem : lastVisibleItems) {
|
||||
if (lastVisibleItem != null) {
|
||||
if (lastVisibleItem.itemView.getTop() > scrollDistance) {
|
||||
scrollDistance = lastVisibleItem.itemView.getTop();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scrollDistance == 0) {
|
||||
scrollDistance = getMeasuredHeight();
|
||||
}
|
||||
super.scrollByInternal(0, scrollDistance, null, ViewCompat.TYPE_TOUCH);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
defaultOverflowItemScrollKeep = (int) (h * 0.05f);
|
||||
}
|
||||
|
||||
private double getSplineDeceleration(int velocity) {
|
||||
return Math.log(0.35f * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
|
||||
}
|
||||
|
||||
private double getSplineFlingDistance(int velocity) {
|
||||
final double l = getSplineDeceleration(velocity);
|
||||
final double decelMinusOne = DECELERATION_RATE - 1.0;
|
||||
return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
|
||||
}
|
||||
|
||||
public void setEnableScroll(boolean enableScroll) {
|
||||
this.enableScroll = enableScroll;
|
||||
}
|
||||
|
||||
public boolean isEnableScroll() {
|
||||
return enableScroll;
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import com.hippo.scene.SceneFragment;
|
||||
import com.microsoft.appcenter.AppCenter;
|
||||
import com.microsoft.appcenter.crashes.Crashes;
|
||||
import com.microsoft.appcenter.distribute.Distribute;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class Analytics {
|
||||
|
||||
public static void start(Application application) {
|
||||
AppCenter.start(application, "1aa06805-037c-4f3c-8aaa-e23d1433986d", com.microsoft.appcenter.analytics.Analytics.class, Crashes.class, Distribute.class);
|
||||
AppCenter.setUserId(Settings.getUserID());
|
||||
com.microsoft.appcenter.analytics.Analytics.setEnabled(Settings.getEnableAnalytics());
|
||||
Crashes.setEnabled(!BuildConfig.DEBUG);
|
||||
Distribute.setEnabledForDebuggableBuild(false);
|
||||
}
|
||||
|
||||
public static boolean isEnabled() {
|
||||
return AppCenter.isConfigured() && Settings.getEnableAnalytics();
|
||||
}
|
||||
|
||||
public static void setEnabled(boolean enabled) {
|
||||
com.microsoft.appcenter.analytics.Analytics.setEnabled(enabled);
|
||||
}
|
||||
|
||||
public static void onSceneView(SceneFragment scene) {
|
||||
if (isEnabled()) {
|
||||
Map<String, String> properties = new HashMap<>();
|
||||
properties.put("scene_simple_class", scene.getClass().getSimpleName());
|
||||
properties.put("scene_class", scene.getClass().getName());
|
||||
com.microsoft.appcenter.analytics.Analytics.trackEvent("scene_view", properties);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,6 +37,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.collection.LruCache;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.Native;
|
||||
import com.hippo.beerbelly.SimpleDiskCache;
|
||||
import com.hippo.conaco.Conaco;
|
||||
@@ -340,8 +341,6 @@ public class EhApplication extends SceneApplication {
|
||||
EhDB.mergeOldDB(this);
|
||||
}
|
||||
|
||||
Analytics.start(this);
|
||||
|
||||
LocaleDelegate.setDefaultLocale(Settings.getLocale());
|
||||
DayNightDelegate.setApplicationContext(this);
|
||||
DayNightDelegate.setDefaultNightMode(Settings.getTheme());
|
||||
@@ -431,7 +430,7 @@ public class EhApplication extends SceneApplication {
|
||||
Activity activity = getTopActivity();
|
||||
if (activity != null) {
|
||||
activity.runOnUiThread(() -> {
|
||||
AlertDialog dialog = new AlertDialog.Builder(activity)
|
||||
AlertDialog dialog = new MaterialAlertDialogBuilder(activity)
|
||||
.setMessage(Html.fromHtml(html))
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.create();
|
||||
|
||||
@@ -65,6 +65,7 @@ import androidx.core.view.WindowCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.AppConfig;
|
||||
import com.hippo.ehviewer.BuildConfig;
|
||||
import com.hippo.ehviewer.R;
|
||||
@@ -981,7 +982,7 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan
|
||||
|
||||
private void showPageDialog(final int page) {
|
||||
Resources resources = GalleryActivity.this.getResources();
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(GalleryActivity.this);
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(GalleryActivity.this);
|
||||
builder.setTitle(resources.getString(R.string.page_menu_title, page + 1));
|
||||
|
||||
final CharSequence[] items;
|
||||
@@ -1194,7 +1195,7 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan
|
||||
}
|
||||
|
||||
private void onTapMenuArea() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(GalleryActivity.this);
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(GalleryActivity.this);
|
||||
GalleryMenuHelper helper = new GalleryMenuHelper(builder.getContext());
|
||||
builder.setTitle(R.string.gallery_menu_title)
|
||||
.setView(helper.getView())
|
||||
|
||||
@@ -43,10 +43,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.drawerlayout.widget.DrawerLayout;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.navigation.NavigationView;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.hippo.app.EditTextDialogBuilder;
|
||||
@@ -59,7 +59,6 @@ import com.hippo.ehviewer.client.EhUtils;
|
||||
import com.hippo.ehviewer.client.data.ListUrlBuilder;
|
||||
import com.hippo.ehviewer.client.parser.GalleryDetailUrlParser;
|
||||
import com.hippo.ehviewer.client.parser.GalleryPageUrlParser;
|
||||
import com.hippo.ehviewer.ui.scene.AnalyticsScene;
|
||||
import com.hippo.ehviewer.ui.scene.BaseScene;
|
||||
import com.hippo.ehviewer.ui.scene.CookieSignInScene;
|
||||
import com.hippo.ehviewer.ui.scene.DownloadsScene;
|
||||
@@ -107,7 +106,6 @@ public final class MainActivity extends StageActivity
|
||||
static {
|
||||
registerLaunchMode(SecurityScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK);
|
||||
registerLaunchMode(WarningScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK);
|
||||
registerLaunchMode(AnalyticsScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK);
|
||||
registerLaunchMode(SignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK);
|
||||
registerLaunchMode(WebViewSignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK);
|
||||
registerLaunchMode(CookieSignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK);
|
||||
@@ -159,8 +157,6 @@ public final class MainActivity extends StageActivity
|
||||
return new Announcer(SecurityScene.class);
|
||||
} else if (Settings.getShowWarning()) {
|
||||
return new Announcer(WarningScene.class);
|
||||
} else if (Settings.getAskAnalytics()) {
|
||||
return new Announcer(AnalyticsScene.class);
|
||||
} else if (EhUtils.needSignedIn(this)) {
|
||||
return new Announcer(SignInScene.class);
|
||||
} else if (Settings.getSelectSite()) {
|
||||
@@ -185,11 +181,6 @@ public final class MainActivity extends StageActivity
|
||||
newArgs.putString(WarningScene.KEY_TARGET_SCENE, announcer.getClazz().getName());
|
||||
newArgs.putBundle(WarningScene.KEY_TARGET_ARGS, announcer.getArgs());
|
||||
return new Announcer(WarningScene.class).setArgs(newArgs);
|
||||
} else if (Settings.getAskAnalytics()) {
|
||||
Bundle newArgs = new Bundle();
|
||||
newArgs.putString(AnalyticsScene.KEY_TARGET_SCENE, announcer.getClazz().getName());
|
||||
newArgs.putBundle(AnalyticsScene.KEY_TARGET_ARGS, announcer.getArgs());
|
||||
return new Announcer(AnalyticsScene.class).setArgs(newArgs);
|
||||
} else if (EhUtils.needSignedIn(this)) {
|
||||
Bundle newArgs = new Bundle();
|
||||
newArgs.putString(SignInScene.KEY_TARGET_SCENE, announcer.getClazz().getName());
|
||||
@@ -333,7 +324,7 @@ public final class MainActivity extends StageActivity
|
||||
mAvatar = (LoadImageView) ViewUtils.$$(headerLayout, R.id.avatar);
|
||||
mDisplayName = (TextView) ViewUtils.$$(headerLayout, R.id.display_name);
|
||||
ViewUtils.$$(headerLayout, R.id.night_mode).setOnClickListener(v -> {
|
||||
int theme = (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) > 0 ? AppCompatDelegate.MODE_NIGHT_NO : AppCompatDelegate.MODE_NIGHT_YES;
|
||||
int theme = (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) > 0 ? DayNightDelegate.MODE_NIGHT_NO : DayNightDelegate.MODE_NIGHT_YES;
|
||||
DayNightDelegate.setDefaultNightMode(theme);
|
||||
recreate();
|
||||
if (Settings.getTheme() != AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) {
|
||||
@@ -389,7 +380,7 @@ public final class MainActivity extends StageActivity
|
||||
break;
|
||||
}
|
||||
if (hasUnverified) {
|
||||
new AlertDialog.Builder(this)
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.app_link_not_verified_title)
|
||||
.setMessage(R.string.app_link_not_verified_message)
|
||||
.setPositiveButton(R.string.open_settings, (dialogInterface, i) -> {
|
||||
@@ -409,7 +400,7 @@ public final class MainActivity extends StageActivity
|
||||
if (null == uniFile || uniFile.ensureDir()) {
|
||||
return;
|
||||
}
|
||||
new AlertDialog.Builder(this)
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.waring)
|
||||
.setMessage(R.string.invalid_download_location)
|
||||
.setPositiveButton(R.string.get_it, null)
|
||||
|
||||
@@ -21,12 +21,10 @@ import android.os.Bundle;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.hippo.ehviewer.Analytics;
|
||||
import com.hippo.ehviewer.EhApplication;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.text.Html;
|
||||
import com.hippo.util.AppHelper;
|
||||
import com.microsoft.appcenter.distribute.Distribute;
|
||||
|
||||
public class AboutFragment extends BasePreferenceFragment {
|
||||
|
||||
@@ -47,7 +45,6 @@ public class AboutFragment extends BasePreferenceFragment {
|
||||
author.setOnPreferenceClickListener(this);
|
||||
//donate.setOnPreferenceClickListener(this);
|
||||
checkForUpdate.setOnPreferenceClickListener(this);
|
||||
checkForUpdate.setVisible(Analytics.isEnabled());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -56,8 +53,6 @@ public class AboutFragment extends BasePreferenceFragment {
|
||||
if (KEY_AUTHOR.equals(key)) {
|
||||
AppHelper.sendEmail(requireActivity(), EhApplication.getDeveloperEmail(),
|
||||
"About EhViewer", null);
|
||||
} else if (KEY_CHECK_FOR_UPDATES.equals(key)) {
|
||||
Distribute.checkForUpdate();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.AppConfig;
|
||||
import com.hippo.ehviewer.BuildConfig;
|
||||
import com.hippo.ehviewer.EhApplication;
|
||||
@@ -76,7 +77,7 @@ public class AdvancedFragment extends BasePreferenceFragment {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
AlertDialog alertDialog = new AlertDialog.Builder(requireActivity())
|
||||
AlertDialog alertDialog = new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setCancelable(false)
|
||||
.setView(R.layout.preference_dialog_task)
|
||||
.show();
|
||||
@@ -193,7 +194,7 @@ public class AdvancedFragment extends BasePreferenceFragment {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
AlertDialog alertDialog = new AlertDialog.Builder(requireActivity())
|
||||
AlertDialog alertDialog = new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setCancelable(false)
|
||||
.setView(R.layout.preference_dialog_task)
|
||||
.show();
|
||||
|
||||
@@ -26,6 +26,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.AppConfig;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.Settings;
|
||||
@@ -99,7 +100,7 @@ public class DownloadFragment extends BasePreferenceFragment {
|
||||
if (KEY_DOWNLOAD_LOCATION.equals(key)) {
|
||||
UniFile file = Settings.getDownloadLocation();
|
||||
if (file != null && !UniFile.isFileUri(Settings.getDownloadLocation().getUri())) {
|
||||
new AlertDialog.Builder(requireContext())
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(R.string.settings_download_download_location)
|
||||
.setMessage(file.getUri().toString())
|
||||
.setPositiveButton(R.string.pick_new_download_location, (dialogInterface, i) -> openDirPickerL())
|
||||
|
||||
@@ -24,6 +24,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView;
|
||||
@@ -137,7 +138,7 @@ public class FilterFragment extends BaseFragment {
|
||||
}
|
||||
|
||||
private void showTipDialog() {
|
||||
new AlertDialog.Builder(requireActivity())
|
||||
new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.filter)
|
||||
.setMessage(R.string.filter_tip)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
@@ -145,7 +146,7 @@ public class FilterFragment extends BaseFragment {
|
||||
}
|
||||
|
||||
private void showAddFilterDialog() {
|
||||
AlertDialog dialog = new AlertDialog.Builder(requireActivity())
|
||||
AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.add_filter)
|
||||
.setView(R.layout.dialog_add_filter)
|
||||
.setPositiveButton(R.string.add, null)
|
||||
@@ -157,7 +158,7 @@ public class FilterFragment extends BaseFragment {
|
||||
|
||||
private void showDeleteFilterDialog(final Filter filter) {
|
||||
String message = getString(R.string.delete_filter, filter.text);
|
||||
new AlertDialog.Builder(requireActivity())
|
||||
new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setMessage(message)
|
||||
.setPositiveButton(R.string.delete, (dialog, which) -> {
|
||||
if (DialogInterface.BUTTON_POSITIVE != which || null == mFilterList) {
|
||||
|
||||
@@ -16,6 +16,7 @@ import androidx.fragment.app.DialogFragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.hippo.easyrecyclerview.LinearDividerItemDecoration;
|
||||
@@ -135,7 +136,7 @@ public class HostsFragment extends BaseFragment
|
||||
ip.setText(arguments.getString(KEY_IP));
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()).setView(view);
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext()).setView(view);
|
||||
onCreateDialogBuilder(builder);
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.setOnShowListener(d -> onCreateDialog((AlertDialog) d));
|
||||
|
||||
@@ -6,7 +6,6 @@ import android.text.TextUtils;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.hippo.ehviewer.Analytics;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.Settings;
|
||||
|
||||
@@ -20,9 +19,6 @@ public class PrivacyFragment extends BasePreferenceFragment {
|
||||
@Override
|
||||
public void onCreatePreferencesFix(@Nullable Bundle savedInstanceState, String rootKey) {
|
||||
addPreferencesFromResource(R.xml.privacy_settings);
|
||||
Preference enableAnalytics = findPreference(Settings.KEY_ENABLE_ANALYTICS);
|
||||
|
||||
enableAnalytics.setOnPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -34,17 +30,6 @@ public class PrivacyFragment extends BasePreferenceFragment {
|
||||
R.string.settings_privacy_pattern_protection_set);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
String key = preference.getKey();
|
||||
if (Settings.KEY_ENABLE_ANALYTICS.equals(key)) {
|
||||
if (newValue instanceof Boolean && (Boolean) newValue) {
|
||||
Analytics.start(getActivity().getApplication());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFragmentTitle() {
|
||||
return R.string.settings_privacy;
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.ui.scene;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.hippo.ehviewer.Analytics;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.Settings;
|
||||
import com.hippo.ehviewer.ui.MainActivity;
|
||||
import com.hippo.text.Html;
|
||||
import com.hippo.yorozuya.ViewUtils;
|
||||
|
||||
public class AnalyticsScene extends SolidScene implements View.OnClickListener {
|
||||
|
||||
@Nullable
|
||||
private View mReject;
|
||||
@Nullable
|
||||
private View mAccept;
|
||||
|
||||
@Override
|
||||
public boolean needShowLeftDrawer() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.scene_analytics, container, false);
|
||||
|
||||
mReject = ViewUtils.$$(view, R.id.reject);
|
||||
mAccept = ViewUtils.$$(view, R.id.accept);
|
||||
TextView text = (TextView) ViewUtils.$$(view, R.id.text);
|
||||
|
||||
text.setText(Html.fromHtml(getString(R.string.analytics_explain)));
|
||||
text.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
|
||||
mReject.setOnClickListener(this);
|
||||
mAccept.setOnClickListener(this);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
|
||||
mReject = null;
|
||||
mAccept = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Context context = getContext();
|
||||
MainActivity activity = getMainActivity();
|
||||
if (context == null || activity == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mReject == v) {
|
||||
Settings.putEnableAnalytics(false);
|
||||
} else if (mAccept == v) {
|
||||
Settings.putEnableAnalytics(true);
|
||||
}
|
||||
Analytics.setEnabled(Settings.getEnableAnalytics());
|
||||
Settings.putAskAnalytics(false);
|
||||
|
||||
// Start new scene and finish it self
|
||||
startSceneForCheckStep(CHECK_STEP_ANALYTICS, getArguments());
|
||||
finish();
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,6 @@ import androidx.core.view.WindowInsetsControllerCompat;
|
||||
import androidx.drawerlayout.widget.DrawerLayout;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.hippo.ehviewer.Analytics;
|
||||
import com.hippo.ehviewer.ui.MainActivity;
|
||||
import com.hippo.scene.SceneFragment;
|
||||
import com.hippo.util.AppHelper;
|
||||
@@ -274,12 +273,6 @@ public abstract class BaseScene extends SceneFragment {
|
||||
return insetsController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
Analytics.onSceneView(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
@@ -30,8 +30,8 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.hippo.ehviewer.EhApplication;
|
||||
import com.hippo.ehviewer.R;
|
||||
@@ -217,7 +217,7 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc
|
||||
hideSoftInput();
|
||||
|
||||
if (!checkIpbMemberId(ipbMemberId) || !(checkIpbPassHash(ipbPassHash))) {
|
||||
new AlertDialog.Builder(context).setTitle(R.string.waring)
|
||||
new MaterialAlertDialogBuilder(context).setTitle(R.string.waring)
|
||||
.setMessage(R.string.wrong_cookie_warning)
|
||||
.setPositiveButton(R.string.i_will_check_it, null)
|
||||
.setNegativeButton(R.string.i_dont_think_so, (dialog, which) -> {
|
||||
|
||||
@@ -58,6 +58,7 @@ import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
||||
|
||||
import com.getkeepsafe.taptargetview.TapTarget;
|
||||
import com.getkeepsafe.taptargetview.TapTargetView;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
|
||||
@@ -525,7 +526,7 @@ public class DownloadsScene extends ToolbarScene
|
||||
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.action_filter) {
|
||||
new AlertDialog.Builder(requireActivity())
|
||||
new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setSingleChoiceItems(R.array.download_state, mType + 1, (dialog, which) -> {
|
||||
mType = which - 1;
|
||||
updateForLabel();
|
||||
@@ -548,7 +549,7 @@ public class DownloadsScene extends ToolbarScene
|
||||
openDrawer(Gravity.RIGHT);
|
||||
return true;
|
||||
} else if (id == R.id.action_reset_reading_progress) {
|
||||
new AlertDialog.Builder(getContext())
|
||||
new MaterialAlertDialogBuilder(getContext())
|
||||
.setMessage(R.string.reset_reading_progress_message)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
@@ -621,7 +622,7 @@ public class DownloadsScene extends ToolbarScene
|
||||
for (int i = 0, n = list.size(); i < n; i++) {
|
||||
items[i + 2] = list.get(i).getLabel();
|
||||
}
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.default_download_label)
|
||||
.setItems(items, (dialog1, which) -> {
|
||||
if (which == 0) {
|
||||
@@ -821,7 +822,7 @@ public class DownloadsScene extends ToolbarScene
|
||||
|
||||
MoveDialogHelper helper = new MoveDialogHelper(labels, downloadInfoList);
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_move_dialog_title)
|
||||
.setItems(labels, helper)
|
||||
.show();
|
||||
@@ -1067,7 +1068,7 @@ public class DownloadsScene extends ToolbarScene
|
||||
AlertDialog dialog = builder.show();
|
||||
new RenameLabelDialogHelper(builder, dialog, label);
|
||||
} else if (itemId == R.id.menu_label_remove) {
|
||||
new AlertDialog.Builder(requireContext())
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(getString(R.string.delete_label_title))
|
||||
.setMessage(getString(R.string.delete_label_message, label))
|
||||
.setPositiveButton(R.string.delete, (dialog, which) -> {
|
||||
|
||||
@@ -48,6 +48,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.getkeepsafe.taptargetview.TapTarget;
|
||||
import com.getkeepsafe.taptargetview.TapTargetView;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.hippo.annotation.Implemented;
|
||||
import com.hippo.app.EditTextDialogBuilder;
|
||||
@@ -438,7 +439,7 @@ public class FavoritesScene extends BaseScene implements
|
||||
items[1] = getString(R.string.local_favorites);
|
||||
String[] favCat = Settings.getFavCat();
|
||||
System.arraycopy(favCat, 0, items, 2, 10);
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.default_favorites_collection)
|
||||
.setItems(items, (dialog, which) -> Settings.putDefaultFavSlot(which - 2)).show();
|
||||
return true;
|
||||
@@ -777,7 +778,7 @@ public class FavoritesScene extends BaseScene implements
|
||||
}
|
||||
case 4: { // Delete
|
||||
DeleteDialogHelper helper = new DeleteDialogHelper();
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.delete_favorites_dialog_title)
|
||||
.setMessage(getString(R.string.delete_favorites_dialog_message, mModifyGiList.size()))
|
||||
.setPositiveButton(android.R.string.ok, helper)
|
||||
@@ -791,7 +792,7 @@ public class FavoritesScene extends BaseScene implements
|
||||
String[] array = new String[11];
|
||||
array[0] = getString(R.string.local_favorites);
|
||||
System.arraycopy(Settings.getFavCat(), 0, array, 1, 10);
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.move_favorites_dialog_title)
|
||||
.setItems(array, helper)
|
||||
.setOnCancelListener(helper)
|
||||
|
||||
@@ -54,6 +54,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView;
|
||||
import com.hippo.easyrecyclerview.LinearDividerItemDecoration;
|
||||
@@ -308,7 +309,7 @@ public final class GalleryCommentsScene extends ToolbarScene
|
||||
}
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
|
||||
context = builder.getContext();
|
||||
final LayoutInflater inflater = LayoutInflater.from(context);
|
||||
EasyRecyclerView rv = (EasyRecyclerView) inflater.inflate(R.layout.dialog_recycler_view, null);
|
||||
@@ -370,7 +371,7 @@ public final class GalleryCommentsScene extends ToolbarScene
|
||||
menuId.add(R.id.check_vote_status);
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setItems(menu.toArray(new String[0]), (dialog, which) -> {
|
||||
if (which < 0 || which >= menuId.size()) {
|
||||
return;
|
||||
|
||||
@@ -66,6 +66,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.transition.TransitionInflater;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.progressindicator.CircularProgressIndicator;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.hippo.app.EditTextDialogBuilder;
|
||||
@@ -275,7 +276,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
result -> {
|
||||
if (result && mGalleryDetail != null) {
|
||||
TorrentListDialogHelper helper = new TorrentListDialogHelper();
|
||||
Dialog dialog = new AlertDialog.Builder(requireActivity())
|
||||
Dialog dialog = new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.torrents)
|
||||
.setView(R.layout.dialog_torrent_list)
|
||||
.setOnDismissListener(helper)
|
||||
@@ -1231,7 +1232,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
if (EhApplication.getDownloadManager(context).getDownloadState(galleryInfo.gid) == DownloadInfo.STATE_INVALID) {
|
||||
CommonOperations.startDownload(activity, galleryInfo, false);
|
||||
} else {
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_remove_dialog_title)
|
||||
.setMessage(getString(R.string.download_remove_dialog_message, galleryInfo.title))
|
||||
.setPositiveButton(android.R.string.ok, (dialog1, which1) -> EhApplication.getDownloadManager(context).deleteDownload(galleryInfo.gid))
|
||||
@@ -1257,7 +1258,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
for (GalleryInfo newerVersion : mGalleryDetail.newerVersions) {
|
||||
titles.add(getString(R.string.newer_version_title, newerVersion.title, newerVersion.posted));
|
||||
}
|
||||
new AlertDialog.Builder(requireContext())
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setItems(titles.toArray(new CharSequence[0]), (dialog, which) -> {
|
||||
GalleryInfo newerVersion = mGalleryDetail.newerVersions.get(which);
|
||||
Bundle args = new Bundle();
|
||||
@@ -1303,7 +1304,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
requestStoragePermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
} else {
|
||||
TorrentListDialogHelper helper = new TorrentListDialogHelper();
|
||||
Dialog dialog = new AlertDialog.Builder(context)
|
||||
Dialog dialog = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.torrents)
|
||||
.setView(R.layout.dialog_torrent_list)
|
||||
.setOnDismissListener(helper)
|
||||
@@ -1320,7 +1321,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
return;
|
||||
}
|
||||
ArchiveListDialogHelper helper = new ArchiveListDialogHelper();
|
||||
Dialog dialog = new AlertDialog.Builder(context)
|
||||
Dialog dialog = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.dialog_archive_title)
|
||||
.setView(R.layout.dialog_archive_list)
|
||||
.setOnDismissListener(helper)
|
||||
@@ -1335,7 +1336,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
return;
|
||||
}
|
||||
RateDialogHelper helper = new RateDialogHelper();
|
||||
Dialog dialog = new AlertDialog.Builder(context)
|
||||
Dialog dialog = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.rate)
|
||||
.setView(R.layout.dialog_rate)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
@@ -1397,7 +1398,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
return;
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setMessage(getString(R.string.filter_the_uploader, uploader))
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
Filter filter = new Filter();
|
||||
@@ -1417,7 +1418,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
return;
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setMessage(getString(R.string.filter_the_tag, tag))
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
Filter filter = new Filter();
|
||||
@@ -1466,7 +1467,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene
|
||||
menuId.add(R.id.vote_down);
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(tag)
|
||||
.setItems(menu.toArray(new String[0]), (dialog, which) -> {
|
||||
if (which < 0 || which >= menuId.size()) {
|
||||
|
||||
@@ -61,6 +61,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.getkeepsafe.taptargetview.TapTarget;
|
||||
import com.getkeepsafe.taptargetview.TapTargetView;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
|
||||
@@ -1043,7 +1044,7 @@ public final class GalleryListScene extends BaseScene
|
||||
favourited ? R.drawable.v_heart_broken_x24 : R.drawable.v_heart_x24,
|
||||
};
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(EhUtils.getSuitableTitle(gi))
|
||||
.setAdapter(new SelectItemWithIconAdapter(context, items, icons), (dialog, which) -> {
|
||||
switch (which) {
|
||||
@@ -1055,7 +1056,7 @@ public final class GalleryListScene extends BaseScene
|
||||
break;
|
||||
case 1: // Download
|
||||
if (downloaded) {
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_remove_dialog_title)
|
||||
.setMessage(getString(R.string.download_remove_dialog_message, gi.title))
|
||||
.setPositiveButton(android.R.string.ok, (dialog1, which1) -> mDownloadManager.deleteDownload(gi.gid))
|
||||
@@ -1082,7 +1083,7 @@ public final class GalleryListScene extends BaseScene
|
||||
|
||||
MoveDialogHelper helper = new MoveDialogHelper(labels, gi);
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_move_dialog_title)
|
||||
.setItems(labels, helper)
|
||||
.show();
|
||||
@@ -1655,7 +1656,7 @@ public final class GalleryListScene extends BaseScene
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
if (item.getItemId() == R.id.menu_qs_remove) {
|
||||
new AlertDialog.Builder(requireContext())
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(getString(R.string.delete_quick_search_title))
|
||||
.setMessage(getString(R.string.delete_quick_search_message, quickSearch.name))
|
||||
.setPositiveButton(R.string.delete, (dialog, which) -> {
|
||||
|
||||
@@ -35,6 +35,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView;
|
||||
import com.hippo.easyrecyclerview.MarginItemDecoration;
|
||||
import com.hippo.ehviewer.EhApplication;
|
||||
@@ -210,7 +211,7 @@ public class GalleryPreviewsScene extends ToolbarScene {
|
||||
int pages = mHelper.getPages();
|
||||
if (pages > 0 && mHelper.canGoTo()) {
|
||||
GoToDialogHelper helper = new GoToDialogHelper(pages, mHelper.getPageForTop());
|
||||
AlertDialog dialog = new AlertDialog.Builder(context).setTitle(R.string.go_to)
|
||||
AlertDialog dialog = new MaterialAlertDialogBuilder(context).setTitle(R.string.go_to)
|
||||
.setView(R.layout.dialog_go_to)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.create();
|
||||
|
||||
@@ -35,12 +35,12 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator;
|
||||
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager;
|
||||
@@ -307,7 +307,7 @@ public class HistoryScene extends ToolbarScene {
|
||||
}
|
||||
|
||||
private void showClearAllDialog() {
|
||||
new AlertDialog.Builder(requireContext())
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setMessage(R.string.clear_all_history)
|
||||
.setPositiveButton(R.string.clear_all, (dialog, which) -> {
|
||||
if (DialogInterface.BUTTON_POSITIVE != which || null == mAdapter) {
|
||||
@@ -398,7 +398,7 @@ public class HistoryScene extends ToolbarScene {
|
||||
R.drawable.v_delete_x24,
|
||||
};
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(EhUtils.getSuitableTitle(gi))
|
||||
.setAdapter(new SelectItemWithIconAdapter(context, items, icons), (dialog, which) -> {
|
||||
switch (which) {
|
||||
@@ -410,7 +410,7 @@ public class HistoryScene extends ToolbarScene {
|
||||
break;
|
||||
case 1: // Download
|
||||
if (downloaded) {
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_remove_dialog_title)
|
||||
.setMessage(getString(R.string.download_remove_dialog_message, gi.title))
|
||||
.setPositiveButton(android.R.string.ok, (dialog1, which1) -> mDownloadManager.deleteDownload(gi.gid))
|
||||
@@ -448,7 +448,7 @@ public class HistoryScene extends ToolbarScene {
|
||||
|
||||
MoveDialogHelper helper = new MoveDialogHelper(labels, gi);
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_move_dialog_title)
|
||||
.setItems(labels, helper)
|
||||
.show();
|
||||
|
||||
@@ -32,7 +32,6 @@ import androidx.biometric.BiometricPrompt;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.Settings;
|
||||
import com.hippo.ehviewer.ui.MainActivity;
|
||||
import com.hippo.hardware.ShakeDetector;
|
||||
import com.hippo.widget.lockpattern.LockPatternUtils;
|
||||
import com.hippo.widget.lockpattern.LockPatternView;
|
||||
import com.hippo.yorozuya.ObjectUtils;
|
||||
@@ -42,7 +41,7 @@ import java.util.List;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public class SecurityScene extends SolidScene implements
|
||||
LockPatternView.OnPatternListener, ShakeDetector.OnShakeListener {
|
||||
LockPatternView.OnPatternListener{
|
||||
|
||||
private static final int MAX_RETRY_TIMES = 5;
|
||||
private static final String KEY_RETRY_TIMES = "retry_times";
|
||||
@@ -52,7 +51,6 @@ public class SecurityScene extends SolidScene implements
|
||||
|
||||
private SensorManager mSensorManager;
|
||||
private Sensor mAccelerometer;
|
||||
private ShakeDetector mShakeDetector;
|
||||
private BiometricPrompt.PromptInfo promptInfo;
|
||||
private BiometricPrompt biometricPrompt;
|
||||
private boolean canAuthenticate = false;
|
||||
@@ -72,10 +70,6 @@ public class SecurityScene extends SolidScene implements
|
||||
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
if (null != mSensorManager) {
|
||||
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
||||
if (null != mAccelerometer) {
|
||||
mShakeDetector = new ShakeDetector();
|
||||
mShakeDetector.setOnShakeListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
if (null == savedInstanceState) {
|
||||
@@ -116,17 +110,12 @@ public class SecurityScene extends SolidScene implements
|
||||
|
||||
mSensorManager = null;
|
||||
mAccelerometer = null;
|
||||
mShakeDetector = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
if (null != mShakeDetector) {
|
||||
mSensorManager.registerListener(mShakeDetector, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
|
||||
}
|
||||
|
||||
if (canAuthenticate) {
|
||||
startBiometricPrompt();
|
||||
}
|
||||
@@ -139,10 +128,6 @@ public class SecurityScene extends SolidScene implements
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
|
||||
if (null != mShakeDetector) {
|
||||
mSensorManager.unregisterListener(mShakeDetector);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -205,17 +190,4 @@ public class SecurityScene extends SolidScene implements
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onShake(int count) {
|
||||
if (count == 10) {
|
||||
MainActivity activity = getMainActivity();
|
||||
if (null == activity) {
|
||||
return;
|
||||
}
|
||||
Settings.putSecurity("");
|
||||
startSceneForCheckStep(CHECK_STEP_SECURITY, getArguments());
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,8 +29,8 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.hippo.ehviewer.EhApplication;
|
||||
import com.hippo.ehviewer.R;
|
||||
@@ -333,7 +333,7 @@ public final class SignInScene extends SolidScene implements EditText.OnEditorAc
|
||||
return;
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.sign_in_failed)
|
||||
.setMessage(ExceptionUtils.getReadableString(e) + "\n\n" + getString(R.string.sign_in_failed_tip))
|
||||
.setPositiveButton(R.string.get_it, null)
|
||||
|
||||
@@ -30,9 +30,8 @@ public class SolidScene extends BaseScene {
|
||||
|
||||
public static final int CHECK_STEP_SECURITY = 0;
|
||||
public static final int CHECK_STEP_WARNING = 1;
|
||||
public static final int CHECK_STEP_ANALYTICS = 2;
|
||||
public static final int CHECK_STEP_SIGN_IN = 3;
|
||||
public static final int CHECK_STEP_SELECT_SITE = 4;
|
||||
public static final int CHECK_STEP_SIGN_IN = 2;
|
||||
public static final int CHECK_STEP_SELECT_SITE = 3;
|
||||
public static final String KEY_TARGET_SCENE = "target_scene";
|
||||
public static final String KEY_TARGET_ARGS = "target_args";
|
||||
private static final String TAG = SolidScene.class.getSimpleName();
|
||||
@@ -45,11 +44,6 @@ public class SolidScene extends BaseScene {
|
||||
break;
|
||||
}
|
||||
case CHECK_STEP_WARNING:
|
||||
if (Settings.getAskAnalytics()) {
|
||||
startScene(new Announcer(AnalyticsScene.class).setArgs(args), true);
|
||||
break;
|
||||
}
|
||||
case CHECK_STEP_ANALYTICS:
|
||||
if (EhUtils.needSignedIn(getContext())) {
|
||||
startScene(new Announcer(SignInScene.class).setArgs(args), true);
|
||||
break;
|
||||
|
||||
@@ -26,8 +26,7 @@ import android.webkit.WebView;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.R;
|
||||
|
||||
public class DialogWebChromeClient extends WebChromeClient {
|
||||
@@ -40,7 +39,7 @@ public class DialogWebChromeClient extends WebChromeClient {
|
||||
|
||||
@Override
|
||||
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
|
||||
new AlertDialog.Builder(view.getContext())
|
||||
new MaterialAlertDialogBuilder(view.getContext())
|
||||
.setMessage(message)
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm())
|
||||
.setOnCancelListener(dialog -> result.cancel())
|
||||
@@ -50,7 +49,7 @@ public class DialogWebChromeClient extends WebChromeClient {
|
||||
|
||||
@Override
|
||||
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
|
||||
new AlertDialog.Builder(view.getContext())
|
||||
new MaterialAlertDialogBuilder(view.getContext())
|
||||
.setMessage(message)
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm())
|
||||
.setNegativeButton(android.R.string.cancel, (dialog, which) -> result.cancel())
|
||||
@@ -68,7 +67,7 @@ public class DialogWebChromeClient extends WebChromeClient {
|
||||
final EditText valueView = promptView.findViewById(R.id.value);
|
||||
valueView.setText(defaultValue);
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setView(promptView)
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm(valueView.getText().toString()))
|
||||
.setOnCancelListener(dialog -> result.cancel())
|
||||
|
||||
@@ -46,6 +46,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.card.MaterialCardView;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView;
|
||||
import com.hippo.easyrecyclerview.LinearDividerItemDecoration;
|
||||
import com.hippo.ehviewer.R;
|
||||
@@ -654,7 +655,7 @@ public class SearchBar extends MaterialCardView implements View.OnClickListener,
|
||||
|
||||
@Override
|
||||
public boolean onLongClick() {
|
||||
new AlertDialog.Builder(getContext())
|
||||
new MaterialAlertDialogBuilder(getContext())
|
||||
.setMessage(getContext().getString(R.string.delete_search_history, mKeyword))
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(R.string.delete, (dialog, which) -> {
|
||||
|
||||
@@ -35,11 +35,11 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView;
|
||||
import com.hippo.easyrecyclerview.MarginItemDecoration;
|
||||
@@ -52,7 +52,6 @@ import com.hippo.yorozuya.ViewUtils;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Objects;
|
||||
|
||||
public class SearchLayout extends EasyRecyclerView implements CompoundButton.OnCheckedChangeListener,
|
||||
View.OnClickListener, ImageSearchLayout.Helper, TabLayout.OnTabSelectedListener {
|
||||
@@ -113,7 +112,7 @@ public class SearchLayout extends EasyRecyclerView implements CompoundButton.OnC
|
||||
setAdapter(mAdapter);
|
||||
setHasFixedSize(true);
|
||||
setClipToPadding(false);
|
||||
((DefaultItemAnimator) Objects.requireNonNull(getItemAnimator())).setSupportsChangeAnimations(false);
|
||||
((DefaultItemAnimator) getItemAnimator()).setSupportsChangeAnimations(false);
|
||||
int interval = resources.getDimensionPixelOffset(R.dimen.search_layout_interval);
|
||||
int paddingH = resources.getDimensionPixelOffset(R.dimen.search_layout_margin_h);
|
||||
int paddingV = resources.getDimensionPixelOffset(R.dimen.search_layout_margin_v);
|
||||
@@ -268,7 +267,7 @@ public class SearchLayout extends EasyRecyclerView implements CompoundButton.OnC
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mNormalSearchModeHelp == v) {
|
||||
new AlertDialog.Builder(getContext())
|
||||
new MaterialAlertDialogBuilder(getContext())
|
||||
.setMessage(R.string.search_tip)
|
||||
.show();
|
||||
}
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
package com.hippo.hardware;
|
||||
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
|
||||
// http://jasonmcreynolds.com/?p=388
|
||||
public class ShakeDetector implements SensorEventListener {
|
||||
|
||||
/*
|
||||
* The gForce that is necessary to register as shake.
|
||||
* Must be greater than 1G (one earth gravity unit).
|
||||
* You can install "G-Force", by Blake La Pierre
|
||||
* from the Google Play Store and run it to see how
|
||||
* many G's it takes to register a shake
|
||||
*/
|
||||
private static final float SHAKE_THRESHOLD_GRAVITY = 2.7F;
|
||||
private static final int SHAKE_SLOP_TIME_MS = 500;
|
||||
private static final int SHAKE_COUNT_RESET_TIME_MS = 3000;
|
||||
|
||||
private OnShakeListener mListener;
|
||||
private long mShakeTimestamp;
|
||||
private int mShakeCount;
|
||||
|
||||
public void setOnShakeListener(OnShakeListener listener) {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
|
||||
if (mListener != null) {
|
||||
float x = event.values[0];
|
||||
float y = event.values[1];
|
||||
float z = event.values[2];
|
||||
|
||||
float gX = x / SensorManager.GRAVITY_EARTH;
|
||||
float gY = y / SensorManager.GRAVITY_EARTH;
|
||||
float gZ = z / SensorManager.GRAVITY_EARTH;
|
||||
|
||||
// gForce will be close to 1 when there is no movement.
|
||||
float gForce = (float) Math.sqrt(gX * gX + gY * gY + gZ * gZ);
|
||||
|
||||
if (gForce > SHAKE_THRESHOLD_GRAVITY) {
|
||||
final long now = System.currentTimeMillis();
|
||||
// ignore shake events too close to each other (500ms)
|
||||
if (mShakeTimestamp + SHAKE_SLOP_TIME_MS > now) {
|
||||
return;
|
||||
}
|
||||
|
||||
// reset the shake count after 3 seconds of no shakes
|
||||
if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) {
|
||||
mShakeCount = 0;
|
||||
}
|
||||
|
||||
mShakeTimestamp = now;
|
||||
mShakeCount++;
|
||||
|
||||
mListener.onShake(mShakeCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface OnShakeListener {
|
||||
void onShake(int count);
|
||||
}
|
||||
}
|
||||
@@ -37,6 +37,7 @@ import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.hippo.ehviewer.R;
|
||||
|
||||
/**
|
||||
@@ -254,7 +255,7 @@ public abstract class DialogPreference extends Preference implements
|
||||
|
||||
mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE;
|
||||
|
||||
mBuilder = new AlertDialog.Builder(context)
|
||||
mBuilder = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(mDialogTitle)
|
||||
.setIcon(mDialogIcon)
|
||||
.setPositiveButton(mPositiveButtonText, this)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<color android:color="@android:color/white" />
|
||||
<color android:color="@android:color/system_neutral1_50" />
|
||||
</item>
|
||||
<item android:drawable="?android:attr/selectableItemBackground" />
|
||||
</layer-list>
|
||||
@@ -38,7 +38,6 @@
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/fab"
|
||||
style="@style/Widget.FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/corner_fab_margin"
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/fab"
|
||||
style="@style/Widget.FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/corner_fab_margin"
|
||||
|
||||
@@ -11,17 +11,13 @@
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/toolbarColor"
|
||||
android:elevation="4dp"
|
||||
android:fitsSystemWindows="true"
|
||||
app:statusBarForeground="?colorPrimaryDark">
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:layout_width="match_parent"
|
||||
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
|
||||
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||
android:layout_width="match_parent" />
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
-->
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingLeft="?attr/dialogPreferredPadding"
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:background="?attr/galleryDetailHeaderBackgroundColor"
|
||||
android:elevation="4dp"
|
||||
app:fitsSystemWindowsInsets="top" />
|
||||
|
||||
@@ -49,7 +48,6 @@
|
||||
android:id="@+id/header_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent"
|
||||
app:fitsSystemWindowsInsets="top">
|
||||
|
||||
<com.hippo.widget.LoadImageView
|
||||
@@ -70,7 +68,6 @@
|
||||
android:layout_toRightOf="@id/thumb"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="5"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/text_little_large" />
|
||||
|
||||
<TextView
|
||||
@@ -84,7 +81,6 @@
|
||||
android:background="?selectableItemBackground"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/text_little_small" />
|
||||
|
||||
<TextView
|
||||
|
||||
@@ -62,37 +62,36 @@
|
||||
app:fitsSystemWindowsInsets="bottom">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_check_all_dark_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_play_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_pause_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_delete_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_folder_move_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_close_dark_x24" />
|
||||
|
||||
@@ -44,46 +44,45 @@
|
||||
app:fitsSystemWindowsInsets="top|bottom">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_heart_box_dark_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_go_to_dark_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_refresh_dark_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
app:srcCompat="@drawable/v_download_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
app:srcCompat="@drawable/v_delete_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
app:fabSize="mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
app:srcCompat="@drawable/v_folder_move_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
|
||||
@@ -69,8 +69,7 @@
|
||||
android:maxHeight="112dp"
|
||||
android:minHeight="56dp"
|
||||
android:padding="@dimen/keyline_margin"
|
||||
android:textColor="?colorOnPrimarySurface"
|
||||
android:theme="@style/CommentEditText" />
|
||||
android:textColor="?colorOnPrimarySurface" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/send"
|
||||
@@ -95,7 +94,6 @@
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/Widget.FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/v_reply_dark_x24" />
|
||||
|
||||
@@ -51,25 +51,24 @@
|
||||
app:fitsSystemWindowsInsets="top|bottom">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:fabSize="mini"
|
||||
app:srcCompat="@drawable/v_magnify_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:fabSize="mini"
|
||||
app:srcCompat="@drawable/v_go_to_dark_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton.Accent.Mini"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:fabSize="mini"
|
||||
app:srcCompat="@drawable/v_refresh_dark_x24" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/Widget.FloatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
@@ -84,7 +83,6 @@
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/search_fab"
|
||||
style="@style/Widget.FloatingActionButton.Accent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleX="0"
|
||||
|
||||
@@ -24,16 +24,14 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true"
|
||||
android:background="?attr/toolbarColor"
|
||||
android:elevation="4dp"
|
||||
app:statusBarForeground="?colorPrimaryDark">
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
|
||||
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||
app:layout_scrollFlags="scroll|enterAlways|snap"/>
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<FrameLayout
|
||||
|
||||
@@ -20,9 +20,6 @@
|
||||
<!-- Base Theme -->
|
||||
<!-- ========== -->
|
||||
<style name="Base.AppTheme.Light" parent="Theme.Material3.Light">
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
<item name="android:colorBackground">@color/colorBackground</item>
|
||||
<item name="android:windowSplashScreenIconBackgroundColor" tools:targetApi="s">@color/ic_launcher_background</item>
|
||||
|
||||
@@ -61,9 +58,6 @@
|
||||
</style>
|
||||
|
||||
<style name="Base.AppTheme" parent="Theme.Material3.DayNight">
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/grey_875</item>
|
||||
<item name="colorAccent">@color/colorPrimary</item>
|
||||
<item name="colorControlActivated">@color/colorPrimary</item>
|
||||
<item name="android:colorBackground">@color/grey_850</item>
|
||||
<item name="android:windowSplashScreenIconBackgroundColor" tools:targetApi="s">@color/ic_launcher_background</item>
|
||||
@@ -109,8 +103,6 @@
|
||||
<style name="ThemeOverlay" />
|
||||
|
||||
<style name="ThemeOverlay.Black">
|
||||
<item name="colorPrimaryDark">@android:color/black</item>
|
||||
|
||||
<item name="android:colorBackground">@android:color/black</item>
|
||||
|
||||
<item name="android:textColorPrimary">@color/primary_text_material_black</item>
|
||||
@@ -143,25 +135,9 @@
|
||||
<!-- ============ -->
|
||||
<!-- Widget Theme -->
|
||||
<!-- ============ -->
|
||||
<style name="CommentEditText" parent="ThemeOverlay.Material3">
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@android:color/white</item>
|
||||
</style>
|
||||
|
||||
<style name="RatingBarTheme" parent="ThemeOverlay.Material3">
|
||||
<item name="colorControlNormal">@color/yellow_800</item>
|
||||
<item name="colorControlActivated">@color/yellow_800</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.FloatingActionButton" parent="Widget.Material3.FloatingActionButton.Tertiary">
|
||||
</style>
|
||||
|
||||
<style name="Widget.FloatingActionButton.Accent" parent="Widget.Material3.FloatingActionButton.Secondary">
|
||||
</style>
|
||||
|
||||
<style name="Widget.FloatingActionButton.Accent.Mini" parent="Widget.FloatingActionButton.Accent">
|
||||
<item name="fabSize">mini</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
@@ -33,7 +33,7 @@
|
||||
android:key="latest_release"
|
||||
android:title="@string/settings_about_latest_release"
|
||||
app:iconSpaceReserved="false"
|
||||
app:url="https://install.appcenter.ms/users/nekoinverter/apps/ehviewer/distribution_groups/public"
|
||||
app:url="https://github.com/asuka-mio/Ehviewer/releases"
|
||||
app:enableCopying="true" />
|
||||
|
||||
<!--<com.hippo.preference.UrlPreference
|
||||
@@ -46,7 +46,7 @@
|
||||
android:key="source"
|
||||
android:title="@string/settings_about_source"
|
||||
app:iconSpaceReserved="false"
|
||||
app:url="https://gitlab.com/NekoInverter/EhViewer"
|
||||
app:url="https://github.com/asuka-mio/Ehviewer"
|
||||
app:enableCopying="true" />
|
||||
|
||||
<!--<com.hippo.preference.UrlPreference
|
||||
|
||||
Executable → Regular
+4
-4
@@ -14,8 +14,8 @@
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<data-extraction-rules>
|
||||
<cloud-backup>
|
||||
|
||||
<string name="app_name">EhViewer Debug</string>
|
||||
|
||||
</resources>
|
||||
</cloud-backup>
|
||||
</data-extraction-rules>
|
||||
@@ -15,18 +15,4 @@
|
||||
app:iconSpaceReserved="false"
|
||||
app:summaryOff="@string/settings_privacy_secure_summary"
|
||||
app:summaryOn="@string/settings_privacy_secure_summary" />
|
||||
|
||||
<SwitchPreference
|
||||
app:iconSpaceReserved="false"
|
||||
android:key="enable_analytics"
|
||||
android:title="@string/settings_privacy_enable_analytics"
|
||||
android:defaultValue="true" />
|
||||
|
||||
<com.hippo.preference.MessagePreference
|
||||
android:key="about_analytics"
|
||||
android:title="@string/settings_privacy_about_analytics"
|
||||
app:iconSpaceReserved="false"
|
||||
app:dialogMessage="@string/analytics_explain"
|
||||
app:dialogMessageHtml="true"
|
||||
app:dialogMessageLinkify="true" />
|
||||
</PreferenceScreen>
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 Hippo Seven
|
||||
*
|
||||
* 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.hippo.database;
|
||||
|
||||
/*
|
||||
* Created by Hippo on 2017/9/4.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@Config(manifest = Config.NONE)
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class MSQLiteBuilderTest {
|
||||
|
||||
@Test
|
||||
public void testGetStatements() {
|
||||
MSQLiteBuilder builder = new MSQLiteBuilder()
|
||||
.version(1)
|
||||
.statement("11")
|
||||
.statement("12")
|
||||
.version(3)
|
||||
.statement("31")
|
||||
.statement("32");
|
||||
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add("31");
|
||||
list.add("32");
|
||||
assertEquals(list, builder.getStatements(1, 3));
|
||||
}
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer;
|
||||
|
||||
/*
|
||||
* Created by Hippo on 2018/3/22.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import android.util.Pair;
|
||||
import java.util.List;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@Config(manifest = Config.NONE)
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class HostsTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidHost() {
|
||||
assertTrue(Hosts.isValidHost("ni.hao"));
|
||||
assertFalse(Hosts.isValidHost("ni.ha~o"));
|
||||
assertFalse(Hosts.isValidHost(".ni.hao"));
|
||||
assertFalse(Hosts.isValidHost("ni.hao."));
|
||||
assertFalse(Hosts.isValidHost("ni..hao."));
|
||||
assertFalse(Hosts.isValidHost("."));
|
||||
assertFalse(Hosts.isValidHost(""));
|
||||
assertFalse(Hosts.isValidHost(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsValidIp() {
|
||||
assertTrue(Hosts.isValidIp("127.0.0.1"));
|
||||
assertTrue(Hosts.isValidIp("0.0.0.0"));
|
||||
assertFalse(Hosts.isValidIp("324.0.0.1"));
|
||||
assertFalse(Hosts.isValidIp("127.0.0."));
|
||||
assertFalse(Hosts.isValidIp("127.0.0"));
|
||||
assertFalse(Hosts.isValidIp("-1.0.0"));
|
||||
assertFalse(Hosts.isValidIp(""));
|
||||
assertFalse(Hosts.isValidIp(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGet() {
|
||||
Hosts hosts = new Hosts(RuntimeEnvironment.application, "hosts.db");
|
||||
|
||||
assertEquals(null, hosts.get("ni.hao"));
|
||||
hosts.put("ni.hao", "127.0.0.1");
|
||||
assertEquals("ni.hao/127.0.0.1", hosts.get("ni.hao").toString());
|
||||
|
||||
assertEquals(null, hosts.get(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPut() {
|
||||
Hosts hosts = new Hosts(RuntimeEnvironment.application, "hosts.db");
|
||||
|
||||
assertEquals(null, hosts.get("ni.hao"));
|
||||
assertEquals(true, hosts.put("ni.hao", "127.0.0.1"));
|
||||
assertEquals("ni.hao/127.0.0.1", hosts.get("ni.hao").toString());
|
||||
assertEquals(true, hosts.put("ni.hao", "127.0.0.2"));
|
||||
assertEquals("ni.hao/127.0.0.2", hosts.get("ni.hao").toString());
|
||||
|
||||
assertEquals(false, hosts.put(".wo.hao", "127.0.0.1"));
|
||||
assertEquals(null, hosts.get(".wo.hao"));
|
||||
|
||||
assertEquals(false, hosts.put("wo.hao", ".127.0.0.1"));
|
||||
assertEquals(null, hosts.get("wo.hao"));
|
||||
|
||||
assertEquals(false, hosts.put(null, "127.0.0.1"));
|
||||
assertEquals(false, hosts.put("wo.hao", null));
|
||||
assertEquals(false, hosts.put(null, null));
|
||||
assertEquals(null, hosts.get("wo.hao"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDelete() {
|
||||
Hosts hosts = new Hosts(RuntimeEnvironment.application, "hosts.db");
|
||||
|
||||
hosts.put("ni.hao", "127.0.0.1");
|
||||
assertEquals("ni.hao/127.0.0.1", hosts.get("ni.hao").toString());
|
||||
hosts.put("ni.hao", "127.0.0.2");
|
||||
hosts.delete("ni.hao");
|
||||
assertEquals(null, hosts.get("ni.hao"));
|
||||
|
||||
hosts.delete(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAll() {
|
||||
Hosts hosts = new Hosts(RuntimeEnvironment.application, "hosts.db");
|
||||
|
||||
List<Pair<String, String>> all = hosts.getAll();
|
||||
assertEquals(0, all.size());
|
||||
|
||||
hosts.put("ni.hao", "127.0.0.1");
|
||||
hosts.put("wo.hao", "127.0.0.2");
|
||||
|
||||
all = hosts.getAll();
|
||||
assertEquals(2, all.size());
|
||||
|
||||
assertEquals("ni.hao", all.get(0).first);
|
||||
assertEquals("127.0.0.1", all.get(0).second);
|
||||
assertEquals("wo.hao", all.get(1).first);
|
||||
assertEquals("127.0.0.2", all.get(1).second);
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.client;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import okio.BufferedSource;
|
||||
import okio.Okio;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@Config(manifest = Config.NONE)
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class EhTagDatabaseTest {
|
||||
|
||||
@Test
|
||||
public void readTheList() throws IOException {
|
||||
InputStream resource = EhTagDatabaseTest.class.getResourceAsStream("EhTagDatabaseTest");
|
||||
|
||||
EhTagDatabase db;
|
||||
try (BufferedSource source = Okio.buffer(Okio.source(resource))) {
|
||||
db = new EhTagDatabase("EhTagDatabaseTest", source);
|
||||
}
|
||||
|
||||
assertEquals("a", db.getTranslation("1"));
|
||||
assertEquals("ab", db.getTranslation("12"));
|
||||
assertEquals("abc", db.getTranslation("123"));
|
||||
assertEquals("abcd", db.getTranslation("1234"));
|
||||
assertEquals("1", db.getTranslation("a"));
|
||||
assertEquals("12", db.getTranslation("ab"));
|
||||
assertEquals("123", db.getTranslation("abc"));
|
||||
assertEquals("1234", db.getTranslation("abcd"));
|
||||
assertNull(db.getTranslation("21"));
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.client.parser;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
||||
@RunWith(Parameterized.class)
|
||||
public class GalleryDetailUrlParserTest {
|
||||
|
||||
@Parameterized.Parameters
|
||||
public static Collection<Object[]> data() {
|
||||
return Arrays.asList(new Object[][] {
|
||||
{ "https://e-hentai.org/g/530350/8b3c7e4a21/", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "https://exhentai.org/g/530350/8b3c7e4a21/", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "https://lofi.e-hentai.org/g/530350/8b3c7e4a21/", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "https://e-hentai.org/mpv/530350/8b3c7e4a21/", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "https://exhentai.org/mpv/530350/8b3c7e4a21/", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "https://lofi.e-hentai.org/mpv/530350/8b3c7e4a21/", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "https://e-hentai.org/mpv/530350/8b3c7e4a21/#page1", true, false, 530350, "8b3c7e4a21" },
|
||||
{ "530350/8b3c7e4a21/#page1", true, true, 0, null },
|
||||
|
||||
{ "530350/8b3c7e4a21", false, false, 530350, "8b3c7e4a21" },
|
||||
{ "g/530350/8b3c7e4a21", false, false, 530350, "8b3c7e4a21" },
|
||||
{ "530350b/8b3c7e4a21", false, true, 0, null },
|
||||
{ "530350/8b3c7e4a211", false, true, 0, null },
|
||||
});
|
||||
}
|
||||
|
||||
private String url;
|
||||
private boolean strict;
|
||||
private boolean isNull;
|
||||
private long gid;
|
||||
private String token;
|
||||
|
||||
public GalleryDetailUrlParserTest(String url, boolean strict, boolean isNull, long gid, String token) {
|
||||
this.url = url;
|
||||
this.strict = strict;
|
||||
this.isNull = isNull;
|
||||
this.gid = gid;
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParse() {
|
||||
GalleryDetailUrlParser.Result result = GalleryDetailUrlParser.parse(url, strict);
|
||||
if (isNull) {
|
||||
assertNull(result);
|
||||
} else {
|
||||
assertEquals(gid, result.gid);
|
||||
assertEquals(token, result.token);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.client.parser;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import com.hippo.ehviewer.client.EhUtils;
|
||||
import edu.emory.mathcs.backport.java.util.Arrays;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import okio.BufferedSource;
|
||||
import okio.Okio;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.ParameterizedRobolectricTestRunner;
|
||||
|
||||
@RunWith(ParameterizedRobolectricTestRunner.class)
|
||||
public class GalleryListParserTest {
|
||||
|
||||
private static final String E_MINIMAL = "GalleryListParserTestEMinimal.html";
|
||||
private static final String E_MINIMAL_PLUS = "GalleryListParserTestEMinimalPlus.html";
|
||||
private static final String E_COMPAT = "GalleryListParserTestECompat.html";
|
||||
private static final String E_EXTENDED = "GalleryListParserTestEExtended.html";
|
||||
private static final String E_THUMBNAIL = "GalleryListParserTestEThumbnail.html";
|
||||
|
||||
private static final String EX_MINIMAL = "GalleryListParserTestExMinimal.html";
|
||||
private static final String EX_MINIMAL_PLUS = "GalleryListParserTestExMinimalPlus.html";
|
||||
private static final String EX_COMPAT = "GalleryListParserTestExCompat.html";
|
||||
private static final String EX_EXTENDED = "GalleryListParserTestExExtended.html";
|
||||
private static final String EX_THUMBNAIL = "GalleryListParserTestExThumbnail.html";
|
||||
|
||||
@ParameterizedRobolectricTestRunner.Parameters(name = "{index}-{0}")
|
||||
public static List data() {
|
||||
return Arrays.asList(new Object[][] {
|
||||
{ E_MINIMAL },
|
||||
{ E_MINIMAL_PLUS },
|
||||
{ E_COMPAT },
|
||||
{ E_EXTENDED },
|
||||
{ E_THUMBNAIL },
|
||||
{ EX_MINIMAL },
|
||||
{ EX_MINIMAL_PLUS },
|
||||
{ EX_COMPAT },
|
||||
{ EX_EXTENDED },
|
||||
{ EX_THUMBNAIL },
|
||||
});
|
||||
}
|
||||
|
||||
private String file;
|
||||
|
||||
public GalleryListParserTest(String file) {
|
||||
this.file = file;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParse() throws Exception {
|
||||
InputStream resource = GalleryPageApiParserTest.class.getResourceAsStream(file);
|
||||
BufferedSource source = Okio.buffer(Okio.source(resource));
|
||||
String body = source.readUtf8();
|
||||
|
||||
GalleryListParser.Result result = GalleryListParser.parse(body);
|
||||
|
||||
assertEquals(25, result.galleryInfoList.size());
|
||||
|
||||
result.galleryInfoList.forEach(gi -> {
|
||||
assertNotEquals(0, gi.gid);
|
||||
assertNotEquals(0, gi.token);
|
||||
assertNotNull(gi.title);
|
||||
|
||||
//assertNotNull(gi.simpleTags);
|
||||
|
||||
assertNotEquals(0, gi.category);
|
||||
assertNotEquals(EhUtils.UNKNOWN, gi.category);
|
||||
assertNotEquals(0, gi.thumbWidth);
|
||||
assertNotEquals(0, gi.thumbHeight);
|
||||
assertNotNull(gi.thumb);
|
||||
assertNotNull(gi.posted);
|
||||
assertNotEquals(0.0, gi.rating);
|
||||
if (E_MINIMAL.equals(file) ||
|
||||
E_MINIMAL_PLUS.equals(file) ||
|
||||
E_COMPAT.equals(file) ||
|
||||
E_EXTENDED.equals(file) ||
|
||||
EX_MINIMAL.equals(file) ||
|
||||
EX_MINIMAL_PLUS.equals(file) ||
|
||||
EX_COMPAT.equals(file) ||
|
||||
EX_EXTENDED.equals(file)) {
|
||||
assertNotNull(gi.uploader);
|
||||
} else {
|
||||
assertNull(gi.uploader);
|
||||
}
|
||||
assertNotEquals(0, gi.pages);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.client.parser;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import com.hippo.ehviewer.client.exception.ParseException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import okio.BufferedSource;
|
||||
import okio.Okio;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@Config(manifest = Config.NONE)
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class GalleryPageApiParserTest {
|
||||
|
||||
@Test
|
||||
public void testParse() throws IOException, ParseException {
|
||||
InputStream resource = GalleryPageApiParserTest.class.getResourceAsStream("GalleryPageApiParserTest.json");
|
||||
BufferedSource source = Okio.buffer(Okio.source(resource));
|
||||
String body = source.readUtf8();
|
||||
|
||||
GalleryPageApiParser.Result result = GalleryPageApiParser.parse(body);
|
||||
assertEquals("http://69.30.203.46:60111/h/6047fa2f194742f6fa541ec1f631ec3ab438f960-183117-1280-960-jpg/keystamp=1550291100-c4438f48c8;fileindex=67379169;xres=1280/Valentines_2019_002.jpg", result.imageUrl);
|
||||
assertEquals("15151-430636", result.skipHathKey);
|
||||
assertEquals("https://e-hentai.org/fullimg.php?gid=1366222&page=3&key=puxxvyg98a4", result.originImageUrl);
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.client.parser;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import com.hippo.ehviewer.client.exception.ParseException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import okio.BufferedSource;
|
||||
import okio.Okio;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@Config(manifest = Config.NONE)
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class GalleryPageParserTest {
|
||||
|
||||
@Test
|
||||
public void testParse() throws IOException, ParseException {
|
||||
InputStream resource = GalleryPageParserTest.class.getResourceAsStream("GalleryPageParserTest.html");
|
||||
BufferedSource source = Okio.buffer(Okio.source(resource));
|
||||
String body = source.readUtf8();
|
||||
|
||||
GalleryPageParser.Result result = GalleryPageParser.parse(body);
|
||||
assertEquals("http://108.6.41.160:2688/h/5c63e9a5810d8d9c873d9e0dfaadc4a0d70a13bf-188862-1280-879-jpg/keystamp=1550291700-145ecbbb10;fileindex=67290651;xres=1280/10.jpg", result.imageUrl);
|
||||
assertEquals("26664-430636", result.skipHathKey);
|
||||
assertEquals("https://e-hentai.org/fullimg.php?gid=1363978&page=10&key=qt2hwrx98a4", result.originImageUrl);
|
||||
assertEquals("ghz0e5m98a4", result.showKey);
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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.hippo.ehviewer.client.parser;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
||||
@RunWith(Parameterized.class)
|
||||
public class GalleryPageUrlParserTest {
|
||||
|
||||
@Parameterized.Parameters
|
||||
public static Collection<Object[]> data() {
|
||||
return Arrays.asList(new Object[][] {
|
||||
{ "https://e-hentai.org/s/7b87643838/530350-1", true, false, 530350, "7b87643838", 0},
|
||||
{ "https://exhentai.org/s/7b87643838/530350-1", true, false, 530350, "7b87643838", 0},
|
||||
{ "7b87643838/530350-1", true, true, 0, null, 0},
|
||||
|
||||
{ "7b87643838/530350-1", false, false, 530350, "7b87643838", 0},
|
||||
{ "s/7b87643838/530350-1", false, false, 530350, "7b87643838", 0},
|
||||
{ "7b87643838/530350a-1", false, true, 0, null, 0},
|
||||
});
|
||||
}
|
||||
|
||||
private String url;
|
||||
private boolean strict;
|
||||
private boolean isNull;
|
||||
private long gid;
|
||||
private String pToken;
|
||||
private int page;
|
||||
|
||||
public GalleryPageUrlParserTest(String url, boolean strict, boolean isNull, long gid, String pToken, int page) {
|
||||
this.url = url;
|
||||
this.strict = strict;
|
||||
this.isNull = isNull;
|
||||
this.gid = gid;
|
||||
this.pToken = pToken;
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParse() {
|
||||
GalleryPageUrlParser.Result result = GalleryPageUrlParser.parse(url, strict);
|
||||
if (isNull) {
|
||||
assertNull(result);
|
||||
} else {
|
||||
assertEquals(gid, result.gid);
|
||||
assertEquals(pToken, result.pToken);
|
||||
assertEquals(page, result.page);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,336 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 Hippo Seven
|
||||
*
|
||||
* 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.hippo.network;
|
||||
|
||||
/*
|
||||
* Created by Hippo on 2017/9/4.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import android.content.Context;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import okhttp3.Cookie;
|
||||
import okhttp3.HttpUrl;
|
||||
import org.joor.Reflect;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@Config(manifest = Config.NONE)
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class CookieRepositoryTest {
|
||||
|
||||
private void equals(CookieSet cookieSet, List<Cookie> cookies) {
|
||||
assertNotNull(cookieSet);
|
||||
assertNotNull(cookies);
|
||||
|
||||
Map<CookieSet.Key, Cookie> map = Reflect.on(cookieSet).field("map").get();
|
||||
assertEquals(cookies.size(), map.size());
|
||||
for (Cookie cookie: cookies) {
|
||||
assertEquals(cookie, map.get(new CookieSet.Key(cookie)));
|
||||
}
|
||||
}
|
||||
|
||||
private void equals(List<Cookie> cookies1, List<Cookie> cookies2) {
|
||||
assertNotNull(cookies1);
|
||||
assertNotNull(cookies2);
|
||||
|
||||
assertEquals(cookies1.size(), cookies2.size());
|
||||
for (Cookie cookie: cookies1) {
|
||||
assertTrue(cookies2.contains(cookie));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPersistent() {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl urlEh = HttpUrl.parse("http://www.ehviewer.com/");
|
||||
Cookie cookieEh1 = new Cookie.Builder()
|
||||
.name("user")
|
||||
.value("1234567890")
|
||||
.domain("ehviewer.com")
|
||||
.path("/")
|
||||
.build();
|
||||
Cookie cookieEh2 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("999")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.build();
|
||||
Cookie cookieEh3 = new Cookie.Builder()
|
||||
.name("speed")
|
||||
.value("10")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.build();
|
||||
|
||||
HttpUrl urlNMB = HttpUrl.parse("http://h.nimingban.com/");
|
||||
Cookie cookieNMB = new Cookie.Builder()
|
||||
.name("hash")
|
||||
.value("0987654321")
|
||||
.domain("nimingban.com")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.path("/")
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(urlEh, Arrays.asList(cookieEh1, cookieEh2, cookieEh3));
|
||||
repository.saveFromResponse(urlNMB, Collections.singletonList(cookieNMB));
|
||||
|
||||
Map<String, CookieSet> map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(3, map.size());
|
||||
equals(map.get("ehviewer.com"), Collections.singletonList(cookieEh1));
|
||||
equals(map.get("www.ehviewer.com"), Arrays.asList(cookieEh2, cookieEh3));
|
||||
equals(map.get("nimingban.com"), Collections.singletonList(cookieNMB));
|
||||
repository.close();
|
||||
|
||||
repository = new CookieRepository(app, "cookie.db");
|
||||
map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(2, map.size());
|
||||
equals(map.get("www.ehviewer.com"), Arrays.asList(cookieEh2, cookieEh3));
|
||||
equals(map.get("nimingban.com"), Collections.singletonList(cookieNMB));
|
||||
repository.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdate() {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl urlEh = HttpUrl.parse("http://www.ehviewer.com/");
|
||||
Cookie cookieEh1 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("999")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.build();
|
||||
Cookie cookieEh2 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("0")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(urlEh, Collections.singletonList(cookieEh1));
|
||||
repository.saveFromResponse(urlEh, Collections.singletonList(cookieEh2));
|
||||
Map<String, CookieSet> map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(1, map.size());
|
||||
equals(map.get("www.ehviewer.com"), Collections.singletonList(cookieEh2));
|
||||
repository.close();
|
||||
|
||||
repository = new CookieRepository(app, "cookie.db");
|
||||
map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(1, map.size());
|
||||
equals(map.get("www.ehviewer.com"), Collections.singletonList(cookieEh2));
|
||||
repository.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveByExpired() {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl urlEh = HttpUrl.parse("http://www.ehviewer.com/");
|
||||
Cookie cookieEh1 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("999")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.build();
|
||||
Cookie cookieEh2 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("0")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() - 100000)
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(urlEh, Collections.singletonList(cookieEh1));
|
||||
repository.saveFromResponse(urlEh, Collections.singletonList(cookieEh2));
|
||||
Map<String, CookieSet> map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(1, map.size());
|
||||
equals(map.get("www.ehviewer.com"), Collections.<Cookie>emptyList());
|
||||
repository.close();
|
||||
|
||||
repository = new CookieRepository(app, "cookie.db");
|
||||
map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(0, map.size());
|
||||
repository.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveByNonPersistent() {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl urlEh = HttpUrl.parse("http://www.ehviewer.com/");
|
||||
Cookie cookieEh1 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("999")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 100000)
|
||||
.build();
|
||||
Cookie cookieEh2 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("0")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(urlEh, Collections.singletonList(cookieEh1));
|
||||
repository.saveFromResponse(urlEh, Collections.singletonList(cookieEh2));
|
||||
Map<String, CookieSet> map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(1, map.size());
|
||||
equals(map.get("www.ehviewer.com"), Collections.singletonList(cookieEh2));
|
||||
repository.close();
|
||||
|
||||
|
||||
repository = new CookieRepository(app, "cookie.db");
|
||||
map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(0, map.size());
|
||||
repository.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGet() throws InterruptedException {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl urlEh1 = HttpUrl.parse("http://www.ehviewer.com/");
|
||||
HttpUrl urlEh2 = HttpUrl.parse("http://ehviewer.com/");
|
||||
Cookie cookieEh1 = new Cookie.Builder()
|
||||
.name("user")
|
||||
.value("1234567890")
|
||||
.domain("ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 3000)
|
||||
.build();
|
||||
Cookie cookieEh2 = new Cookie.Builder()
|
||||
.name("level")
|
||||
.value("999")
|
||||
.domain("www.ehviewer.com")
|
||||
.path("/")
|
||||
.build();
|
||||
Cookie cookieEh3 = new Cookie.Builder()
|
||||
.name("speed")
|
||||
.value("10")
|
||||
.domain("ehviewer.com")
|
||||
.path("/")
|
||||
.build();
|
||||
|
||||
HttpUrl urlNMB = HttpUrl.parse("http://h.nimingban.com/");
|
||||
Cookie cookieNMB = new Cookie.Builder()
|
||||
.name("hash")
|
||||
.value("0987654321")
|
||||
.domain("nimingban.com")
|
||||
.path("/")
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(urlEh1, Arrays.asList(cookieEh1, cookieEh2));
|
||||
repository.saveFromResponse(urlEh1, Collections.singletonList(cookieEh3));
|
||||
repository.saveFromResponse(urlNMB, Collections.singletonList(cookieNMB));
|
||||
equals(Arrays.asList(cookieEh1, cookieEh3), repository.loadForRequest(null));
|
||||
Thread.sleep(3000);
|
||||
equals(Collections.singletonList(cookieEh3), repository.loadForRequest(null));
|
||||
repository.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClear() {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl url = HttpUrl.parse("http://www.ehviewer.com/");
|
||||
Cookie cookie = new Cookie.Builder()
|
||||
.name("user")
|
||||
.value("1234567890")
|
||||
.domain("ehviewer.com")
|
||||
.path("/")
|
||||
.expiresAt(System.currentTimeMillis() + 3000)
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(url, Collections.singletonList(cookie));
|
||||
Map<String, CookieSet> map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(1, map.size());
|
||||
equals(map.get("ehviewer.com"), Collections.singletonList(cookie));
|
||||
repository.clear();
|
||||
map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(0, map.size());
|
||||
repository.close();
|
||||
|
||||
repository = new CookieRepository(app, "cookie.db");
|
||||
map = Reflect.on(repository).field("map").get();
|
||||
assertEquals(0, map.size());
|
||||
repository.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSort() {
|
||||
Context app = RuntimeEnvironment.application;
|
||||
|
||||
HttpUrl url = HttpUrl.parse("http://www.ehviewer.com/long/long/long/");
|
||||
Cookie cookie1 = new Cookie.Builder()
|
||||
.name("user")
|
||||
.value("1234567890")
|
||||
.domain("ehviewer.com")
|
||||
.path("/")
|
||||
.build();
|
||||
Cookie cookie2 = new Cookie.Builder()
|
||||
.name("supersuperme")
|
||||
.value("99999")
|
||||
.domain("ehviewer.com")
|
||||
.path("/long/")
|
||||
.build();
|
||||
Cookie cookie3 = new Cookie.Builder()
|
||||
.name("a")
|
||||
.value("b")
|
||||
.domain("ehviewer.com")
|
||||
.path("/long/long/long/")
|
||||
.build();
|
||||
Cookie cookie4 = new Cookie.Builder()
|
||||
.name("speed")
|
||||
.value("100")
|
||||
.domain("ehviewer.com")
|
||||
.path("/long/long/")
|
||||
.build();
|
||||
|
||||
CookieRepository repository = new CookieRepository(app, "cookie.db");
|
||||
repository.saveFromResponse(url, Arrays.asList(cookie1, cookie2, cookie3, cookie4));
|
||||
List<Cookie> list = repository.loadForRequest(null);
|
||||
List<Cookie> expected = Arrays.asList(cookie3, cookie4, cookie2, cookie1);
|
||||
assertEquals(expected.size(), list.size());
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
assertEquals(expected.get(i), list.get(i));
|
||||
}
|
||||
repository.close();
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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.hippo.util;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class NaturalComparatorTest {
|
||||
|
||||
@Test
|
||||
public void testOrder() {
|
||||
assertOrder("1", "2");
|
||||
assertOrder("2", "11");
|
||||
assertOrder("2", "00011");
|
||||
|
||||
assertOrder("a2", "a11");
|
||||
assertOrder("a2a", "a11a");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEquals() {
|
||||
assertEquals("2", "2");
|
||||
assertEquals("11", "11");
|
||||
assertEquals("a11", "a11");
|
||||
assertEquals("a2", "a2");
|
||||
assertEquals("a2a", "a2a");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmpty() {
|
||||
assertOrder("", "1");
|
||||
assertEquals("", "");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNull() {
|
||||
assertEquals(null, null);
|
||||
assertOrder(null, "1");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBigNumber() {
|
||||
assertOrder("1", "22222222222222222222222222222222222222222222222222222222222222222222222");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLeadingZero() {
|
||||
assertOrder("000000000000000001", "1");
|
||||
assertOrder("000000000000000001", "0001");
|
||||
assertOrder("00000000000000000", "0");
|
||||
assertOrder("00000000000000000", "000");
|
||||
}
|
||||
|
||||
private void assertOrder(String s1, String s2) {
|
||||
NaturalComparator comparator = new NaturalComparator();
|
||||
assertTrue(comparator.compare(s1, s2) < 0);
|
||||
assertTrue(comparator.compare(s2, s1) > 0);
|
||||
}
|
||||
|
||||
private void assertEquals(String s1, String s2) {
|
||||
NaturalComparator comparator = new NaturalComparator();
|
||||
Assert.assertEquals(0, comparator.compare(s1, s2));
|
||||
Assert.assertEquals(0, comparator.compare(s2, s1));
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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.hippo.util;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class PathNaturalComparatorTest {
|
||||
|
||||
@Test
|
||||
public void testOrder() {
|
||||
assertOrder("ab/d", "abcd");
|
||||
assertOrder("ab\\d", "abcd");
|
||||
|
||||
assertOrder("ab/d2", "ab/d11");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEquals() {
|
||||
assertEquals("/abc", "abc");
|
||||
assertEquals("/abc", "\\abc");
|
||||
assertEquals("abc", "\\abc");
|
||||
assertEquals("abc///", "abc");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmpty() {
|
||||
assertOrder("", "1");
|
||||
assertEquals("", "");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNull() {
|
||||
assertEquals(null, null);
|
||||
assertOrder(null, "1");
|
||||
}
|
||||
|
||||
private void assertOrder(String s1, String s2) {
|
||||
PathNaturalComparator comparator = new PathNaturalComparator();
|
||||
assertTrue(comparator.compare(s1, s2) < 0);
|
||||
assertTrue(comparator.compare(s2, s1) > 0);
|
||||
}
|
||||
|
||||
private void assertEquals(String s1, String s2) {
|
||||
PathNaturalComparator comparator = new PathNaturalComparator();
|
||||
Assert.assertEquals(0, comparator.compare(s1, s2));
|
||||
Assert.assertEquals(0, comparator.compare(s2, s1));
|
||||
}
|
||||
}
|
||||
Binary file not shown.
-33
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>E-Hentai Galleries - The Free Hentai Doujinshi, Manga and Image Gallery System</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0347/g.css" />
|
||||
<meta name="description" content="With more than half a million absolutely free hentai doujinshi, manga, cosplay and CG galleries, E-Hentai Galleries is the world's largest free Hentai archive." />
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
<meta name="juicyads-site-verification" content="0f3e47704e352bf534e98d4d45411fda" />
|
||||
<link rel="alternate" type="application/atom+xml" title="E-Hentai Galleries Content Feed" href="https://e-hentai.org/rss/ehg.xml" />
|
||||
<link rel="alternate" type="application/atom+xml" title="EHTracker Torrent Feed" href="https://e-hentai.org/rss/ehtracker.xml" />
|
||||
<link rel="search" href="https://ehgt.org/g/opensearchdescription.xml" type="application/opensearchdescription+xml" title="E-Hentai Galleries Search" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://e-hentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://e-hentai.org/watched">Watched</a></div><div><a href="https://e-hentai.org/popular">Popular</a></div><div><a href="https://e-hentai.org/torrents.php">Torrents</a></div><div><a href="https://e-hentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://e-hentai.org/home.php"><span class="nbw2">My </span>Home</a></div><div><a href="https://upload.e-hentai.org/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://e-hentai.org/toplist.php">Toplists</a></div><div><a href="https://e-hentai.org/bounty.php">Bounties</a></div><div><a href="https://e-hentai.org/news.php">News</a></div><div><a href="https://forums.e-hentai.org/">Forums</a></div><div><a href="https://ehwiki.org/">Wiki</a></div><div><a href="https://hentaiverse.org/" onclick="popUp('https://hentaiverse.org/',1250,720); return false">H<span class="nbw1">entai</span>V<span class="nbw1">erse</span></a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<h1 class="ih">E-Hentai Galleries: The Free Hentai Doujinshi, Manga and Image Gallery System</h1><div id="searchbox" class="idi"><form action="https://e-hentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://e-hentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://e-hentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://upload.e-hentai.org/";
|
||||
var getrowurl = "https://e-hentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 48,197 results</p><div id="dms"><div><select onchange="document.location='https://e-hentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p">Minimal+</option><option value="l" selected="selected">Compact</option><option value="e">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://e-hentai.org/?f_cats=767&from=1391690" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1928)', 1); if(page != null) document.location='https://e-hentai.org/?page='+Math.min(1927, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1927&f_cats=767" onclick="return false">1928</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg gltc"><tr><th></th><th>Published</th><th>Title</th><th class="glhide">Uploader</th></tr><tr data-new="1"><td class="gl1c glcat"><div class="cn ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div></td><td class="gl2c"><div class="glcut" id="ic1392268"></div><div class="glthumb" id="it1392268" style="top:-22px;height:399px"><div><img style="height:353px;width:250px;top:-6px" alt="[NekoNiwa] Stomach-filling Activity" title="[NekoNiwa] Stomach-filling Activity" src="https://ul.ehgt.org/dc/ad/dcad4eda683c3fa6422737048171330dcf1215cd-753622-2150-3035-jpg_250.jpg" /></div><div><div><div class="cn ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="postedpop_1392268">2019-04-03 10:59</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div></div></div></div><div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="posted_1392268">2019-04-03 10:59</div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></div></td><td class="gl3c glname" onmouseover="show_image_pane(1392268);preload_pane_image(0,1392267)" onmouseout="hide_image_pane(1392268)"><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><div class="glink">[NekoNiwa] Stomach-filling Activity</div><div><div class="gt" title="parody:kantai collection">kantai collection</div></div></a></td><td class="gl4c glhide"><div><a href="https://e-hentai.org/uploader/maverih345456">maverih345456</a></div><div>26 pages</div></td></tr><tr data-new="1"><td class="gl1c glcat"><div class="cn ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div></td><td class="gl2c"><div class="glcut" id="ic1392267"></div><div class="glthumb" id="it1392267" style="top:-35px;height:404px"><div><img style="height:358px;width:250px;top:-9px" alt="[NekoNiwa] Ritoseikatsu" title="[NekoNiwa] Ritoseikatsu" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://ul.ehgt.org/5e/5d/5e5d4aaaccea1061ad49f0818a7c687a78271064-730707-2153-3080-jpg_250.jpg" /></div><div><div><div class="cn ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="postedpop_1392267">2019-04-03 10:58</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div></div></div></div><div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="posted_1392267">2019-04-03 10:58</div><div class="ir" style="background-position:-80Line truncated
|
||||
</body>
|
||||
</html>
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>E-Hentai Galleries - The Free Hentai Doujinshi, Manga and Image Gallery System</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0347/g.css" />
|
||||
<meta name="description" content="With more than half a million absolutely free hentai doujinshi, manga, cosplay and CG galleries, E-Hentai Galleries is the world's largest free Hentai archive." />
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
<meta name="juicyads-site-verification" content="0f3e47704e352bf534e98d4d45411fda" />
|
||||
<link rel="alternate" type="application/atom+xml" title="E-Hentai Galleries Content Feed" href="https://e-hentai.org/rss/ehg.xml" />
|
||||
<link rel="alternate" type="application/atom+xml" title="EHTracker Torrent Feed" href="https://e-hentai.org/rss/ehtracker.xml" />
|
||||
<link rel="search" href="https://ehgt.org/g/opensearchdescription.xml" type="application/opensearchdescription+xml" title="E-Hentai Galleries Search" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://e-hentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://e-hentai.org/watched">Watched</a></div><div><a href="https://e-hentai.org/popular">Popular</a></div><div><a href="https://e-hentai.org/torrents.php">Torrents</a></div><div><a href="https://e-hentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://e-hentai.org/home.php"><span class="nbw2">My </span>Home</a></div><div><a href="https://upload.e-hentai.org/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://e-hentai.org/toplist.php">Toplists</a></div><div><a href="https://e-hentai.org/bounty.php">Bounties</a></div><div><a href="https://e-hentai.org/news.php">News</a></div><div><a href="https://forums.e-hentai.org/">Forums</a></div><div><a href="https://ehwiki.org/">Wiki</a></div><div><a href="https://hentaiverse.org/" onclick="popUp('https://hentaiverse.org/',1250,720); return false">H<span class="nbw1">entai</span>V<span class="nbw1">erse</span></a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<h1 class="ih">E-Hentai Galleries: The Free Hentai Doujinshi, Manga and Image Gallery System</h1><div id="searchbox" class="idi"><form action="https://e-hentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://e-hentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://e-hentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://upload.e-hentai.org/";
|
||||
var getrowurl = "https://e-hentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 48,197 results</p><div id="dms"><div><select onchange="document.location='https://e-hentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p">Minimal+</option><option value="l">Compact</option><option value="e" selected="selected">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://e-hentai.org/?f_cats=767&from=1391690" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1928)', 1); if(page != null) document.location='https://e-hentai.org/?page='+Math.min(1927, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1927&f_cats=767" onclick="return false">1928</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg glte"><tr data-new="1"><td class="gl1e" style="width:250px"><div style="height:340px;width:250px"><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><img style="height:353px;width:250px;top:-6px" alt="[NekoNiwa] Stomach-filling Activity" title="[NekoNiwa] Stomach-filling Activity" src="https://ul.ehgt.org/dc/ad/dcad4eda683c3fa6422737048171330dcf1215cd-753622-2150-3035-jpg_250.jpg" /></a></div></td><td class="gl2e"><div><div class="gl3e"><div class="cn ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="posted_1392268">2019-04-03 10:59</div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div><a href="https://e-hentai.org/uploader/maverih345456">maverih345456</a></div><div>26 pages</div><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></div><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><div class="gl4e glname" style="min-height:348px"><div class="glink">[NekoNiwa] Stomach-filling Activity</div><div><table><tr><td class="tc">parody:</td><td><div class="gtl" title="parody:kantai collection">kantai collection</div></td></table></div></div></a></div></td></tr><tr data-new="1"><td class="gl1e" style="width:250px"><div style="height:340px;width:250px"><a href="https://e-hentai.org/g/1392267/549353a6c6/"><img style="height:358px;width:250px;top:-9px" alt="[NekoNiwa] Ritoseikatsu" title="[NekoNiwa] Ritoseikatsu" src="https://ul.ehgt.org/5e/5d/5e5d4aaaccea1061ad49f0818a7c687a78271064-730707-2153-3080-jpg_250.jpg" /></a></div></td><td class="gl2e"><div><div class="gl3e"><div class="cn ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="posted_1392267">2019-04-03 10:58</div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div><a href="https://e-hentai.org/uploader/maverih345456">maverih345456</a></div><div>26 pages</div><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></div><a href="https://e-hentai.org/g/1392267/549353a6c6/"><div class="gl4e glname" style="min-height:348px"><div class="glink">[NekoNiwa] Ritoseikatsu</div><div><table><tr><td class="tc">parody:</td><td><div class="gt" title="parody:kantai collection">kantai collection</div></td><tr><td class="tc">female:</td><td><div class="gtl" title="female:glasses">glasses</div></td></table></div></div></a></div></td></tr><tr><td class="gl1e" style="width:250px"><div style="height:340px;width:250px"><a href="https://e-hentai.org/g/1392234/6ca336fe6d/"><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [AoiLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>E-Hentai Galleries - The Free Hentai Doujinshi, Manga and Image Gallery System</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0347/g.css" />
|
||||
<meta name="description" content="With more than half a million absolutely free hentai doujinshi, manga, cosplay and CG galleries, E-Hentai Galleries is the world's largest free Hentai archive." />
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
<meta name="juicyads-site-verification" content="0f3e47704e352bf534e98d4d45411fda" />
|
||||
<link rel="alternate" type="application/atom+xml" title="E-Hentai Galleries Content Feed" href="https://e-hentai.org/rss/ehg.xml" />
|
||||
<link rel="alternate" type="application/atom+xml" title="EHTracker Torrent Feed" href="https://e-hentai.org/rss/ehtracker.xml" />
|
||||
<link rel="search" href="https://ehgt.org/g/opensearchdescription.xml" type="application/opensearchdescription+xml" title="E-Hentai Galleries Search" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://e-hentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://e-hentai.org/watched">Watched</a></div><div><a href="https://e-hentai.org/popular">Popular</a></div><div><a href="https://e-hentai.org/torrents.php">Torrents</a></div><div><a href="https://e-hentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://e-hentai.org/home.php"><span class="nbw2">My </span>Home</a></div><div><a href="https://upload.e-hentai.org/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://e-hentai.org/toplist.php">Toplists</a></div><div><a href="https://e-hentai.org/bounty.php">Bounties</a></div><div><a href="https://e-hentai.org/news.php">News</a></div><div><a href="https://forums.e-hentai.org/">Forums</a></div><div><a href="https://ehwiki.org/">Wiki</a></div><div><a href="https://hentaiverse.org/" onclick="popUp('https://hentaiverse.org/',1250,720); return false">H<span class="nbw1">entai</span>V<span class="nbw1">erse</span></a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<h1 class="ih">E-Hentai Galleries: The Free Hentai Doujinshi, Manga and Image Gallery System</h1><div id="searchbox" class="idi"><form action="https://e-hentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://e-hentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://e-hentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://upload.e-hentai.org/";
|
||||
var getrowurl = "https://e-hentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 48,197 results</p><div id="dms"><div><select onchange="document.location='https://e-hentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m" selected="selected">Minimal</option><option value="p">Minimal+</option><option value="l">Compact</option><option value="e">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://e-hentai.org/?f_cats=767&from=1391690" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1928)', 1); if(page != null) document.location='https://e-hentai.org/?page='+Math.min(1927, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1927&f_cats=767" onclick="return false">1928</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg gltm"><tr><th></th><th>Published</th><th></th><th>Title</th><th></th><th class="glhide">Uploader</th></tr><tr data-new="1"><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392268"></div><div class="glthumb" id="it1392268" style="top:-21px;height:399px"><div><img style="height:353px;width:250px;top:-6px" alt="[NekoNiwa] Stomach-filling Activity" title="[NekoNiwa] Stomach-filling Activity" src="https://ul.ehgt.org/dc/ad/dcad4eda683c3fa6422737048171330dcf1215cd-753622-2150-3035-jpg_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="postedpop_1392268">2019-04-03 10:59</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div></div></div></div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="posted_1392268">2019-04-03 10:59</div></td><td class="gl6m"><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></td><td class="gl3m glname" onmouseover="show_image_pane(1392268);preload_pane_image(0,1392267)" onmouseout="hide_image_pane(1392268)"><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><div class="glink">[NekoNiwa] Stomach-filling Activity</div></a></td><td class="gl4m"><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div></td><td class="gl5m glhide"><div><a href="https://e-hentai.org/uploader/maverih345456">maverih345456</a></div></td></tr><tr data-new="1"><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392267"></div><div class="glthumb" id="it1392267" style="top:-35px;height:404px"><div><img style="height:358px;width:250px;top:-9px" alt="[NekoNiwa] Ritoseikatsu" title="[NekoNiwa] Ritoseikatsu" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://ul.ehgt.org/5e/5d/5e5d4aaaccea1061ad49f0818a7c687a78271064-730707-2153-3080-jpg_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="postedpop_1392267">2019-04-03 10:58</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div></div></div></div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="posted_1392267">2019-04-03 10:58</div></td><td class="gl6m"><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torreLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>E-Hentai Galleries - The Free Hentai Doujinshi, Manga and Image Gallery System</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0347/g.css" />
|
||||
<meta name="description" content="With more than half a million absolutely free hentai doujinshi, manga, cosplay and CG galleries, E-Hentai Galleries is the world's largest free Hentai archive." />
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
<meta name="juicyads-site-verification" content="0f3e47704e352bf534e98d4d45411fda" />
|
||||
<link rel="alternate" type="application/atom+xml" title="E-Hentai Galleries Content Feed" href="https://e-hentai.org/rss/ehg.xml" />
|
||||
<link rel="alternate" type="application/atom+xml" title="EHTracker Torrent Feed" href="https://e-hentai.org/rss/ehtracker.xml" />
|
||||
<link rel="search" href="https://ehgt.org/g/opensearchdescription.xml" type="application/opensearchdescription+xml" title="E-Hentai Galleries Search" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://e-hentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://e-hentai.org/watched">Watched</a></div><div><a href="https://e-hentai.org/popular">Popular</a></div><div><a href="https://e-hentai.org/torrents.php">Torrents</a></div><div><a href="https://e-hentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://e-hentai.org/home.php"><span class="nbw2">My </span>Home</a></div><div><a href="https://upload.e-hentai.org/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://e-hentai.org/toplist.php">Toplists</a></div><div><a href="https://e-hentai.org/bounty.php">Bounties</a></div><div><a href="https://e-hentai.org/news.php">News</a></div><div><a href="https://forums.e-hentai.org/">Forums</a></div><div><a href="https://ehwiki.org/">Wiki</a></div><div><a href="https://hentaiverse.org/" onclick="popUp('https://hentaiverse.org/',1250,720); return false">H<span class="nbw1">entai</span>V<span class="nbw1">erse</span></a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<h1 class="ih">E-Hentai Galleries: The Free Hentai Doujinshi, Manga and Image Gallery System</h1><div id="searchbox" class="idi"><form action="https://e-hentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://e-hentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://e-hentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://upload.e-hentai.org/";
|
||||
var getrowurl = "https://e-hentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 48,197 results</p><div id="dms"><div><select onchange="document.location='https://e-hentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p" selected="selected">Minimal+</option><option value="l">Compact</option><option value="e">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://e-hentai.org/?f_cats=767&from=1391690" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1928)', 1); if(page != null) document.location='https://e-hentai.org/?page='+Math.min(1927, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1927&f_cats=767" onclick="return false">1928</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg gltm"><tr><th></th><th>Published</th><th></th><th>Title</th><th></th><th class="glhide">Uploader</th></tr><tr data-new="1"><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392268"></div><div class="glthumb" id="it1392268" style="top:-21px;height:399px"><div><img style="height:353px;width:250px;top:-6px" alt="[NekoNiwa] Stomach-filling Activity" title="[NekoNiwa] Stomach-filling Activity" src="https://ul.ehgt.org/dc/ad/dcad4eda683c3fa6422737048171330dcf1215cd-753622-2150-3035-jpg_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="postedpop_1392268">2019-04-03 10:59</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div></div></div></div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="posted_1392268">2019-04-03 10:59</div></td><td class="gl6m"><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></td><td class="gl3m glname" onmouseover="show_image_pane(1392268);preload_pane_image(0,1392267)" onmouseout="hide_image_pane(1392268)"><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><div class="glink">[NekoNiwa] Stomach-filling Activity</div></a></td><td class="gl4m"><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div></td><td class="gl5m glhide"><div><a href="https://e-hentai.org/uploader/maverih345456">maverih345456</a></div></td></tr><tr data-new="1"><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392267"></div><div class="glthumb" id="it1392267" style="top:-35px;height:404px"><div><img style="height:358px;width:250px;top:-9px" alt="[NekoNiwa] Ritoseikatsu" title="[NekoNiwa] Ritoseikatsu" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://ul.ehgt.org/5e/5d/5e5d4aaaccea1061ad49f0818a7c687a78271064-730707-2153-3080-jpg_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="postedpop_1392267">2019-04-03 10:58</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div></div></div></div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="posted_1392267">2019-04-03 10:58</div></td><td class="gl6m"><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torreLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>E-Hentai Galleries - The Free Hentai Doujinshi, Manga and Image Gallery System</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0347/g.css" />
|
||||
<style type="text/css">
|
||||
@supports(display:grid){.gld{display:grid;grid-template-columns:repeat(5,1fr)}.gl1t{min-width:250px;max-width:400px}@media screen and (max-width:1360px) {.gld{grid-template-columns:repeat(4,1fr)}.gl1t:nth-child(8n+1),.gl1t:nth-child(8n+3),.gl1t:nth-child(8n+6),.gl1t:nth-child(8n+8){background:#F2F0E4}.gl1t:nth-child(8n+2),.gl1t:nth-child(8n+4),.gl1t:nth-child(8n+5),.gl1t:nth-child(8n+7){background:#EDEBDF}}@media screen and (max-width:1090px) {.gld{grid-template-columns:repeat(3,1fr)}.gl1t:nth-child(2n+1){background:#F2F0E4}.gl1t:nth-child(2n+2){background:#EDEBDF}}@media screen and (max-width:820px) {.gld{grid-template-columns:repeat(2,1fr)}.gl1t:nth-child(4n+1),.gl1t:nth-child(4n+4){background:#F2F0E4}.gl1t:nth-child(4n+2),.gl1t:nth-child(4n+3){background:#EDEBDF}}}
|
||||
</style>
|
||||
<meta name="description" content="With more than half a million absolutely free hentai doujinshi, manga, cosplay and CG galleries, E-Hentai Galleries is the world's largest free Hentai archive." />
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
<meta name="juicyads-site-verification" content="0f3e47704e352bf534e98d4d45411fda" />
|
||||
<link rel="alternate" type="application/atom+xml" title="E-Hentai Galleries Content Feed" href="https://e-hentai.org/rss/ehg.xml" />
|
||||
<link rel="alternate" type="application/atom+xml" title="EHTracker Torrent Feed" href="https://e-hentai.org/rss/ehtracker.xml" />
|
||||
<link rel="search" href="https://ehgt.org/g/opensearchdescription.xml" type="application/opensearchdescription+xml" title="E-Hentai Galleries Search" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://e-hentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://e-hentai.org/watched">Watched</a></div><div><a href="https://e-hentai.org/popular">Popular</a></div><div><a href="https://e-hentai.org/torrents.php">Torrents</a></div><div><a href="https://e-hentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://e-hentai.org/home.php"><span class="nbw2">My </span>Home</a></div><div><a href="https://upload.e-hentai.org/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://e-hentai.org/toplist.php">Toplists</a></div><div><a href="https://e-hentai.org/bounty.php">Bounties</a></div><div><a href="https://e-hentai.org/news.php">News</a></div><div><a href="https://forums.e-hentai.org/">Forums</a></div><div><a href="https://ehwiki.org/">Wiki</a></div><div><a href="https://hentaiverse.org/" onclick="popUp('https://hentaiverse.org/',1250,720); return false">H<span class="nbw1">entai</span>V<span class="nbw1">erse</span></a></div></div>
|
||||
<div class="ido" style="max-width:1370px">
|
||||
<div id="toppane">
|
||||
<h1 class="ih">E-Hentai Galleries: The Free Hentai Doujinshi, Manga and Image Gallery System</h1><div id="searchbox" class="idi"><form action="https://e-hentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://e-hentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://e-hentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://upload.e-hentai.org/";
|
||||
var getrowurl = "https://e-hentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 48,197 results</p><div id="dms"><div><select onchange="document.location='https://e-hentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p">Minimal+</option><option value="l">Compact</option><option value="e">Extended</option><option value="t" selected="selected">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://e-hentai.org/?f_cats=767&from=1391690" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1928)', 1); if(page != null) document.location='https://e-hentai.org/?page='+Math.min(1927, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1927&f_cats=767" onclick="return false">1928</a></td><td onclick="document.location=this.firstChild.href"><a href="https://e-hentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><div class="itg gld"><div class="gl1t" data-new="1"><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><div class="gl4t glname">[NekoNiwa] Stomach-filling Activity</div></a><div class="gl3t" style="height:340px;width:250px"><a href="https://e-hentai.org/g/1392268/7ff56437fa/"><img style="height:353px;width:250px;top:-6px" alt="[NekoNiwa] Stomach-filling Activity" title="[NekoNiwa] Stomach-filling Activity" src="https://ul.ehgt.org/dc/ad/dcad4eda683c3fa6422737048171330dcf1215cd-753622-2150-3035-jpg_250.jpg" /></a></div><div class="gl5t"><div><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392268&t=7ff56437fa&act=addfav',675,415)" id="posted_1392268">2019-04-03 10:59</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></div></div></div><div class="gl1t" data-new="1"><a href="https://e-hentai.org/g/1392267/549353a6c6/"><div class="gl4t glname">[NekoNiwa] Ritoseikatsu</div></a><div class="gl3t" style="height:340px;width:250px"><a href="https://e-hentai.org/g/1392267/549353a6c6/"><img style="height:358px;width:250px;top:-9px" alt="[NekoNiwa] Ritoseikatsu" title="[NekoNiwa] Ritoseikatsu" src="https://ul.ehgt.org/5e/5d/5e5d4aaaccea1061ad49f0818a7c687a78271064-730707-2153-3080-jpg_250.jpg" /></a></div><div class="gl5t"><div><div class="cs ct9" onclick="document.location='https://e-hentai.org/non-h'">Non-H</div><div class="glnew" onclick="popUp('https://e-hentai.org/gallerypopups.php?gid=1392267&t=549353a6c6&act=addfav',675,415)" id="posted_1392267">2019-04-03 10:58</div></div><div><div class="ir" style="background-position:-80px -1px;opacity:0.33333333333333"></div><div>26 pages</div><div class="gldown"><img src="https://ehgt.org/g/td.png" alt="T" title="No torrents available" /></div></div></div></div><div class="gl1t"><a href="https://e-hentai.org/g/1392234/6ca336fe6d/"><div class="gl4t glname">(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]</div></a><div class="gl3t" style="height:340px;width:250px"><a href="https://e-hentai.org/g/1392234/6ca336fe6d/"><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" src="https://ehgt.org/t/7c/de/7cde7a891ea99aba2ee2f497212deb7deb02672c-10121090-2068-3021-png_250.jpg" /></a></div><div class="gl6t"><div class="gt" style="color:#f1f1f1;border-color:#1357df;background:radial-gradient(#1357df,#3377FF) !important" title="language:chinese">chinese</div></div><div class="gl5t"><div><div class="cs ct9" onclick="docuLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ExHentai.org</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://exhentai.org/z/0347/x.css" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://exhentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://exhentai.org/watched">Watched</a></div><div><a href="https://exhentai.org/popular">Popular</a></div><div><a href="https://exhentai.org/torrents.php">Torrents</a></div><div><a href="https://exhentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://exhentai.org/uconfig.php">Settings</a></div><div><a href="https://exhentai.org/upload/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://exhentai.org/mytags">My Tags</a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<div id="searchbox" class="idi"><form action="https://exhentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://exhentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://exhentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://exhentai.org/upload/";
|
||||
var getrowurl = "https://exhentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 49,597 results</p><div id="dms"><div><select onchange="document.location='https://exhentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p">Minimal+</option><option value="l" selected="selected">Compact</option><option value="e">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://exhentai.org/?f_cats=767&from=1391669" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1984)', 1); if(page != null) document.location='https://exhentai.org/?page='+Math.min(1983, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1983&f_cats=767" onclick="return false">1984</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg gltc"><tr><th></th><th>Published</th><th>Title</th><th class="glhide">Uploader</th></tr><tr><td class="gl1c glcat"><div class="cn ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div></td><td class="gl2c"><div class="glcut" id="ic1392234"></div><div class="glthumb" id="it1392234" style="top:-22px;height:412px"><div><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" src="https://exhentai.org/t/7c/de/7cde7a891ea99aba2ee2f497212deb7deb02672c-10121090-2068-3021-png_250.jpg" /></div><div><div><div class="cn ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="postedpop_1392234">2019-04-03 09:21</div></div><div><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div><div>28 pages</div></div></div></div><div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="posted_1392234">2019-04-03 09:21</div><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div><div class="gldown"><img src="https://exhentai.org/img/td.png" alt="T" title="No torrents available" /></div></div></td><td class="gl3c glname" onmouseover="show_image_pane(1392234);preload_pane_image(0,1392169)" onmouseout="hide_image_pane(1392234)"><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><div class="glink">(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]</div><div><div class="gt" style="color:#f1f1f1;border-color:#1357df;background:radial-gradient(#1357df,#3377FF) !important" title="language:chinese">chinese</div><div class="gt" title="language:translated">translated</div><div class="gt" title="parody:touhou project">touhou project</div><div class="gt" title="character:flandre scarlet">flandre scarlet</div><div class="gt" title="character:koishi komeiji">koishi komeiji</div><div class="gt" title="character:satori komeiji">satori komeiji</div><div class="gt" title="group:aoirokanata">aoirokanata</div><div class="gt" title="artist:shikitani asuka">shikitani asuka</div></div></a></td><td class="gl4c glhide"><div><a href="https://exhentai.org/uploader/%E5%AE%9E%E8%B7%B5%E6%A2%A6%E6%83%B3">实践梦想</a></div><div>28 pages</div></td></tr><tr><td class="gl1c glcat"><div class="cn ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div></td><td class="gl2c"><div class="glcut" id="ic1392169"></div><div class="glthumb" id="it1392169" style="top:-35px;height:397px"><div><img style="height:351px;width:250px;top:-5px" alt="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" title="[Yaruku] Line truncated
|
||||
</body>
|
||||
</html>
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ExHentai.org</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://exhentai.org/z/0347/x.css" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://exhentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://exhentai.org/watched">Watched</a></div><div><a href="https://exhentai.org/popular">Popular</a></div><div><a href="https://exhentai.org/torrents.php">Torrents</a></div><div><a href="https://exhentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://exhentai.org/uconfig.php">Settings</a></div><div><a href="https://exhentai.org/upload/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://exhentai.org/mytags">My Tags</a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<div id="searchbox" class="idi"><form action="https://exhentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://exhentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://exhentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://exhentai.org/upload/";
|
||||
var getrowurl = "https://exhentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 49,597 results</p><div id="dms"><div><select onchange="document.location='https://exhentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p">Minimal+</option><option value="l">Compact</option><option value="e" selected="selected">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://exhentai.org/?f_cats=767&from=1391669" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1984)', 1); if(page != null) document.location='https://exhentai.org/?page='+Math.min(1983, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1983&f_cats=767" onclick="return false">1984</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg glte"><tr><td class="gl1e" style="width:250px"><div style="height:340px;width:250px"><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" src="https://exhentai.org/t/7c/de/7cde7a891ea99aba2ee2f497212deb7deb02672c-10121090-2068-3021-png_250.jpg" /></a></div></td><td class="gl2e"><div><div class="gl3e"><div class="cn ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="posted_1392234">2019-04-03 09:21</div><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div><div><a href="https://exhentai.org/uploader/%E5%AE%9E%E8%B7%B5%E6%A2%A6%E6%83%B3">实践梦想</a></div><div>28 pages</div><div class="gldown"><img src="https://exhentai.org/img/td.png" alt="T" title="No torrents available" /></div></div><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><div class="gl4e glname" style="min-height:348px"><div class="glink">(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]</div><div><table><tr><td class="tc">language:</td><td><div class="gt" style="color:#f1f1f1;border-color:#1357df;background:radial-gradient(#1357df,#3377FF) !important" title="language:chinese">chinese</div><div class="gt" title="language:translated">translated</div></td><tr><td class="tc">parody:</td><td><div class="gt" title="parody:touhou project">touhou project</div></td><tr><td class="tc">character:</td><td><div class="gt" title="character:flandre scarlet">flandre scarlet</div><div class="gt" title="character:koishi komeiji">koishi komeiji</div><div class="gtl" title="character:satori komeiji">satori komeiji</div></td><tr><td class="tc">group:</td><td><div class="gt" title="group:aoirokanata">aoirokanata</div></td><tr><td class="tc">artist:</td><td><div class="gt" title="artist:shikitani asuka">shikitani asuka</div></td></table></div></div></a></div></td></tr><tr><td class="gl1e" style="width:250px"><div style="height:340px;width:250px"><a href="https://exhentai.org/g/1392169/f3d1c7032b/"><img style="height:351px;width:250px;top:-5px" alt="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" title="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" src="https://exhentai.org/t/4c/bd/4cbde601ef33dda8ae968c019a50e76125ca4025-401285-754-1056-jpg_250.jpg" /></a></div></td><td class="gl2e"><div><div class="gl3e"><div class="cn ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392169&t=f3d1c7032b&act=addfav',675,415)" id="posted_1392169">2019-04-03 06:23</div><div class="iLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ExHentai.org</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://exhentai.org/z/0347/x.css" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://exhentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://exhentai.org/watched">Watched</a></div><div><a href="https://exhentai.org/popular">Popular</a></div><div><a href="https://exhentai.org/torrents.php">Torrents</a></div><div><a href="https://exhentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://exhentai.org/uconfig.php">Settings</a></div><div><a href="https://exhentai.org/upload/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://exhentai.org/mytags">My Tags</a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<div id="searchbox" class="idi"><form action="https://exhentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://exhentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://exhentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://exhentai.org/upload/";
|
||||
var getrowurl = "https://exhentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 49,597 results</p><div id="dms"><div><select onchange="document.location='https://exhentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m" selected="selected">Minimal</option><option value="p">Minimal+</option><option value="l">Compact</option><option value="e">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://exhentai.org/?f_cats=767&from=1391669" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1984)', 1); if(page != null) document.location='https://exhentai.org/?page='+Math.min(1983, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1983&f_cats=767" onclick="return false">1984</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg gltm"><tr><th></th><th>Published</th><th></th><th>Title</th><th></th><th class="glhide">Uploader</th></tr><tr><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392234"></div><div class="glthumb" id="it1392234" style="top:-21px;height:412px"><div><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" src="https://exhentai.org/t/7c/de/7cde7a891ea99aba2ee2f497212deb7deb02672c-10121090-2068-3021-png_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="postedpop_1392234">2019-04-03 09:21</div></div><div><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div><div>28 pages</div></div></div></div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="posted_1392234">2019-04-03 09:21</div></td><td class="gl6m"><div class="gldown"><img src="https://exhentai.org/img/td.png" alt="T" title="No torrents available" /></div></td><td class="gl3m glname" onmouseover="show_image_pane(1392234);preload_pane_image(0,1392169)" onmouseout="hide_image_pane(1392234)"><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><div class="glink">(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]</div></a></td><td class="gl4m"><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div></td><td class="gl5m glhide"><div><a href="https://exhentai.org/uploader/%E5%AE%9E%E8%B7%B5%E6%A2%A6%E6%83%B3">实践梦想</a></div></td></tr><tr><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392169"></div><div class="glthumb" id="it1392169" style="top:-34px;height:397px"><div><img style="height:351px;width:250px;top:-5px" alt="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" title="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://exhentai.org/t/4c/bd/4cbde601ef33dda8ae968c019a50e76125ca4025-401285-754-1056-jpg_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392169&t=f3d1c7032b&act=addfav',675,415)" id="postedpop_1392169">2019-04-03 06:23</div></div><div><div class="ir" style="background-position:0px -21px;opacity:0.53333333333333"></div><diLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ExHentai.org</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://exhentai.org/z/0347/x.css" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://exhentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://exhentai.org/watched">Watched</a></div><div><a href="https://exhentai.org/popular">Popular</a></div><div><a href="https://exhentai.org/torrents.php">Torrents</a></div><div><a href="https://exhentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://exhentai.org/uconfig.php">Settings</a></div><div><a href="https://exhentai.org/upload/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://exhentai.org/mytags">My Tags</a></div></div>
|
||||
<div class="ido">
|
||||
<div id="toppane">
|
||||
<div id="searchbox" class="idi"><form action="https://exhentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://exhentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://exhentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://exhentai.org/upload/";
|
||||
var getrowurl = "https://exhentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 49,597 results</p><div id="dms"><div><select onchange="document.location='https://exhentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p" selected="selected">Minimal+</option><option value="l">Compact</option><option value="e">Extended</option><option value="t">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://exhentai.org/?f_cats=767&from=1391669" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1984)', 1); if(page != null) document.location='https://exhentai.org/?page='+Math.min(1983, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1983&f_cats=767" onclick="return false">1984</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><table class="itg gltm"><tr><th></th><th>Published</th><th></th><th>Title</th><th></th><th class="glhide">Uploader</th></tr><tr><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392234"></div><div class="glthumb" id="it1392234" style="top:-21px;height:412px"><div><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" src="https://exhentai.org/t/7c/de/7cde7a891ea99aba2ee2f497212deb7deb02672c-10121090-2068-3021-png_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="postedpop_1392234">2019-04-03 09:21</div></div><div><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div><div>28 pages</div></div></div></div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="posted_1392234">2019-04-03 09:21</div></td><td class="gl6m"><div class="gldown"><img src="https://exhentai.org/img/td.png" alt="T" title="No torrents available" /></div></td><td class="gl3m glname" onmouseover="show_image_pane(1392234);preload_pane_image(0,1392169)" onmouseout="hide_image_pane(1392234)"><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><div class="glink">(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]</div><div class="gltm"><div class="gt" style="color:#f1f1f1;border-color:#1357df;background:radial-gradient(#1357df,#3377FF) !important" title="language:chinese">chinese</div></div></a></td><td class="gl4m"><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div></td><td class="gl5m glhide"><div><a href="https://exhentai.org/uploader/%E5%AE%9E%E8%B7%B5%E6%A2%A6%E6%83%B3">实践梦想</a></div></td></tr><tr><td class="gl1m glcat"><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div></td><td class="gl2m"><div class="glcut" id="ic1392169"></div><div class="glthumb" id="it1392169" style="top:-34px;height:397px"><div><img style="height:351px;width:250px;top:-5px" alt="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" title="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://exhentai.org/t/4c/bd/4cbde601ef33dda8ae968c019a50e76125ca4025-401285-754-1056-jpg_250.jpg" /></div><div><div><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392169&t=f3d1cLine truncated
|
||||
</body>
|
||||
</html>
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>ExHentai.org</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://exhentai.org/z/0347/x.css" />
|
||||
<style type="text/css">
|
||||
@supports(display:grid){.gld{display:grid;grid-template-columns:repeat(5,1fr)}.gl1t{min-width:250px;max-width:400px}@media screen and (max-width:1360px) {.gld{grid-template-columns:repeat(4,1fr)}.gl1t:nth-child(8n+1),.gl1t:nth-child(8n+3),.gl1t:nth-child(8n+6),.gl1t:nth-child(8n+8){background:#363940}.gl1t:nth-child(8n+2),.gl1t:nth-child(8n+4),.gl1t:nth-child(8n+5),.gl1t:nth-child(8n+7){background:#3c414b}}@media screen and (max-width:1090px) {.gld{grid-template-columns:repeat(3,1fr)}.gl1t:nth-child(2n+1){background:#363940}.gl1t:nth-child(2n+2){background:#3c414b}}@media screen and (max-width:820px) {.gld{grid-template-columns:repeat(2,1fr)}.gl1t:nth-child(4n+1),.gl1t:nth-child(4n+4){background:#363940}.gl1t:nth-child(4n+2),.gl1t:nth-child(4n+3){background:#3c414b}}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="nb" class="nosel"><div><a class="nbw" href="https://exhentai.org/">Front<span class="nbw1"> Page</span></a></div><div><a href="https://exhentai.org/watched">Watched</a></div><div><a href="https://exhentai.org/popular">Popular</a></div><div><a href="https://exhentai.org/torrents.php">Torrents</a></div><div><a href="https://exhentai.org/favorites.php">Fav<span class="nbw1">orite</span>s</a></div><div><a href="https://exhentai.org/uconfig.php">Settings</a></div><div><a href="https://exhentai.org/upload/manage.php"><span class="nbw2">My </span>Uploads</a></div><div><a href="https://exhentai.org/mytags">My Tags</a></div></div>
|
||||
<div class="ido" style="max-width:1370px">
|
||||
<div id="toppane">
|
||||
<div id="searchbox" class="idi"><form action="https://exhentai.org/" method="get" style="margin:0px; padding:0px"><input type="hidden" id="f_cats" name="f_cats" value="767" /><table class="itc"><tr><td><div id="cat_2" class="cs ct2" onclick="toggle_category(2)" data-disabled="1">Doujinshi</div></td><td><div id="cat_4" class="cs ct3" onclick="toggle_category(4)" data-disabled="1">Manga</div></td><td><div id="cat_8" class="cs ct4" onclick="toggle_category(8)" data-disabled="1">Artist CG</div></td><td><div id="cat_16" class="cs ct5" onclick="toggle_category(16)" data-disabled="1">Game CG</div></td><td><div id="cat_512" class="cs cta" onclick="toggle_category(512)" data-disabled="1">Western</div></td></tr><tr><td><div id="cat_256" class="cs ct9" onclick="toggle_category(256)">Non-H</div></td><td><div id="cat_32" class="cs ct6" onclick="toggle_category(32)" data-disabled="1">Image Set</div></td><td><div id="cat_64" class="cs ct7" onclick="toggle_category(64)" data-disabled="1">Cosplay</div></td><td><div id="cat_128" class="cs ct8" onclick="toggle_category(128)" data-disabled="1">Asian Porn</div></td><td><div id="cat_1" class="cs ct1" onclick="toggle_category(1)" data-disabled="1">Misc</div></td></tr></table><p class="nopm"><input type="text" id="f_search" name="f_search" placeholder="Search Keywords" size="50" maxlength="200" /><input type="submit" value="Apply Filter" onclick="search_presubmit()" /><input type="button" value="Clear Filter" onclick="top.location.href='https://exhentai.org/'; return false" /></p><p class="nopm" style="margin-top:4px"><a href="#" rel="nofollow" onclick="toggle_advsearch_pane(this); return false">Show Advanced Options</a> <a href="#" rel="nofollow" onclick="toggle_filesearch_pane(this); return false">Show File Search</a></p><div id="advdiv" style="display:none"></div></form></div><div id="fsdiv" class="idi" style="margin-top:10px; display:none"></div>
|
||||
<script type="text/javascript" src="https://exhentai.org/z/0347/ehg_index.c.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var ulhost = "https://exhentai.org/upload/";
|
||||
var getrowurl = "https://exhentai.org/?page={?page?}&f_cats=767";
|
||||
</script>
|
||||
|
||||
</div><div style="position:relative; z-index:2"><p class="ip">Showing 49,597 results</p><div id="dms"><div><select onchange="document.location='https://exhentai.org/?f_cats=767&inline_set=dm_' + this.value"><option value="m">Minimal</option><option value="p">Minimal+</option><option value="l">Compact</option><option value="e">Extended</option><option value="t" selected="selected">Thumbnail</option></select></div></div><table class="ptt" style="margin:2px auto 0px"><tr><td class="ptdd"><</td><td class="ptds"><a href="https://exhentai.org/?f_cats=767&from=1391669" onclick="return false">1</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">2</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=2&f_cats=767" onclick="return false">3</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=3&f_cats=767" onclick="return false">4</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=4&f_cats=767" onclick="return false">5</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=5&f_cats=767" onclick="return false">6</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=6&f_cats=767" onclick="return false">7</a></td><td onclick="var page=prompt('Jump to page: (1-1984)', 1); if(page != null) document.location='https://exhentai.org/?page='+Math.min(1983, Math.max(0, page - 1))+'&f_cats=767'">...</td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1983&f_cats=767" onclick="return false">1984</a></td><td onclick="document.location=this.firstChild.href"><a href="https://exhentai.org/?page=1&f_cats=767" onclick="return false">></a></td></tr></table><div class="itg gld"><div class="gl1t"><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><div class="gl4t glname">(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]</div></a><div class="gl3t" style="height:340px;width:250px"><a href="https://exhentai.org/g/1392234/6ca336fe6d/"><img style="height:366px;width:250px;top:-13px" alt="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" title="(C91) [Aoirokanata (Shikitani Asuka)] Neko Flan to Kainushi Koishi | 貓芙蘭和飼主戀 (Touhou Project) [Chinese] [魔恋汉化组]" src="https://exhentai.org/t/7c/de/7cde7a891ea99aba2ee2f497212deb7deb02672c-10121090-2068-3021-png_250.jpg" /></a></div><div class="gl6t"><div class="gt" style="color:#f1f1f1;border-color:#1357df;background:radial-gradient(#1357df,#3377FF) !important" title="language:chinese">chinese</div></div><div class="gl5t"><div><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392234&t=6ca336fe6d&act=addfav',675,415)" id="posted_1392234">2019-04-03 09:21</div></div><div><div class="ir" style="background-position:0px -1px;opacity:0.53333333333333"></div><div>28 pages</div><div class="gldown"><img src="https://exhentai.org/img/td.png" alt="T" title="No torrents available" /></div></div></div></div><div class="gl1t"><a href="https://exhentai.org/g/1392169/f3d1c7032b/"><div class="gl4t glname">[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)</div></a><div class="gl3t" style="height:340px;width:250px"><a href="https://exhentai.org/g/1392169/f3d1c7032b/"><img style="height:351px;width:250px;top:-5px" alt="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" title="[Yaruku] GOLD PLEASE! Sono 1 (Touhou Project)" src="https://exhentai.org/t/4c/bd/4cbde601ef33dda8ae968c019a50e76125ca4025-401285-754-1056-jpg_250.jpg" /></a></div><div class="gl5t"><div><div class="cs ct9" onclick="document.location='https://exhentai.org/non-h'">Non-H</div><div onclick="popUp('https://exhentai.org/gallerypopups.php?gid=1392169&t=f3d1c7032b&act=addfav',675,415)" id="posted_1392169">2019-04-03 06:23</div></div><div><div class="ir" style="background-position:0px -21px;opacity:0.53333333333333"></div><div>8 pages</div><div class="gldown"><img src="https://exhentai.org/img/td.png" alt="T" title="No torrents available" /></div></div></div></div><div class="gl1t"><a href="https://exhentai.org/g/1392168/f22264201c/"><div class="gl4t glname">[Yaruku] 絹代式修理法 (Girls und Panzer) [Digital]</div></a><div class="gl3t" style="height:340px;width:250px"><a href="https://exhentai.org/g/1392168/f22264201c/"><img style="height:342px;width:250px;top:-1px" alt="[Yaruku] 絹代式修理法 (Girls und Panzer) [Digital]" title="[Yaruku] 絹代式修理法 (Girls und Panzer) [Digital]" src="https://exhentai.org/t/25/14/251491479565219eec896d754b79c1a9bc2aaf9c-766037Line truncated
|
||||
</body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
{"p":3,"s":"s\/7e7a4305a4\/1366222-3","n":"<div class=\"sn\"><a onclick=\"return load_image(1, '3913869966')\" href=\"https:\/\/e-hentai.org\/s\/3913869966\/1366222-1\"><img src=\"https:\/\/ehgt.org\/g\/f.png\" \/><\/a><a id=\"prev\" onclick=\"return load_image(2, '34972180ed')\" href=\"https:\/\/e-hentai.org\/s\/34972180ed\/1366222-2\"><img src=\"https:\/\/ehgt.org\/g\/p.png\" \/><\/a><div><span>3<\/span> \/ <span>13<\/span><\/div><a id=\"next\" onclick=\"return load_image(4, 'd2b5dac191')\" href=\"https:\/\/e-hentai.org\/s\/d2b5dac191\/1366222-4\"><img src=\"https:\/\/ehgt.org\/g\/n.png\" \/><\/a><a onclick=\"return load_image(13, 'f264699329')\" href=\"https:\/\/e-hentai.org\/s\/f264699329\/1366222-13\"><img src=\"https:\/\/ehgt.org\/g\/l.png\" \/><\/a><\/div>","i":"<div>Valentines_2019_002.jpg :: 1280 x 960 :: 178.8 KB<\/div>","k":"7e7a4305a4","i3":"<a onclick=\"return load_image(4, 'd2b5dac191')\" href=\"https:\/\/e-hentai.org\/s\/d2b5dac191\/1366222-4\"><img id=\"img\" src=\"http:\/\/69.30.203.46:60111\/h\/6047fa2f194742f6fa541ec1f631ec3ab438f960-183117-1280-960-jpg\/keystamp=1550291100-c4438f48c8;fileindex=67379169;xres=1280\/Valentines_2019_002.jpg\" style=\"height:960px;width:1280px\" onerror=\"this.onerror=null; nl('15151-430636')\" \/><\/a>","i5":"<div class=\"sb\"><a href=\"https:\/\/e-hentai.org\/g\/1366222\/c0bf6f0a8e\/\"><img src=\"https:\/\/ehgt.org\/g\/b.png\" referrerpolicy=\"no-referrer\" \/><\/a><\/div>","i6":" <img src=\"https:\/\/ehgt.org\/g\/mr.gif\" class=\"mr\" \/> <a href=\"https:\/\/e-hentai.org\/?f_shash=7e7a4305a47ebd25a11454003f042f1adc1015b1&fs_from=Valentines_2019_002.jpg+from+%5BMr.+Phoenyxx%5D+Valentines+2019\">Show all galleries with this file<\/a> <img src=\"https:\/\/ehgt.org\/g\/mr.gif\" class=\"mr\" \/> <a href=\"#\" onclick=\"prompt('Copy the URL below.', 'https:\/\/e-hentai.org\/r\/6047fa2f194742f6fa541ec1f631ec3ab438f960-183117-1280-960-jpg\/forumtoken\/1366222-3\/Valentines_2019_002.jpg'); return false\">Generate a static forum image link<\/a> <img src=\"https:\/\/ehgt.org\/g\/mr.gif\" class=\"mr\" \/> <a href=\"#\" id=\"loadfail\" onclick=\"return nl('15151-430636')\">Click here if the image fails loading<\/a> ","i7":" <img src=\"https:\/\/ehgt.org\/g\/mr.gif\" class=\"mr\" \/> <a href=\"https:\/\/e-hentai.org\/fullimg.php?gid=1366222&page=3&key=puxxvyg98a4\">Download original 1600 x 1200 335.9 KB source<\/a>","si":15151,"x":"1280","y":"960"}
|
||||
@@ -1,17 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>(C95) [rurudot (rurudo)] Innocence</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0339/g.css" />
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
function popUp(URL,w,h) {
|
||||
window.open(URL,"_pu"+(Math.random()+"").replace(/0\./,""),"toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<div id="i1" class="sni" style="width:1300px"><h1>(C95) [rurudot (rurudo)] Innocence</h1><div id="i2"><div class="sn"><a onclick="return load_image(1, '0e82cbc893')" href="https://e-hentai.org/s/0e82cbc893/1363978-1"><img src="https://ehgt.org/g/f.png" /></a><a id="prev" onclick="return load_image(9, '3393c57a44')" href="https://e-hentai.org/s/3393c57a44/1363978-9"><img src="https://ehgt.org/g/p.png" /></a><div><span>10</span> / <span>11</span></div><a id="next" onclick="return load_image(11, 'fab3e858c9')" href="https://e-hentai.org/s/fab3e858c9/1363978-11"><img src="https://ehgt.org/g/n.png" /></a><a onclick="return load_image(11, 'fab3e858c9')" href="https://e-hentai.org/s/fab3e858c9/1363978-11"><img src="https://ehgt.org/g/l.png" /></a></div><div>10.jpg :: 1280 x 879 :: 184.4 KB</div></div><script async src="//adserver.juicyads.com/js/jads.js"></script><ins id="265909" data-width="728" data-height="90"></ins><script>(adsbyjuicy = window.adsbyjuicy || []).push({'adzone':265909});</script><div id="i3"><a onclick="return load_image(11, 'fab3e858c9')" href="https://e-hentai.org/s/fab3e858c9/1363978-11"><img id="img" src="http://108.6.41.160:2688/h/5c63e9a5810d8d9c873d9e0dfaadc4a0d70a13bf-188862-1280-879-jpg/keystamp=1550291700-145ecbbb10;fileindex=67290651;xres=1280/10.jpg" style="width:1280px;height:879px" onerror="this.onerror=null; nl('26664-430636')" /></a></div><script async src="//adserver.juicyads.com/js/jads.js"></script><ins id="249007" data-width="728" data-height="90"></ins><script>(adsbyjuicy = window.adsbyjuicy || []).push({'adzone':249007});</script><div id="i4"><div>10.jpg :: 1280 x 879 :: 184.4 KB</div><div class="sn"><a onclick="return load_image(1, '0e82cbc893')" href="https://e-hentai.org/s/0e82cbc893/1363978-1"><img src="https://ehgt.org/g/f.png" /></a><a id="prev" onclick="return load_image(9, '3393c57a44')" href="https://e-hentai.org/s/3393c57a44/1363978-9"><img src="https://ehgt.org/g/p.png" /></a><div><span>10</span> / <span>11</span></div><a id="next" onclick="return load_image(11, 'fab3e858c9')" href="https://e-hentai.org/s/fab3e858c9/1363978-11"><img src="https://ehgt.org/g/n.png" /></a><a onclick="return load_image(11, 'fab3e858c9')" href="https://e-hentai.org/s/fab3e858c9/1363978-11"><img src="https://ehgt.org/g/l.png" /></a></div></div><div id="i5"><div class="sb"><a href="https://e-hentai.org/g/1363978/88616cdd73/"><img src="https://ehgt.org/g/b.png" referrerpolicy="no-referrer" /></a></div></div><div id="i6" class="if"> <img src="https://ehgt.org/g/mr.gif" class="mr" /> <a href="https://e-hentai.org/?f_shash=49c9e58c17d96448671602159677541915aa6948&fs_from=10.jpg+from+%28C95%29+%5Brurudot+%28rurudo%29%5D+Innocence">Show all galleries with this file</a> <img src="https://ehgt.org/g/mr.gif" class="mr" /> <a href="#" onclick="prompt('Copy the URL below.', 'https://e-hentai.org/r/5c63e9a5810d8d9c873d9e0dfaadc4a0d70a13bf-188862-1280-879-jpg/forumtoken/1363978-10/10.jpg'); return false">Generate a static forum image link</a> <img src="https://ehgt.org/g/mr.gif" class="mr" /> <a href="#" id="loadfail" onclick="return nl('26664-430636')">Click here if the image fails loading</a> </div><div id="i7" class="if"> <img src="https://ehgt.org/g/mr.gif" class="mr" /> <a href="https://e-hentai.org/fullimg.php?gid=1363978&page=10&key=qt2hwrx98a4">Download original 4893 x 3360 15.05 MB source</a></div></div><p class="ip">[<a href="https://e-hentai.org/">Front Page</a>]</p><script type="text/javascript">var gid=1363978;var startpage=10;var startkey="49c9e58c17";var showkey="ghz0e5m98a4";var base_url="https://e-hentai.org/";var api_url = "https://api.e-hentai.org/api.php";var prl=9999;var si=26664;var xres = 1280;var yres = 879;</script><script type="text/javascript" src="https://e-hentai.org/z/0339/ehg_show.c.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,5 +1,6 @@
|
||||
plugins {
|
||||
id 'com.android.application' version '7.2.0' apply false
|
||||
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
|
||||
+5
-1
@@ -8,7 +8,7 @@ android {
|
||||
ndkVersion "24.0.8215888"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 26
|
||||
minSdkVersion 31
|
||||
targetSdkVersion 32
|
||||
consumerProguardFiles 'proguard-rules.pro'
|
||||
|
||||
@@ -17,6 +17,10 @@ android {
|
||||
arguments '-DANDROID_STL=c++_static'
|
||||
}
|
||||
}
|
||||
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a', 'x86_64'
|
||||
}
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
|
||||
Reference in new issue
Block a user