commit 5f9a6a387f713d82c720bb4930f569f543f4d6ef Author: NerLink Date: Fri May 7 17:04:01 2021 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..3f92dbb --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +LspView \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5cd135a --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6199cc2 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..31b8306 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Build +### Windows + git clone https://github.com/Inxtes/LspView.git + cd LspView + .\gradlew app:assembleDebug + + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..f967d28 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,53 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "com.lsp.view" + minSdkVersion 25 + targetSdkVersion 30 + versionCode 102 + versionName "1.0.2" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation 'com.lcodecorex:tkrefreshlayout:1.0.7' + api 'com.google.android:flexbox:1.0.0' + implementation ('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0') + implementation ('com.google.android.material:material:1.3.0') + implementation ('com.squareup.retrofit2:retrofit:2.9.0') + implementation ('com.squareup.retrofit2:converter-gson:2.9.0') + implementation 'com.github.ybq:Android-SpinKit:1.4.0' + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/release/app-release.aab b/app/release/app-release.aab new file mode 100644 index 0000000..bf12c9e Binary files /dev/null and b/app/release/app-release.aab differ diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..d3bdf00 Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..4a390e7 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.lsp.view", + "variantName": "processReleaseResources", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "versionCode": 102, + "versionName": "1.0.2", + "outputFile": "app-release.apk" + } + ] +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/lsp/view/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/lsp/view/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..3e9cde0 --- /dev/null +++ b/app/src/androidTest/java/com/lsp/view/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.lsp.view + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.lsp.view", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4d19c0f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Adapter/AuthorAdapter.kt b/app/src/main/java/com/lsp/view/Adapter/AuthorAdapter.kt new file mode 100644 index 0000000..f72587a --- /dev/null +++ b/app/src/main/java/com/lsp/view/Adapter/AuthorAdapter.kt @@ -0,0 +1,32 @@ +package com.lsp.view.Adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.lsp.view.R +import com.lsp.view.bean.Author + +class AuthorAdapter (val tagList:List):RecyclerView.Adapter(){ + inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){ + val tagText = view.findViewById(R.id.tag) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.tag_item_layout,parent,false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val tag = tagList[position] + holder.tagText.text = tag.author + if (position == 0){ + holder.tagText.setBackgroundResource(R.drawable.title_bg) + } + } + + override fun getItemCount(): Int { + return tagList.size + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Adapter/IdAdapter.kt b/app/src/main/java/com/lsp/view/Adapter/IdAdapter.kt new file mode 100644 index 0000000..8ba6693 --- /dev/null +++ b/app/src/main/java/com/lsp/view/Adapter/IdAdapter.kt @@ -0,0 +1,32 @@ +package com.lsp.view.Adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.lsp.view.R +import com.lsp.view.bean.ID + +class IdAdapter (val idList:List):RecyclerView.Adapter(){ + inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){ + val tagText = view.findViewById(R.id.tag) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.tag_item_layout,parent,false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val tag = idList[position] + holder.tagText.text = tag.id + if (position == 0){ + holder.tagText.setBackgroundResource(R.drawable.title_bg) + } + } + + override fun getItemCount(): Int { + return idList.size + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Adapter/PostAdapter.kt b/app/src/main/java/com/lsp/view/Adapter/PostAdapter.kt new file mode 100644 index 0000000..dc5f8a5 --- /dev/null +++ b/app/src/main/java/com/lsp/view/Adapter/PostAdapter.kt @@ -0,0 +1,71 @@ +package com.lsp.view.Adapter + +import android.content.Context +import android.content.Intent +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.lsp.view.bean.Post +import com.lsp.view.PicActivity +import com.lsp.view.R + +class PostAdapter(val context:Context, private val postList: List) :RecyclerView.Adapter(){ + inner class ViewHolder(view: View) :RecyclerView.ViewHolder(view){ + val picImage: ImageView = view.findViewById(R.id.picImgae) + + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false) + val viewHolder = ViewHolder(view) + viewHolder.picImage.setOnClickListener { + val position = viewHolder.adapterPosition + Log.e("position",position.toString()) + Log.e("url",postList[position].sample_url) + val intent = Intent(context,PicActivity::class.java) + intent.putExtra("id",postList[position].id) + intent.putExtra("sample_url",postList[position].sample_url) + intent.putExtra("file_url",postList[position].file_url) + intent.putExtra("tags",postList[position].tags) + intent.putExtra("file_ext",postList[position].file_ext) + intent.putExtra("author",postList[position].author) + intent.putExtra("file_size",postList[position].file_size) + context.startActivity(intent) + } + + return viewHolder + } + + private lateinit var mLoadMoreListener:OnLoadMoreListener + + interface OnLoadMoreListener{ + fun loadMore(position: Int) + } + + fun setLoadMoreListener(mLoadMoreListener: OnLoadMoreListener){ + this.mLoadMoreListener = mLoadMoreListener + + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val post = postList[position] + Glide.with(context).load(post.preview_url).into(holder.picImage) + if (position==postList.size-1){ + //到达底部 + mLoadMoreListener.loadMore(position) + } + + } + + + + override fun getItemCount(): Int { + return postList.size + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Adapter/SizeAdapter.kt b/app/src/main/java/com/lsp/view/Adapter/SizeAdapter.kt new file mode 100644 index 0000000..e9a5bb3 --- /dev/null +++ b/app/src/main/java/com/lsp/view/Adapter/SizeAdapter.kt @@ -0,0 +1,42 @@ +package com.lsp.view.Adapter + +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.lsp.view.R +import com.lsp.view.bean.Size +import java.math.RoundingMode +import java.text.DecimalFormat + +class SizeAdapter(val tagList: List):RecyclerView.Adapter() { + inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){ + val tagText = view.findViewById(R.id.tag) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.tag_item_layout,parent,false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val tag = tagList[position] + Log.e("size",tag.file_size) + if (position == 0){ + holder.tagText.text = tag.file_size + holder.tagText.setBackgroundResource(R.drawable.title_bg) + }else{ + val sizeKb = tag.file_size.toFloat()/1024 + val format = DecimalFormat("0.##") + format.roundingMode = RoundingMode.FLOOR + val size = format.format(sizeKb) + holder.tagText.text = "$size Kb" + } + } + + override fun getItemCount(): Int { + return tagList.size + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Adapter/TagAdapter.kt b/app/src/main/java/com/lsp/view/Adapter/TagAdapter.kt new file mode 100644 index 0000000..87ebe69 --- /dev/null +++ b/app/src/main/java/com/lsp/view/Adapter/TagAdapter.kt @@ -0,0 +1,44 @@ +package com.lsp.view.Adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.lsp.view.R +import com.lsp.view.bean.Tags + +class TagAdapter(val tagList:List):RecyclerView.Adapter() { + inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){ + val tagText = view.findViewById(R.id.tag) + } + + private lateinit var mOnItemClickListener: OnItemClickListener + interface OnItemClickListener{ + fun onItemClick(view: View,position: Int) + } + + fun setOnItemClickListener(mOnItemClickListener: OnItemClickListener){ + this.mOnItemClickListener = mOnItemClickListener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.tag_item_layout,parent,false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val tag = tagList[position] + holder.tagText.text = tag.tag + holder.tagText.setOnClickListener { + mOnItemClickListener.onItemClick(it,position) + } + if (position == 0){ + holder.tagText.setBackgroundResource(R.drawable.title_bg) + } + } + + override fun getItemCount(): Int { + return tagList.size + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/MainActivity.kt b/app/src/main/java/com/lsp/view/MainActivity.kt new file mode 100644 index 0000000..1e0a986 --- /dev/null +++ b/app/src/main/java/com/lsp/view/MainActivity.kt @@ -0,0 +1,208 @@ +package com.lsp.view + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.content.Context +import android.os.Bundle +import android.util.Log +import android.view.KeyEvent +import android.view.View +import android.view.inputmethod.EditorInfo +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import android.widget.LinearLayout +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.GridLayoutManager +import com.google.android.material.snackbar.Snackbar +import com.lsp.view.bean.Post +import com.hentai.yandeview.Retrofit.PostService +import com.hentai.yandeview.Retrofit.ServiceCreator +import com.lsp.view.Adapter.PostAdapter +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import kotlin.properties.Delegates + +class MainActivity : AppCompatActivity() { + private val postList:ArrayList = ArrayList() + private var searchTag:String? = null + private lateinit var search:EditText + private lateinit var searchBar:LinearLayout + private var shortAnnotationDuration:Int = 0 + private var nowPage = 1 + private lateinit var adapter:PostAdapter + private var isLoading = false + private var nowPosition by Delegates.notNull() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + val fbtn = findViewById( + R.id.fbtn + ) + val swipeRefreshLayout = findViewById( + R.id.swipeRefreshLayout + ) + search = findViewById(R.id.search) + val toolbar = findViewById(R.id.toolbar) + setSupportActionBar(toolbar) + searchTag = intent.getStringExtra("searchTag") + if (searchTag!=null){ + this.search.setText(searchTag) + searchAction(searchTag) + }else{ + swipeRefreshLayout.isRefreshing = true + loadPost(this, null, null,nowPage.toString()) + } + val close = findViewById(R.id.close) + val editCard = findViewById(R.id.editCard) + + + searchBar = findViewById(R.id.search_bar) + shortAnnotationDuration = resources.getInteger(android.R.integer.config_shortAnimTime) + close.setOnClickListener { + hiddenSearchBar() + } + + search.setOnEditorActionListener { v, actionId, event -> + if (actionId==EditorInfo.IME_ACTION_SEARCH){ + searchAction(search.text.toString()) + searchTag = search.text.toString() + hiddenSearchBar() + } + return@setOnEditorActionListener false + } + + + + fbtn.setOnClickListener { + if (searchBar.visibility == View.GONE) { + showSearchBar() + } + } + + + + + + + + swipeRefreshLayout.setOnRefreshListener { + Log.e("Refresh", "Is refresh") + postList.clear() + nowPage = 1 + loadPost(this, null, searchTag,nowPage.toString()) + } + + + } + private fun hiddenSearchBar(){ + searchBar.animate() + .alpha(0f) + .setDuration(shortAnnotationDuration.toLong()) + .setListener(object :AnimatorListenerAdapter(){ + override fun onAnimationEnd(animation: Animator?) { + searchBar.visibility = View.GONE + } + }) + } + private fun showSearchBar(){ + searchBar.apply { + alpha = 0f + visibility = View.VISIBLE + animate() + .alpha(1f) + .setDuration(shortAnnotationDuration.toLong()) + .setListener(null) + } + } + + + private fun hideIm(){ + val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS) + } + private fun searchAction(tags: String?) { + val swipeRefreshLayout = findViewById( + R.id.swipeRefreshLayout + ) + swipeRefreshLayout.isRefreshing = true + postList.clear() + loadPost(this, null, tags,"1") + + + } + + + private fun loadPost(context: Context, source: String?, tags: String?,page:String){ + nowPosition = postList.size-3 + + val postService: PostService = if(source!=null){ + ServiceCreator.create(source) + }else{ + ServiceCreator.create("https://yande.re/") + } + + postService.getPostData("220", tags,page).enqueue(object : Callback> { + override fun onFailure(call: Call>, t: Throwable) { + val fbtn = findViewById( + R.id.fbtn + ) + Snackbar.make(fbtn,"请检查网络连接",Snackbar.LENGTH_SHORT).show() + } + + override fun onResponse(call: Call>, response: Response>) { + val swipeRefreshLayout = + findViewById( + R.id.swipeRefreshLayout + ) + val list = response.body() + + if (list != null) { + for ((i, post) in list.withIndex()) { +// if (list[i].rating=="s") { + postList.add(post) +// } + } + } else { + Log.e("Post", "Is null") + } + + + + + val layoutManager = GridLayoutManager(context, 2) + val recyclerView = + findViewById(R.id.recyclerview) + recyclerView.layoutManager = layoutManager + + Log.e("load",isLoading.toString()) + if (isLoading){ + recyclerView.scrollToPosition(nowPosition) + adapter.notifyDataSetChanged() + isLoading = false + }else{ + adapter = PostAdapter(context, postList) + recyclerView.adapter = adapter + } + adapter.setLoadMoreListener(object :PostAdapter.OnLoadMoreListener{ + override fun loadMore(position: Int) { + nowPage++ + swipeRefreshLayout.isRefreshing = true + isLoading = true + loadPost(this@MainActivity,null,tags,nowPage.toString()) + } + + }) + + + swipeRefreshLayout.isRefreshing = false + + + } + }) + + + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/PicActivity.kt b/app/src/main/java/com/lsp/view/PicActivity.kt new file mode 100644 index 0000000..1649cb5 --- /dev/null +++ b/app/src/main/java/com/lsp/view/PicActivity.kt @@ -0,0 +1,307 @@ +package com.lsp.view + +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.os.Environment +import android.os.Looper +import android.util.Log +import android.view.View +import android.widget.ImageView +import android.widget.ProgressBar +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.google.android.flexbox.* +import com.google.android.material.snackbar.Snackbar +import com.lsp.view.Adapter.AuthorAdapter +import com.lsp.view.Adapter.IdAdapter +import com.lsp.view.Adapter.SizeAdapter +import com.lsp.view.Adapter.TagAdapter +import com.lsp.view.bean.Author +import com.lsp.view.bean.ID +import com.lsp.view.bean.Size +import com.lsp.view.bean.Tags +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.* +import java.lang.Exception +import kotlin.collections.ArrayList +import kotlin.concurrent.thread + +class PicActivity : AppCompatActivity() { + + + private val tagList = ArrayList() + private val authorList = ArrayList() + private val idList = ArrayList() + private val time = System.currentTimeMillis() + private val sizeList = ArrayList() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_pic) + + val intent = intent + val tags = intent.getStringExtra("tags") + if (tags != null) { + loadTags(tags) + } + + val author = intent.getStringExtra("author") + if (author!=null){ + loadTags(author) + } + val file_size = intent.getStringExtra("file_size") + if (file_size!=null){ + loadTags(file_size) + } + + + val sharedPreferences = getSharedPreferences("FirstRun",0) + val firstRun = sharedPreferences.getBoolean("FirstRun",true) + if (firstRun){ + val sharedPreferences = getSharedPreferences("FirstRun",0).edit() + sharedPreferences.putBoolean("FirstRun",false) + val FileD = File("${Environment.getExternalStorageDirectory()}/${Environment.DIRECTORY_PICTURES}/LspMake") + FileD.mkdirs() + } + + val id = intent.getStringExtra("id") + if (id!=null){ + loadTags(id) + } + val sample_url = intent.getStringExtra("sample_url") + sample_url?.let { + loadPic(it) + } + + + + val file_url = intent.getStringExtra("file_url") + val file_ext = intent.getStringExtra("file_ext") + val fbtn = findViewById(R.id.fbtn) + + val path = "${Environment.getExternalStorageDirectory()}/${Environment.DIRECTORY_PICTURES}/LspMake/" + + "${time}.$file_ext" + + + + + + fbtn.setOnClickListener { + if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= + PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),1) + if (file_url != null) { + if (file_ext != null) { + savePic(file_url,file_ext) + + } + } + }else{ + if (file_url != null) { + if (file_ext != null) { + savePic(file_url,file_ext) + } + } + } + } + + + + + + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + val file_ext = intent.getStringExtra("file_ext") + val file_url = intent.getStringExtra("file_url") + val fbtn = findViewById(R.id.fbtn) + + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + when(requestCode){ + 1 -> { + if (grantResults.isNotEmpty() && grantResults[0]==PackageManager.PERMISSION_GRANTED){ + if (file_url != null) { + if (file_ext != null) { + savePic(file_url,file_ext) + + } + } + }else{ + Snackbar.make(fbtn,"该操作必须拥有文件写入权限",Snackbar.LENGTH_SHORT).setAction("授权"){ + ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),1) + }.show() + } + } + } + } + + private fun savePic(file_url:String, end: String){ + val FileD = File("${Environment.getExternalStorageDirectory()}/${Environment.DIRECTORY_PICTURES}/LspMake/") + if (FileD.exists()) { + thread { + val file = File("${Environment.getExternalStorageDirectory()}/${Environment.DIRECTORY_PICTURES}/LspMake/$time.$end") + val fos = FileOutputStream(file) + try { + Looper.prepare() + val fbtn = + findViewById( + R.id.fbtn + ) + + Snackbar.make(fbtn, "开始保存", Snackbar.LENGTH_SHORT).show() + val client = OkHttpClient() + val request = Request.Builder() + .url(file_url) + .build() + val response = client.newCall(request).execute() + val responseData = response.body()?.bytes() + if (response.code()==200) { + fos.write(responseData) + Snackbar.make(fbtn, "保存成功", Snackbar.LENGTH_SHORT).show() + } + + else { + Log.e("Test","errorNet") + Snackbar.make(fbtn, "下载异常", Snackbar.LENGTH_SHORT).show() + file.delete() + } + + Looper.loop() + + + } catch (e: Exception) { + e.printStackTrace() + } finally { + fos.close() + } + + + } + } + else{ + FileD.mkdirs() + savePic(file_url,end) + } + + + } + + private fun loadPic(url:String){ + val image = findViewById(R.id.titleImage) + Glide.with(this).load(url).listener(object :RequestListener{ + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + val pb = findViewById(R.id.pb) + Snackbar.make(pb,"加载错误",Snackbar.LENGTH_SHORT).show() + return false + + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + val pb = findViewById(R.id.pb) + pb.visibility = View.INVISIBLE + return false + + + } + + }).into(image) + + } + + private fun layoutManager():FlexboxLayoutManager{ + val manager = object : FlexboxLayoutManager(this, FlexDirection.ROW, FlexWrap.WRAP) { + override fun canScrollVertically(): Boolean { + return false + } + } + manager.flexWrap = FlexWrap.WRAP + manager.flexDirection = FlexDirection.ROW + manager.alignItems = AlignItems.CENTER + manager.justifyContent = JustifyContent.FLEX_START + return manager + } + + + private inline fun loadTags(tags:String){ + + + when(T::class.java){ + Tags::class.java ->{ + tagList.add(Tags("Tag")) + val list = tags.split(" ") + val tagRecyclerView = findViewById(R.id.tagRecyclerView) + tagRecyclerView.layoutManager = layoutManager() + for (tag in list) run { + tagList.add(Tags(tag)) + } + val adapter = TagAdapter(tagList) + adapter.setOnItemClickListener(object :TagAdapter.OnItemClickListener{ + override fun onItemClick(view: View, position: Int) { + val intent = Intent(this@PicActivity,MainActivity::class.java) + intent.putExtra("searchTag",tagList[position].tag) + startActivity(intent) + } + + }) + tagRecyclerView.adapter = adapter + } + Author::class.java->{ + authorList.add(Author("Author")) + val authorRecyclerView = findViewById(R.id.authorRecyclerView) + authorRecyclerView.layoutManager = layoutManager() + authorList.add(Author(tags)) + val adapter = AuthorAdapter(authorList) + authorRecyclerView.adapter = adapter + } + ID::class.java->{ + idList.add(ID("ID")) + idList.add(ID(tags)) + val idRecyclerView = findViewById(R.id.idRecyclerView) + idRecyclerView.layoutManager = layoutManager() + val adapter = IdAdapter(idList) + idRecyclerView.adapter = adapter + } + Size::class.java->{ + sizeList.add(Size("Size")) + sizeList.add(Size(tags)) + val sizeRecyclerView = findViewById(R.id.sizeRecyclerView) + sizeRecyclerView.layoutManager = layoutManager() + val adapter = SizeAdapter(sizeList) + sizeRecyclerView.adapter = adapter + + } + } + + + + + + + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Retrofit/PostService.kt b/app/src/main/java/com/lsp/view/Retrofit/PostService.kt new file mode 100644 index 0000000..dd7dc87 --- /dev/null +++ b/app/src/main/java/com/lsp/view/Retrofit/PostService.kt @@ -0,0 +1,11 @@ +package com.hentai.yandeview.Retrofit + +import com.lsp.view.bean.Post +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface PostService { + @GET("post.json") + fun getPostData(@Query("limit") limit: String,@Query("tags") tags:String?,@Query("page") page:String): Call> +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/Retrofit/ServiceCreator.kt b/app/src/main/java/com/lsp/view/Retrofit/ServiceCreator.kt new file mode 100644 index 0000000..d0a51a4 --- /dev/null +++ b/app/src/main/java/com/lsp/view/Retrofit/ServiceCreator.kt @@ -0,0 +1,31 @@ +package com.hentai.yandeview.Retrofit + +import android.util.Log +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.create + +object ServiceCreator { + + + /** + * @param serviceClass:所属类的Service接口 + * @param source:加载根地址 + * + */ + var source:String? = null + fun create(serviceClass: Class,source:String): T { + val retrofit = Retrofit.Builder() + .baseUrl(source) + .addConverterFactory(GsonConverterFactory.create()) + .build() + Log.e("Post",source) + this.source = source + return retrofit.create(serviceClass) + } + + /** + * 提供更优的函数调用方式 + */ + inline fun create(source: String): T = create(T::class.java,source) +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/bean/Author.kt b/app/src/main/java/com/lsp/view/bean/Author.kt new file mode 100644 index 0000000..00335aa --- /dev/null +++ b/app/src/main/java/com/lsp/view/bean/Author.kt @@ -0,0 +1,4 @@ +package com.lsp.view.bean + +class Author(val author: String) { +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/bean/ID.kt b/app/src/main/java/com/lsp/view/bean/ID.kt new file mode 100644 index 0000000..dc5f1c3 --- /dev/null +++ b/app/src/main/java/com/lsp/view/bean/ID.kt @@ -0,0 +1,4 @@ +package com.lsp.view.bean + +class ID(val id:String) { +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/bean/Post.kt b/app/src/main/java/com/lsp/view/bean/Post.kt new file mode 100644 index 0000000..bac4754 --- /dev/null +++ b/app/src/main/java/com/lsp/view/bean/Post.kt @@ -0,0 +1,14 @@ +package com.lsp.view.bean + +class Post( + val preview_url: String, + val file_url: String, + val id: String, + val sample_url: String, + val rating: String, + val tags: String, + val file_ext:String, + val author:String, + val file_size : String +) { +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/bean/Size.kt b/app/src/main/java/com/lsp/view/bean/Size.kt new file mode 100644 index 0000000..9bbacc8 --- /dev/null +++ b/app/src/main/java/com/lsp/view/bean/Size.kt @@ -0,0 +1,4 @@ +package com.lsp.view.bean + +class Size(val file_size:String) { +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/bean/Tags.kt b/app/src/main/java/com/lsp/view/bean/Tags.kt new file mode 100644 index 0000000..95397e0 --- /dev/null +++ b/app/src/main/java/com/lsp/view/bean/Tags.kt @@ -0,0 +1,4 @@ +package com.lsp.view.bean + +class Tags(val tag:String) { +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/close.png b/app/src/main/res/drawable/close.png new file mode 100644 index 0000000..decfef4 Binary files /dev/null and b/app/src/main/res/drawable/close.png differ diff --git a/app/src/main/res/drawable/edit_bg.xml b/app/src/main/res/drawable/edit_bg.xml new file mode 100644 index 0000000..aab8677 --- /dev/null +++ b/app/src/main/res/drawable/edit_bg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/item_bg.xml b/app/src/main/res/drawable/item_bg.xml new file mode 100644 index 0000000..edf6c63 --- /dev/null +++ b/app/src/main/res/drawable/item_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/save.png b/app/src/main/res/drawable/save.png new file mode 100644 index 0000000..07d3d5e Binary files /dev/null and b/app/src/main/res/drawable/save.png differ diff --git a/app/src/main/res/drawable/search.png b/app/src/main/res/drawable/search.png new file mode 100644 index 0000000..7f0c5e9 Binary files /dev/null and b/app/src/main/res/drawable/search.png differ diff --git a/app/src/main/res/drawable/search_b.png b/app/src/main/res/drawable/search_b.png new file mode 100644 index 0000000..e75a85d Binary files /dev/null and b/app/src/main/res/drawable/search_b.png differ diff --git a/app/src/main/res/drawable/title_bg.xml b/app/src/main/res/drawable/title_bg.xml new file mode 100644 index 0000000..0acc50c --- /dev/null +++ b/app/src/main/res/drawable/title_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..4121fb2 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_pic.xml b/app/src/main/res/layout/activity_pic.xml new file mode 100644 index 0000000..b647f98 --- /dev/null +++ b/app/src/main/res/layout/activity_pic.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_layout.xml b/app/src/main/res/layout/item_layout.xml new file mode 100644 index 0000000..8e6f99d --- /dev/null +++ b/app/src/main/res/layout/item_layout.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tag_item_layout.xml b/app/src/main/res/layout/tag_item_layout.xml new file mode 100644 index 0000000..eb27df7 --- /dev/null +++ b/app/src/main/res/layout/tag_item_layout.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/nav_menu.xml b/app/src/main/res/menu/nav_menu.xml new file mode 100644 index 0000000..2e0b078 --- /dev/null +++ b/app/src/main/res/menu/nav_menu.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..b09a941 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..b33d8bf --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,13 @@ + + + #1976D2 + #2196F3 + #03A9F4 + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..38b34a5 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + LspView + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..a8720f5 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/app/src/test/java/com/lsp/view/ExampleUnitTest.kt b/app/src/test/java/com/lsp/view/ExampleUnitTest.kt new file mode 100644 index 0000000..3bbae1d --- /dev/null +++ b/app/src/test/java/com/lsp/view/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.lsp.view + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..e194d85 --- /dev/null +++ b/build.gradle @@ -0,0 +1,26 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext.kotlin_version = "1.4.31" + repositories { + google() + jcenter() + } + dependencies { + classpath "com.android.tools.build:gradle:4.1.2" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..98bed16 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..142d4ff --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Mar 19 22:51:56 CST 2021 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..313c6ab --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +include ':app' +rootProject.name = "LspView" \ No newline at end of file