diff --git a/README.md b/README.md index 581f258..a4c0bff 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,9 @@ fun Activity.startKtxActivityForResult( Fragment.startKtxActivity() Fragment.startKtxActivityForResult() Context.startKtxActivity +Activity.hideKeyboard() +Activity.showKeyboard(et: EditText) +Activity.hideKeyboard(view: View) ``` ### [AppExt](https://github.com/lulululbj/AndroidUtilCodeKTX/blob/master/ktx/src/main/java/luyao/util/ktx/ext/AppExt.kt) @@ -56,6 +59,7 @@ Context.versionCode: Long Context.getAppInfo(apkPath: String): AppInfo Context.getAppInfos(apkFolderPath: String): List Context.getAppSignature(packageName: String = this.packageName): ByteArray? +Context.isPackageInstalled(pkgName: String) ``` ### [AesExt](https://github.com/lulululbj/AndroidUtilCodeKTX/blob/master/ktx/src/main/java/luyao/util/ktx/ext/AesExt.kt) [[Demo]](https://github.com/lulululbj/AndroidUtilCodeKTX/blob/master/ktx/src/test/java/luyao/util/ktx/ext/AesExtKtTest.kt) @@ -91,6 +95,19 @@ Context.screenHeight Context.copyToClipboard(label: String, text: String) Context.checkAccessbilityServiceEnabled(serviceName: String) Any?.notNull(f: () -> T, t: () -> T): T +Context.isRTLLayout +``` + +### [Constants](/ktx/src/main/java/luyao/util/ktx/core/Constants.kt) + +```kotlin +fun isOnMainThread() +``` + +### [DrawableExt](/ktx/src/main/java/luyao/util/ktx/ext/DrawableExt.kt) + +```kotlin +Drawable.convertToBitmap() ``` ### [FileExt](/ktx/src/main/java/luyao/util/ktx/ext/FileExt.kt) @@ -224,6 +241,7 @@ blockLine(@Px height: Int, addBlockAlways: Boolean = false) SearchView.queryTextListener(listener: KtxQueryTextLister.() -> Unit) SeekBar.onProgressBarChanged(callback: (Int, Boolean) -> Unit) TextView.textWatcher(watcher: KtxTextWatcher.() -> Unit) +ViewPager.onPageSelected(pageChangedAction: (newPosition: Int) -> Unit) ``` ### [LogExt](https://github.com/lulululbj/AndroidUtilCodeKTX/blob/master/ktx/src/main/java/luyao/util/ktx/ext/LogExt.kt) @@ -245,6 +263,12 @@ String.loge(tag: String = TAG) Activity.getSpValue(key: String, default: T, name: String = packageName): T ``` +### [StringExt](/ktx/src/main/java/luyao/util/ktx/ext/StringExt.kt) + +```kotlin +String.areDigitsOnly() +``` + ### [SystemServiceExt](https://github.com/lulululbj/AndroidUtilCodeKTX/blob/master/ktx/src/main/java/luyao/util/ktx/ext/SystemServiceExt.kt) ```kotlin @@ -301,6 +325,8 @@ ByteArray.toHexString() : 字节数组转十六进制字符串 View.visible() View.invisible() View.gone() +View.reverseVisiblity(needGone: Boolean = true) +View.changeVisible(visible: Boolean, needGone: Boolean = true) var View.isVisible: Boolean var View.isInvisible: Boolean var View.isGone: Boolean @@ -309,7 +335,9 @@ View.postDelayed(delayInMillis: Long, crossinline action: () -> Unit): Runnable View.toBitmap(config: Bitmap.Config = Bitmap.Config.ARGB_8888): Bitmap RecyclerView.itemPadding(padding:Int) RecyclerView.itemPadding(top: Int, bottom: Int, left: Int = 0, right: Int = 0) -TextView.notEmpty(f: TextView.() -> Unit, t: TextView.() -> Unit) +TextView.notEmpty(f: TextView.() -> Unit, t: TextView.() -> Unit) +View.onGlobalLayout(crossinline callback: () -> Unit) +fun View.afterMeasured(crossinline callback: View.() -> Unit) ``` ### Others diff --git a/app/src/main/java/luyao/util/ktx/ui/CommonExtActivity.kt b/app/src/main/java/luyao/util/ktx/ui/CommonExtActivity.kt index a192b83..933ca84 100644 --- a/app/src/main/java/luyao/util/ktx/ui/CommonExtActivity.kt +++ b/app/src/main/java/luyao/util/ktx/ui/CommonExtActivity.kt @@ -13,7 +13,7 @@ import luyao.util.ktx.ext.toast * Created by luyao * on 2019/7/17 15:26 */ -class CommonExtActivity : BaseActivity() { +class CommonExtActivity : BaseActivity() { override fun getLayoutResId() = R.layout.activity_common_ext @@ -26,9 +26,9 @@ class CommonExtActivity : BaseActivity() { screenHeightBt.text = "screen height : $screenHeight" copyBt.setOnClickListener { val content = copyEt.text.toString() - if (content.isNotEmpty()){ - copyToClipboard("ktx",content) - }else { + if (content.isNotEmpty()) { + copyToClipboard(content) + } else { toast("please input some words") } } diff --git a/app/src/main/java/luyao/util/ktx/ui/ListenerExtActivity.kt b/app/src/main/java/luyao/util/ktx/ui/ListenerExtActivity.kt index d0e14bb..442dbfa 100644 --- a/app/src/main/java/luyao/util/ktx/ui/ListenerExtActivity.kt +++ b/app/src/main/java/luyao/util/ktx/ui/ListenerExtActivity.kt @@ -4,6 +4,7 @@ import kotlinx.android.synthetic.main.activity_listener.* import kotlinx.android.synthetic.main.title_layout.* import luyao.ktx.R import luyao.util.ktx.base.BaseActivity +import luyao.util.ktx.ext.afterMeasured import luyao.util.ktx.ext.listener.onProgressBarChanged import luyao.util.ktx.ext.listener.queryTextListener import luyao.util.ktx.ext.listener.textWatcher @@ -22,6 +23,9 @@ class ListenerExtActivity : BaseActivity() { } override fun initData() { + listenerEt.afterMeasured { + toast("$width $height") + } listenerEt.textWatcher { onTextChanged { s, _, _, _ -> toast(s.toString()) diff --git a/build.gradle b/build.gradle index 5df656c..fd341b8 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.5.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.novoda:bintray-release:0.9' + classpath 'com.novoda:bintray-release:0.9.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/ktx/resources/enc b/ktx/resources/enc index d8a79df..7df9a08 100644 Binary files a/ktx/resources/enc and b/ktx/resources/enc differ diff --git a/ktx/src/main/java/luyao/util/ktx/core/Constants.kt b/ktx/src/main/java/luyao/util/ktx/core/Constants.kt new file mode 100644 index 0000000..d4f0a70 --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/core/Constants.kt @@ -0,0 +1,9 @@ +package luyao.util.ktx.core + +import android.os.Looper + +/** + * Created by luyao + * on 2019/8/30 15:06 + */ +fun isOnMainThread() = Looper.myLooper() == Looper.getMainLooper() \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/core/util/MimeType.kt b/ktx/src/main/java/luyao/util/ktx/core/util/MimeType.kt index e954566..5953661 100644 --- a/ktx/src/main/java/luyao/util/ktx/core/util/MimeType.kt +++ b/ktx/src/main/java/luyao/util/ktx/core/util/MimeType.kt @@ -4,132 +4,625 @@ import android.webkit.MimeTypeMap import java.util.* import java.util.regex.Pattern -class MimeType { +private const val ALL_MIME_TYPES = "*/*" +val MIME_TYPES = HashMap().apply { + put("323", "text/h323") + put("3g2", "video/3gpp2") + put("3gp", "video/3gpp") + put("3gp2", "video/3gpp2") + put("3gpp", "video/3gpp") + put("7z", "application/x-7z-compressed") + put("aa", "audio/audible") + put("aac", "audio/aac") + put("aaf", "application/octet-stream") + put("aax", "audio/vnd.audible.aax") + put("ac3", "audio/ac3") + put("aca", "application/octet-stream") + put("accda", "application/msaccess.addin") + put("accdb", "application/msaccess") + put("accdc", "application/msaccess.cab") + put("accde", "application/msaccess") + put("accdr", "application/msaccess.runtime") + put("accdt", "application/msaccess") + put("accdw", "application/msaccess.webapplication") + put("accft", "application/msaccess.ftemplate") + put("acx", "application/internet-property-stream") + put("addin", "text/xml") + put("ade", "application/msaccess") + put("adobebridge", "application/x-bridge-url") + put("adp", "application/msaccess") + put("adt", "audio/vnd.dlna.adts") + put("adts", "audio/aac") + put("afm", "application/octet-stream") + put("ai", "application/postscript") + put("aif", "audio/aiff") + put("aifc", "audio/aiff") + put("aiff", "audio/aiff") + put("air", "application/vnd.adobe.air-application-installer-package+zip") + put("amc", "application/mpeg") + put("anx", "application/annodex") + put("apk", "application/vnd.android.package-archive") + put("application", "application/x-ms-application") + put("art", "image/x-jg") + put("asa", "application/xml") + put("asax", "application/xml") + put("ascx", "application/xml") + put("asd", "application/octet-stream") + put("asf", "video/x-ms-asf") + put("ashx", "application/xml") + put("asi", "application/octet-stream") + put("asm", "text/plain") + put("asmx", "application/xml") + put("aspx", "application/xml") + put("asr", "video/x-ms-asf") + put("asx", "video/x-ms-asf") + put("atom", "application/atom+xml") + put("au", "audio/basic") + put("avi", "video/x-msvideo") + put("axa", "audio/annodex") + put("axs", "application/olescript") + put("axv", "video/annodex") + put("bas", "text/plain") + put("bcpio", "application/x-bcpio") + put("bin", "application/octet-stream") + put("bmp", "image/bmp") + put("c", "text/plain") + put("cab", "application/octet-stream") + put("caf", "audio/x-caf") + put("calx", "application/vnd.ms-office.calx") + put("cat", "application/vnd.ms-pki.seccat") + put("cc", "text/plain") + put("cd", "text/plain") + put("cdda", "audio/aiff") + put("cdf", "application/x-cdf") + put("cer", "application/x-x509-ca-cert") + put("cfg", "text/plain") + put("chm", "application/octet-stream") + put("class", "application/x-java-applet") + put("clp", "application/x-msclip") + put("cmd", "text/plain") + put("cmx", "image/x-cmx") + put("cnf", "text/plain") + put("cod", "image/cis-cod") + put("config", "application/xml") + put("contact", "text/x-ms-contact") + put("coverage", "application/xml") + put("cpio", "application/x-cpio") + put("cpp", "text/plain") + put("crd", "application/x-mscardfile") + put("crl", "application/pkix-crl") + put("crt", "application/x-x509-ca-cert") + put("cs", "text/plain") + put("csdproj", "text/plain") + put("csh", "application/x-csh") + put("csproj", "text/plain") + put("css", "text/css") + put("csv", "text/csv") + put("cur", "application/octet-stream") + put("cxx", "text/plain") + put("dat", "application/octet-stream") + put("datasource", "application/xml") + put("dbproj", "text/plain") + put("dcr", "application/x-director") + put("def", "text/plain") + put("deploy", "application/octet-stream") + put("der", "application/x-x509-ca-cert") + put("dgml", "application/xml") + put("dib", "image/bmp") + put("dif", "video/x-dv") + put("dir", "application/x-director") + put("disco", "text/xml") + put("divx", "video/divx") + put("dll", "application/x-msdownload") + put("dll.config", "text/xml") + put("dlm", "text/dlm") + put("dng", "image/x-adobe-dng") + put("doc", "application/msword") + put("docm", "application/vnd.ms-word.document.macroEnabled.12") + put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document") + put("dot", "application/msword") + put("dotm", "application/vnd.ms-word.template.macroEnabled.12") + put("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template") + put("dsp", "application/octet-stream") + put("dsw", "text/plain") + put("dtd", "text/xml") + put("dtsconfig", "text/xml") + put("dv", "video/x-dv") + put("dvi", "application/x-dvi") + put("dwf", "drawing/x-dwf") + put("dwp", "application/octet-stream") + put("dxr", "application/x-director") + put("eml", "message/rfc822") + put("emz", "application/octet-stream") + put("eot", "application/vnd.ms-fontobject") + put("eps", "application/postscript") + put("etl", "application/etl") + put("etx", "text/x-setext") + put("evy", "application/envoy") + put("exe", "application/octet-stream") + put("exe.config", "text/xml") + put("fdf", "application/vnd.fdf") + put("fif", "application/fractals") + put("filters", "application/xml") + put("fla", "application/octet-stream") + put("flac", "audio/flac") + put("flr", "x-world/x-vrml") + put("flv", "video/x-flv") + put("fsscript", "application/fsharp-script") + put("fsx", "application/fsharp-script") + put("generictest", "application/xml") + put("gif", "image/gif") + put("group", "text/x-ms-group") + put("gsm", "audio/x-gsm") + put("gtar", "application/x-gtar") + put("gz", "application/x-gzip") + put("h", "text/plain") + put("hdf", "application/x-hdf") + put("hdml", "text/x-hdml") + put("hhc", "application/x-oleobject") + put("hhk", "application/octet-stream") + put("hhp", "application/octet-stream") + put("hlp", "application/winhlp") + put("hpp", "text/plain") + put("hqx", "application/mac-binhex40") + put("hta", "application/hta") + put("htc", "text/x-component") + put("htm", "text/html") + put("html", "text/html") + put("htt", "text/webviewhtml") + put("hxa", "application/xml") + put("hxc", "application/xml") + put("hxd", "application/octet-stream") + put("hxe", "application/xml") + put("hxf", "application/xml") + put("hxh", "application/octet-stream") + put("hxi", "application/octet-stream") + put("hxk", "application/xml") + put("hxq", "application/octet-stream") + put("hxr", "application/octet-stream") + put("hxs", "application/octet-stream") + put("hxt", "text/html") + put("hxv", "application/xml") + put("hxw", "application/octet-stream") + put("hxx", "text/plain") + put("i", "text/plain") + put("ico", "image/x-icon") + put("ics", "text/calendar") + put("idl", "text/plain") + put("ief", "image/ief") + put("iii", "application/x-iphone") + put("inc", "text/plain") + put("inf", "application/octet-stream") + put("ini", "text/plain") + put("inl", "text/plain") + put("ins", "application/x-internet-signup") + put("ipa", "application/x-itunes-ipa") + put("ipg", "application/x-itunes-ipg") + put("ipproj", "text/plain") + put("ipsw", "application/x-itunes-ipsw") + put("iqy", "text/x-ms-iqy") + put("isp", "application/x-internet-signup") + put("ite", "application/x-itunes-ite") + put("itlp", "application/x-itunes-itlp") + put("itms", "application/x-itunes-itms") + put("itpc", "application/x-itunes-itpc") + put("ivf", "video/x-ivf") + put("jar", "application/java-archive") + put("java", "application/octet-stream") + put("jck", "application/liquidmotion") + put("jcz", "application/liquidmotion") + put("jfif", "image/pjpeg") + put("jnlp", "application/x-java-jnlp-file") + put("jpb", "application/octet-stream") + put("jpe", "image/jpeg") + put("jpeg", "image/jpeg") + put("jpg", "image/jpeg") + put("js", "application/javascript") + put("json", "application/json") + put("jsx", "text/jscript") + put("jsxbin", "text/plain") + put("latex", "application/x-latex") + put("library-ms", "application/windows-library+xml") + put("lit", "application/x-ms-reader") + put("loadtest", "application/xml") + put("lpk", "application/octet-stream") + put("lsf", "video/x-la-asf") + put("lst", "text/plain") + put("lsx", "video/x-la-asf") + put("lzh", "application/octet-stream") + put("m13", "application/x-msmediaview") + put("m14", "application/x-msmediaview") + put("m1v", "video/mpeg") + put("m2t", "video/vnd.dlna.mpeg-tts") + put("m2ts", "video/vnd.dlna.mpeg-tts") + put("m2v", "video/mpeg") + put("m3u", "audio/x-mpegurl") + put("m3u8", "audio/x-mpegurl") + put("m4a", "audio/m4a") + put("m4b", "audio/m4b") + put("m4p", "audio/m4p") + put("m4r", "audio/x-m4r") + put("m4v", "video/x-m4v") + put("mac", "image/x-macpaint") + put("mak", "text/plain") + put("man", "application/x-troff-man") + put("manifest", "application/x-ms-manifest") + put("map", "text/plain") + put("master", "application/xml") + put("mda", "application/msaccess") + put("mdb", "application/x-msaccess") + put("mde", "application/msaccess") + put("mdp", "application/octet-stream") + put("me", "application/x-troff-me") + put("mfp", "application/x-shockwave-flash") + put("mht", "message/rfc822") + put("mhtml", "message/rfc822") + put("mid", "audio/mid") + put("midi", "audio/mid") + put("mix", "application/octet-stream") + put("mk", "text/plain") + put("mkv", "video/x-matroska") + put("mmf", "application/x-smaf") + put("mno", "text/xml") + put("mny", "application/x-msmoney") + put("mod", "video/mpeg") + put("mov", "video/quicktime") + put("movie", "video/x-sgi-movie") + put("mp2", "video/mpeg") + put("mp2v", "video/mpeg") + put("mp3", "audio/mpeg") + put("mp4", "video/mp4") + put("mp4v", "video/mp4") + put("mpa", "video/mpeg") + put("mpe", "video/mpeg") + put("mpeg", "video/mpeg") + put("mpf", "application/vnd.ms-mediapackage") + put("mpg", "video/mpeg") + put("mpp", "application/vnd.ms-project") + put("mpv2", "video/mpeg") + put("mqv", "video/quicktime") + put("ms", "application/x-troff-ms") + put("msi", "application/octet-stream") + put("mso", "application/octet-stream") + put("mts", "video/vnd.dlna.mpeg-tts") + put("mtx", "application/xml") + put("mvb", "application/x-msmediaview") + put("mvc", "application/x-miva-compiled") + put("mxp", "application/x-mmxp") + put("nc", "application/x-netcdf") + put("nsc", "video/x-ms-asf") + put("nws", "message/rfc822") + put("ocx", "application/octet-stream") + put("oda", "application/oda") + put("odb", "application/vnd.oasis.opendocument.database") + put("odc", "application/vnd.oasis.opendocument.chart") + put("odf", "application/vnd.oasis.opendocument.formula") + put("odg", "application/vnd.oasis.opendocument.graphics") + put("odh", "text/plain") + put("odi", "application/vnd.oasis.opendocument.image") + put("odl", "text/plain") + put("odm", "application/vnd.oasis.opendocument.text-master") + put("odp", "application/vnd.oasis.opendocument.presentation") + put("ods", "application/vnd.oasis.opendocument.spreadsheet") + put("odt", "application/vnd.oasis.opendocument.text") + put("oga", "audio/ogg") + put("ogg", "audio/ogg") + put("ogv", "video/ogg") + put("ogx", "application/ogg") + put("one", "application/onenote") + put("onea", "application/onenote") + put("onepkg", "application/onenote") + put("onetmp", "application/onenote") + put("onetoc", "application/onenote") + put("onetoc2", "application/onenote") + put("opus", "audio/ogg") + put("orderedtest", "application/xml") + put("osdx", "application/opensearchdescription+xml") + put("otf", "application/font-sfnt") + put("otg", "application/vnd.oasis.opendocument.graphics-template") + put("oth", "application/vnd.oasis.opendocument.text-web") + put("otp", "application/vnd.oasis.opendocument.presentation-template") + put("ots", "application/vnd.oasis.opendocument.spreadsheet-template") + put("ott", "application/vnd.oasis.opendocument.text-template") + put("oxt", "application/vnd.openofficeorg.extension") + put("p10", "application/pkcs10") + put("p12", "application/x-pkcs12") + put("p7b", "application/x-pkcs7-certificates") + put("p7c", "application/pkcs7-mime") + put("p7m", "application/pkcs7-mime") + put("p7r", "application/x-pkcs7-certreqresp") + put("p7s", "application/pkcs7-signature") + put("pbm", "image/x-portable-bitmap") + put("pcast", "application/x-podcast") + put("pct", "image/pict") + put("pcx", "application/octet-stream") + put("pcz", "application/octet-stream") + put("pdf", "application/pdf") + put("pfb", "application/octet-stream") + put("pfm", "application/octet-stream") + put("pfx", "application/x-pkcs12") + put("pgm", "image/x-portable-graymap") + put("php", "text/plain") + put("pic", "image/pict") + put("pict", "image/pict") + put("pkgdef", "text/plain") + put("pkgundef", "text/plain") + put("pko", "application/vnd.ms-pki.pko") + put("pls", "audio/scpls") + put("pma", "application/x-perfmon") + put("pmc", "application/x-perfmon") + put("pml", "application/x-perfmon") + put("pmr", "application/x-perfmon") + put("pmw", "application/x-perfmon") + put("png", "image/png") + put("pnm", "image/x-portable-anymap") + put("pnt", "image/x-macpaint") + put("pntg", "image/x-macpaint") + put("pnz", "image/png") + put("pot", "application/vnd.ms-powerpoint") + put("potm", "application/vnd.ms-powerpoint.template.macroEnabled.12") + put("potx", "application/vnd.openxmlformats-officedocument.presentationml.template") + put("ppa", "application/vnd.ms-powerpoint") + put("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12") + put("ppm", "image/x-portable-pixmap") + put("pps", "application/vnd.ms-powerpoint") + put("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12") + put("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow") + put("ppt", "application/vnd.ms-powerpoint") + put("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12") + put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation") + put("prf", "application/pics-rules") + put("prm", "application/octet-stream") + put("prx", "application/octet-stream") + put("ps", "application/postscript") + put("psc1", "application/PowerShell") + put("psd", "application/octet-stream") + put("psess", "application/xml") + put("psm", "application/octet-stream") + put("psp", "application/octet-stream") + put("pub", "application/x-mspublisher") + put("pwz", "application/vnd.ms-powerpoint") + put("py", "text/plain") + put("qht", "text/x-html-insertion") + put("qhtm", "text/x-html-insertion") + put("qt", "video/quicktime") + put("qti", "image/x-quicktime") + put("qtif", "image/x-quicktime") + put("qtl", "application/x-quicktimeplayer") + put("qxd", "application/octet-stream") + put("ra", "audio/x-pn-realaudio") + put("ram", "audio/x-pn-realaudio") + put("rar", "application/x-rar-compressed") + put("ras", "image/x-cmu-raster") + put("rat", "application/rat-file") + put("rb", "text/plain") + put("rc", "text/plain") + put("rc2", "text/plain") + put("rct", "text/plain") + put("rdlc", "application/xml") + put("reg", "text/plain") + put("resx", "application/xml") + put("rf", "image/vnd.rn-realflash") + put("rgb", "image/x-rgb") + put("rgs", "text/plain") + put("rm", "application/vnd.rn-realmedia") + put("rmi", "audio/mid") + put("rmp", "application/vnd.rn-rn_music_package") + put("roff", "application/x-troff") + put("rpm", "audio/x-pn-realaudio-plugin") + put("rqy", "text/x-ms-rqy") + put("rtf", "application/rtf") + put("rtx", "text/richtext") + put("ruleset", "application/xml") + put("s", "text/plain") + put("safariextz", "application/x-safari-safariextz") + put("scd", "application/x-msschedule") + put("scr", "text/plain") + put("sct", "text/scriptlet") + put("sd2", "audio/x-sd2") + put("sdp", "application/sdp") + put("sea", "application/octet-stream") + put("searchConnector-ms", "application/windows-search-connector+xml") + put("setpay", "application/set-payment-initiation") + put("setreg", "application/set-registration-initiation") + put("settings", "application/xml") + put("sgimb", "application/x-sgimb") + put("sgml", "text/sgml") + put("sh", "application/x-sh") + put("shar", "application/x-shar") + put("shtml", "text/html") + put("sit", "application/x-stuffit") + put("sitemap", "application/xml") + put("skin", "application/xml") + put("sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12") + put("sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide") + put("slk", "application/vnd.ms-excel") + put("sln", "text/plain") + put("slupkg-ms", "application/x-ms-license") + put("smd", "audio/x-smd") + put("smi", "application/octet-stream") + put("smx", "audio/x-smd") + put("smz", "audio/x-smd") + put("snd", "audio/basic") + put("snippet", "application/xml") + put("snp", "application/octet-stream") + put("sol", "text/plain") + put("sor", "text/plain") + put("spc", "application/x-pkcs7-certificates") + put("spl", "application/futuresplash") + put("spx", "audio/ogg") + put("src", "application/x-wais-source") + put("srf", "text/plain") + put("ssisdeploymentmanifest", "text/xml") + put("ssm", "application/streamingmedia") + put("sst", "application/vnd.ms-pki.certstore") + put("stl", "application/vnd.ms-pki.stl") + put("sv4cpio", "application/x-sv4cpio") + put("sv4crc", "application/x-sv4crc") + put("svc", "application/xml") + put("svg", "image/svg+xml") + put("swf", "application/x-shockwave-flash") + put("t", "application/x-troff") + put("tar", "application/x-tar") + put("tcl", "application/x-tcl") + put("testrunconfig", "application/xml") + put("testsettings", "application/xml") + put("tex", "application/x-tex") + put("texi", "application/x-texinfo") + put("texinfo", "application/x-texinfo") + put("tgz", "application/x-compressed") + put("thmx", "application/vnd.ms-officetheme") + put("thn", "application/octet-stream") + put("tif", "image/tiff") + put("tiff", "image/tiff") + put("tlh", "text/plain") + put("tli", "text/plain") + put("toc", "application/octet-stream") + put("tr", "application/x-troff") + put("trm", "application/x-msterminal") + put("trx", "application/xml") + put("ts", "video/vnd.dlna.mpeg-tts") + put("tsv", "text/tab-separated-values") + put("ttf", "application/font-sfnt") + put("tts", "video/vnd.dlna.mpeg-tts") + put("txt", "text/plain") + put("u32", "application/octet-stream") + put("uls", "text/iuls") + put("user", "text/plain") + put("ustar", "application/x-ustar") + put("vb", "text/plain") + put("vbdproj", "text/plain") + put("vbk", "video/mpeg") + put("vbproj", "text/plain") + put("vbs", "text/vbscript") + put("vcf", "text/x-vcard") + put("vcproj", "application/xml") + put("vcs", "text/plain") + put("vcxproj", "application/xml") + put("vddproj", "text/plain") + put("vdp", "text/plain") + put("vdproj", "text/plain") + put("vdx", "application/vnd.ms-visio.viewer") + put("vml", "text/xml") + put("vscontent", "application/xml") + put("vsct", "text/xml") + put("vsd", "application/vnd.visio") + put("vsi", "application/ms-vsi") + put("vsix", "application/vsix") + put("vsixlangpack", "text/xml") + put("vsixmanifest", "text/xml") + put("vsmdi", "application/xml") + put("vspscc", "text/plain") + put("vss", "application/vnd.visio") + put("vsscc", "text/plain") + put("vssettings", "text/xml") + put("vssscc", "text/plain") + put("vst", "application/vnd.visio") + put("vstemplate", "text/xml") + put("vsto", "application/x-ms-vsto") + put("vsw", "application/vnd.visio") + put("vsx", "application/vnd.visio") + put("vtx", "application/vnd.visio") + put("wav", "audio/wav") + put("wave", "audio/wav") + put("wax", "audio/x-ms-wax") + put("wbk", "application/msword") + put("wbmp", "image/vnd.wap.wbmp") + put("wcm", "application/vnd.ms-works") + put("wdb", "application/vnd.ms-works") + put("wdp", "image/vnd.ms-photo") + put("webarchive", "application/x-safari-webarchive") + put("webm", "video/webm") + put("webp", "image/webp") + put("webtest", "application/xml") + put("wiq", "application/xml") + put("wiz", "application/msword") + put("wks", "application/vnd.ms-works") + put("wlmp", "application/wlmoviemaker") + put("wlpginstall", "application/x-wlpg-detect") + put("wlpginstall3", "application/x-wlpg3-detect") + put("wm", "video/x-ms-wm") + put("wma", "audio/x-ms-wma") + put("wmd", "application/x-ms-wmd") + put("wmf", "application/x-msmetafile") + put("wml", "text/vnd.wap.wml") + put("wmlc", "application/vnd.wap.wmlc") + put("wmls", "text/vnd.wap.wmlscript") + put("wmlsc", "application/vnd.wap.wmlscriptc") + put("wmp", "video/x-ms-wmp") + put("wmv", "video/x-ms-wmv") + put("wmx", "video/x-ms-wmx") + put("wmz", "application/x-ms-wmz") + put("woff", "application/font-woff") + put("wpl", "application/vnd.ms-wpl") + put("wps", "application/vnd.ms-works") + put("wri", "application/x-mswrite") + put("wrl", "x-world/x-vrml") + put("wrz", "x-world/x-vrml") + put("wsc", "text/scriptlet") + put("wsdl", "text/xml") + put("wvx", "video/x-ms-wvx") + put("x", "application/directx") + put("xaf", "x-world/x-vrml") + put("xaml", "application/xaml+xml") + put("xap", "application/x-silverlight-app") + put("xbap", "application/x-ms-xbap") + put("xbm", "image/x-xbitmap") + put("xdr", "text/plain") + put("xht", "application/xhtml+xml") + put("xhtml", "application/xhtml+xml") + put("xla", "application/vnd.ms-excel") + put("xlam", "application/vnd.ms-excel.addin.macroEnabled.12") + put("xlc", "application/vnd.ms-excel") + put("xld", "application/vnd.ms-excel") + put("xlk", "application/vnd.ms-excel") + put("xll", "application/vnd.ms-excel") + put("xlm", "application/vnd.ms-excel") + put("xls", "application/vnd.ms-excel") + put("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12") + put("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12") + put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + put("xlt", "application/vnd.ms-excel") + put("xltm", "application/vnd.ms-excel.template.macroEnabled.12") + put("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template") + put("xlw", "application/vnd.ms-excel") + put("xml", "text/xml") + put("xmta", "application/xml") + put("xof", "x-world/x-vrml") + put("xoml", "text/plain") + put("xpm", "image/x-xpixmap") + put("xps", "application/vnd.ms-xpsdocument") + put("xrm-ms", "text/xml") + put("xsc", "application/xml") + put("xsd", "text/xml") + put("xsf", "text/xml") + put("xsl", "text/xml") + put("xslt", "text/xml") + put("xsn", "application/octet-stream") + put("xss", "application/xml") + put("xspf", "application/xspf+xml") + put("xtp", "application/octet-stream") + put("xwd", "image/x-xwindowdump") + put("z", "application/x-compress") + put("zip", "application/zip") +} - companion object { - private const val ALL_MIME_TYPES = "*/*" - private val MIME_TYPES = HashMap(1 + (66 / 0.75).toInt()) - - fun getMimeType(extension: String, isDirectory: Boolean): String { - if (isDirectory) { - return "" - } - - var type: String? = ALL_MIME_TYPES - - // mapping extension to system mime types - if (extension.isNotEmpty()) { - val extensionLowerCase = extension.toLowerCase(Locale - .getDefault()) - val mime = MimeTypeMap.getSingleton() - type = mime.getMimeTypeFromExtension(extensionLowerCase) - if (type == null) { - type = MIME_TYPES[extensionLowerCase] - } - } - if (type == null) type = ALL_MIME_TYPES - return type - } - - fun mimeTypeMatch(mime: String, input: String): Boolean { - return Pattern.matches(mime.replace("*", ".*"), input) - } - - - /** - * Helper method for [.getMimeType] - * to calculate the last '.' extension of files - * @param path the path of file - * @return extension extracted from name in lowercase - */ - fun getExtension(path: String): String { - return if (path.contains(".")) - path.substring(path.lastIndexOf(".") + 1).toLowerCase() - else - "" - } - } - init { - /* - * ================= MIME TYPES ==================== - */ - MIME_TYPES["asm"] = "text/x-asm" - MIME_TYPES["json"] = "application/json" - MIME_TYPES["js"] = "application/javascript" - - MIME_TYPES["def"] = "text/plain" - MIME_TYPES["in"] = "text/plain" - MIME_TYPES["rc"] = "text/plain" - MIME_TYPES["list"] = "text/plain" - MIME_TYPES["log"] = "text/plain" - MIME_TYPES["pl"] = "text/plain" - MIME_TYPES["prop"] = "text/plain" - MIME_TYPES["properties"] = "text/plain" - MIME_TYPES["rc"] = "text/plain" - MIME_TYPES["ini"] = "text/plain" - MIME_TYPES["md"] = "text/markdown" - - MIME_TYPES["epub"] = "application/epub+zip" - MIME_TYPES["ibooks"] = "application/x-ibooks+zip" - - MIME_TYPES["ifb"] = "text/calendar" - MIME_TYPES["eml"] = "message/rfc822" - MIME_TYPES["msg"] = "application/vnd.ms-outlook" - - MIME_TYPES["ace"] = "application/x-ace-compressed" - MIME_TYPES["bz"] = "application/x-bzip" - MIME_TYPES["bz2"] = "application/x-bzip2" - MIME_TYPES["cab"] = "application/vnd.ms-cab-compressed" - MIME_TYPES["gz"] = "application/x-gzip" - MIME_TYPES["lrf"] = "application/octet-stream" - MIME_TYPES["jar"] = "application/java-archive" - MIME_TYPES["xz"] = "application/x-xz" - MIME_TYPES["Z"] = "application/x-compress" - - MIME_TYPES["bat"] = "application/x-msdownload" - MIME_TYPES["ksh"] = "text/plain" - MIME_TYPES["sh"] = "application/x-sh" - - MIME_TYPES["db"] = "application/octet-stream" - MIME_TYPES["db3"] = "application/octet-stream" - - MIME_TYPES["otf"] = "application/x-font-otf" - MIME_TYPES["ttf"] = "application/x-font-ttf" - MIME_TYPES["psf"] = "application/x-font-linux-psf" - - MIME_TYPES["cgm"] = "image/cgm" - MIME_TYPES["btif"] = "image/prs.btif" - MIME_TYPES["dwg"] = "image/vnd.dwg" - MIME_TYPES["dxf"] = "image/vnd.dxf" - MIME_TYPES["fbs"] = "image/vnd.fastbidsheet" - MIME_TYPES["fpx"] = "image/vnd.fpx" - MIME_TYPES["fst"] = "image/vnd.fst" - MIME_TYPES["mdi"] = "image/vnd.ms-mdi" - MIME_TYPES["npx"] = "image/vnd.net-fpx" - MIME_TYPES["xif"] = "image/vnd.xiff" - MIME_TYPES["pct"] = "image/x-pict" - MIME_TYPES["pic"] = "image/x-pict" - - MIME_TYPES["adp"] = "audio/adpcm" - MIME_TYPES["au"] = "audio/basic" - MIME_TYPES["snd"] = "audio/basic" - MIME_TYPES["m2a"] = "audio/mpeg" - MIME_TYPES["m3a"] = "audio/mpeg" - MIME_TYPES["oga"] = "audio/ogg" - MIME_TYPES["spx"] = "audio/ogg" - MIME_TYPES["aac"] = "audio/x-aac" - MIME_TYPES["mka"] = "audio/x-matroska" - - MIME_TYPES["jpgv"] = "video/jpeg" - MIME_TYPES["jpgm"] = "video/jpm" - MIME_TYPES["jpm"] = "video/jpm" - MIME_TYPES["mj2"] = "video/mj2" - MIME_TYPES["mjp2"] = "video/mj2" - MIME_TYPES["mpa"] = "video/mpeg" - MIME_TYPES["ogv"] = "video/ogg" - MIME_TYPES["flv"] = "video/x-flv" - MIME_TYPES["mkv"] = "video/x-matroska" +fun getMimeType(extension: String, isDirectory: Boolean): String { + if (isDirectory) { + return "" } + var type: String? = ALL_MIME_TYPES -} \ No newline at end of file + if (extension.isNotEmpty()) { + val extensionLowerCase = extension.toLowerCase(Locale + .getDefault()) + val mime = MimeTypeMap.getSingleton() + type = mime.getMimeTypeFromExtension(extensionLowerCase) + if (type == null) { + type = MIME_TYPES[extensionLowerCase] + } + } + if (type == null) type = ALL_MIME_TYPES + return type +} diff --git a/ktx/src/main/java/luyao/util/ktx/ext/ActivityExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/ActivityExt.kt index 6a0a958..0b64174 100644 --- a/ktx/src/main/java/luyao/util/ktx/ext/ActivityExt.kt +++ b/ktx/src/main/java/luyao/util/ktx/ext/ActivityExt.kt @@ -5,6 +5,10 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Parcelable +import android.view.View +import android.view.WindowManager +import android.view.inputmethod.InputMethodManager +import android.widget.EditText import androidx.fragment.app.Fragment import java.io.Serializable @@ -123,3 +127,18 @@ inline fun Context.getIntent( } } +fun Activity.hideKeyboard() { + inputMethodManager?.hideSoftInputFromWindow((currentFocus ?: View(this)).windowToken, 0) + window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) + currentFocus?.clearFocus() +} + +fun Activity.showKeyboard(et: EditText) { + et.requestFocus() + inputMethodManager?.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT) +} + +fun Activity.hideKeyboard(view: View) { + inputMethodManager?.hideSoftInputFromWindow(view.windowToken, 0) +} + diff --git a/ktx/src/main/java/luyao/util/ktx/ext/AppExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/AppExt.kt index bf9662e..542cfe1 100644 --- a/ktx/src/main/java/luyao/util/ktx/ext/AppExt.kt +++ b/ktx/src/main/java/luyao/util/ktx/ext/AppExt.kt @@ -47,4 +47,13 @@ fun Context.getAppSignature(packageName: String = this.packageName): ByteArray? return signatures[0].toByteArray() } +fun Context.isPackageInstalled(pkgName: String): Boolean { + return try { + packageManager.getPackageInfo(pkgName, 0) + true + } catch (e: Exception) { + false + } +} + diff --git a/ktx/src/main/java/luyao/util/ktx/ext/CommonExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/CommonExt.kt index d1c3a9f..b4731c3 100644 --- a/ktx/src/main/java/luyao/util/ktx/ext/CommonExt.kt +++ b/ktx/src/main/java/luyao/util/ktx/ext/CommonExt.kt @@ -12,6 +12,16 @@ import android.view.View * on 2019/6/14 14:23 */ +val Context.isRTLLayout: Boolean get() = resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL + +val Context.screenWidth + get() = resources.displayMetrics.widthPixels + +val Context.screenHeight + get() = resources.displayMetrics.heightPixels + + + fun fromM() = fromSpecificVersion(Build.VERSION_CODES.M) fun beforeM() = beforeSpecificVersion(Build.VERSION_CODES.M) fun fromN() = fromSpecificVersion(Build.VERSION_CODES.N) @@ -47,14 +57,7 @@ fun View.px2dp(px: Int): Int { return (px / scale + 0.5f).toInt() } - -val Context.screenWidth - get() = resources.displayMetrics.widthPixels - -val Context.screenHeight - get() = resources.displayMetrics.heightPixels - -fun Context.copyToClipboard(label: String, text: String) { +fun Context.copyToClipboard(text: String,label: String = "KTX") { val clipData = ClipData.newPlainText(label, text) clipboardManager?.primaryClip = clipData } diff --git a/ktx/src/main/java/luyao/util/ktx/ext/DrawableExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/DrawableExt.kt new file mode 100644 index 0000000..7ef2229 --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/ext/DrawableExt.kt @@ -0,0 +1,29 @@ +package luyao.util.ktx.ext + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable + +/** + * Created by luyao + * on 2019/8/30 15:27 + */ +fun Drawable.convertToBitmap(): Bitmap { + val bitmap = if (intrinsicWidth <= 0 || intrinsicHeight <= 0) { + Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) + } else { + Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888) + } + + if (this is BitmapDrawable) { + if (this.bitmap != null) { + return this.bitmap + } + } + + val canvas = Canvas(bitmap!!) + setBounds(0, 0, canvas.width, canvas.height) + draw(canvas) + return bitmap +} \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/ext/FileExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/FileExt.kt index 62e8203..12f416f 100644 --- a/ktx/src/main/java/luyao/util/ktx/ext/FileExt.kt +++ b/ktx/src/main/java/luyao/util/ktx/ext/FileExt.kt @@ -1,7 +1,7 @@ package luyao.util.ktx.ext import luyao.util.ktx.core.func.* -import luyao.util.ktx.core.util.MimeType +import luyao.util.ktx.core.util.getMimeType import java.io.File import java.nio.charset.Charset @@ -20,7 +20,7 @@ val File.formatSize: String get() = getFormatFileSize(totalSize) val File.mimeType: String - get() = MimeType.getMimeType(extension, isDirectory) + get() = getMimeType(extension, isDirectory) fun File.listFiles(isRecursive: Boolean = false, filter: ((file: File) -> Boolean)? = null): Array { val fileList = if (!isRecursive) listFiles() else getAllSubFile(this) diff --git a/ktx/src/main/java/luyao/util/ktx/ext/StringExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/StringExt.kt index 4977ccf..c941787 100644 --- a/ktx/src/main/java/luyao/util/ktx/ext/StringExt.kt +++ b/ktx/src/main/java/luyao/util/ktx/ext/StringExt.kt @@ -7,4 +7,6 @@ package luyao.util.ktx.ext fun String?.notNull(f: () -> T, t: () -> T): T { return if (this != null) f() else t() -} \ No newline at end of file +} + +fun String.areDigitsOnly() = matches(Regex("[0-9]+")) \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/ext/ViewExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/ViewExt.kt index aa2d52e..c184e62 100644 --- a/ktx/src/main/java/luyao/util/ktx/ext/ViewExt.kt +++ b/ktx/src/main/java/luyao/util/ktx/ext/ViewExt.kt @@ -4,18 +4,42 @@ import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.drawable.BitmapDrawable +import android.os.Build import android.view.View +import android.view.ViewTreeObserver import android.widget.ImageView import androidx.annotation.Px +import androidx.annotation.RequiresApi /** * Created by luyao * on 2019/7/9 9:45 */ -fun View.visible() = run { visibility = View.VISIBLE } +fun View.visible() { + visibility = View.VISIBLE +} -fun View.invisible() = run { visibility = View.INVISIBLE } -fun View.gone() = run { visibility = View.GONE } +fun View.invisible() { + visibility = View.INVISIBLE +} + +fun View.gone() { + visibility = View.GONE +} + +fun View.reverseVisiblity(needGone: Boolean = true) { + if (isVisible) { + if (needGone) gone() else invisible() + } else visible() +} + +fun View.changeVisible(visible: Boolean, needGone: Boolean = true) { + when { + visible -> visible() + needGone -> gone() + else -> invisible() + } +} var View.isVisible: Boolean get() = visibility == View.VISIBLE @@ -71,4 +95,26 @@ fun createBitmapSafely(width: Int, height: Int, config: Bitmap.Config, retryCoun return null } +} + +inline fun View.onGlobalLayout(crossinline callback: () -> Unit) = with(viewTreeObserver) { + addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + @RequiresApi(Build.VERSION_CODES.JELLY_BEAN) + override fun onGlobalLayout() { + removeOnGlobalLayoutListener(this) + callback() + } + }) +} + +inline fun View.afterMeasured(crossinline callback: View.() -> Unit) { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + @RequiresApi(Build.VERSION_CODES.JELLY_BEAN) + override fun onGlobalLayout() { + if (measuredWidth > 0 && measuredHeight > 0) { + viewTreeObserver.removeOnGlobalLayoutListener(this) + callback() + } + } + }) } \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/ext/listener/ViewPagerExt.kt b/ktx/src/main/java/luyao/util/ktx/ext/listener/ViewPagerExt.kt new file mode 100644 index 0000000..7caf25e --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/ext/listener/ViewPagerExt.kt @@ -0,0 +1,18 @@ +package luyao.util.ktx.ext.listener + +import androidx.viewpager.widget.ViewPager + +/** + * Created by luyao + * on 2019/8/30 16:31 + */ +fun ViewPager.onPageSelected(pageChangedAction: (newPosition: Int) -> Unit) = + addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) {} + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} + + override fun onPageSelected(position: Int) { + pageChangedAction(position) + } + })