Skip to content

Instantly share code, notes, and snippets.

View Haoxiqiang's full-sized avatar

haoxiqiang Haoxiqiang

View GitHub Profile
@Haoxiqiang
Haoxiqiang / BottomSheetBehaviorExtension.kt
Last active September 11, 2023 07:02
a more elegant and non-invasive solution for viewpager in bottomsheet.
import android.view.View
import android.view.ViewGroup
import androidx.core.view.ViewCompat
import androidx.viewpager.widget.ViewPager
import androidx.viewpager.widget.ViewPagerUtils
import com.google.android.material.bottomsheet.BottomSheetBehavior
import java.lang.ref.WeakReference
import java.lang.reflect.Field
private val nestedScrollingChildRef: Field =
@Haoxiqiang
Haoxiqiang / README.md
Created September 8, 2022 13:07
init_my_dev_server
git clone https://github.com/jenv/jenv.git ~/.jenv
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
sudo apt install openjdk-11-jdk
jenv add /usr/lib/jvm/java-11-openjdk-amd64/
jenv global 11.0.16
@Haoxiqiang
Haoxiqiang / gist:ed39ee74590e2f0df34d882284b45227
Created September 8, 2022 11:31
upgrade_oldest_centos_dev_tools
# These critical programs are missing or too old: compiler
# upgrade make
```bash
#到 http://ftp.gnu.org/pub/gnu/make/ 查找最新安装包
wget http://ftp.gnu.org/pub/gnu/make/make-4.3.tar.gz
tar -zxvf make-4.3.tar.gz
cd make-4.3
./configure --prefix=/usr
type make
make check
@Haoxiqiang
Haoxiqiang / WebView.kt
Created July 25, 2022 03:57
If the page height of WebView must be 100%, you want get scroll Y
webview.evaluateJavascript(
"(function(){document.documentElement.style.overflow='visible';}()",
null
)
@Haoxiqiang
Haoxiqiang / KtorExtensions.kt
Created May 6, 2022 03:38
Ktor support request with gzip on the Android platform.
ktorHttpClient.post("xxxx") {
tryCompress(this, json)
}
private fun tryCompress(httpRequestBuilder: HttpRequestBuilder, json: JSONObject) {
val stringBody = tryCreateRequestBody(json = json)
if (stringBody.length > 4096) {
httpRequestBuilder.body = stringBody.gzipCompress()
httpRequestBuilder.headers[HttpHeaders.ContentEncoding] = "gzip"
} else {
@Haoxiqiang
Haoxiqiang / JSONAdapter.kt
Created March 21, 2022 08:37
Moshi Support JSONObject
package cn.ixiaochuan.frodo.api.moshi
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonAdapter.Factory
import com.squareup.moshi.JsonDataException
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import org.json.JSONArray
@Haoxiqiang
Haoxiqiang / App.kt
Created January 12, 2022 13:35
load sqlite db from jar
/**
* from my repo:https://github.com/Haoxiqiang/android-quick-reference
* In Idea's plugin, org.sqlite.JDBC won't auto registe.
* you should call any mehtod which make classloader load org.sqlite.JDBC
*/
val classLoader = App.javaClass.classLoader
val resource: URL = classLoader.getResource("db/QuickRefDB.db")!!
val jdbcURL = "jdbc:sqlite::resource:${resource.toURI()}"
// try call org.sqlite.JDBC.<cinit>
@Haoxiqiang
Haoxiqiang / change-user.sh
Created August 18, 2021 03:58
jenkins rus as root user
1. change jenkins's config
vi /etc/sysconfig/jenkins
edit:
$JENKINS_USER="root"
2. change all files permisions
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
@Haoxiqiang
Haoxiqiang / ViewExtension.kt
Last active August 18, 2021 07:31
avoid the view that contains adapter leak memory
ffun View.traverseAdapterView() {
depthSearchViewGroup()
.forEach { viewGroup ->
clearAdapterReference(viewGroup)
}
}
fun View.depthSearchViewGroup(): MutableList<ViewGroup> {
val viewDeque = LinkedList<View>()
val viewGroups = mutableListOf<ViewGroup>()
@Haoxiqiang
Haoxiqiang / ObjectExtension.kt
Created August 16, 2021 11:41
Copy object's all fields by reflect
inline fun <reified T : Any> mergeFields(from: T, to: T, acceptNULL: Boolean = false) {
from::class.java
.declaredFields
.forEach { field ->
val isLocked = field.isAccessible
field.isAccessible = true
val value = field.get(from)
if (acceptNULL || value != null) {
field.set(to, field.get(from))
}