Skip to content

Commit

Permalink
完成+优化 剪切板功能+UI
Browse files Browse the repository at this point in the history
  • Loading branch information
cheetah747 committed Jun 24, 2020
1 parent f433d7f commit a44a200
Show file tree
Hide file tree
Showing 13 changed files with 244 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,9 @@ public static ArrayList<UriInterpretation> getClipboardUris() {
return MyHttpServer.clipboardUris;
}

public static void setClipboardUris(ArrayList<UriInterpretation> newUris){
MyHttpServer.clipboardUris = newUris;
public static void setClipboardUris(ArrayList<UriInterpretation> newUris){
MyHttpServer.clipboardUris.clear();
MyHttpServer.clipboardUris.addAll(newUris);
}

public static void changeUrisByMode(boolean isClipboardMode){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ protected void addNewFlex2UI(final ArrayList<UriInterpretation> newUriList, fina
public void run() {
//如果是剪切板模式
if (newUriList.size() == 1 && newUriList.get(0).isClipboardType){
final View view = LayoutInflater.from(MainActivity0.this).inflate(R.layout.flex_item, flexboxLayout, false);
final View view = LayoutInflater.from(MainActivity0.this).inflate(R.layout.flex_item_files, flexboxLayout, false);
view.findViewById(R.id.divider).setVisibility(View.GONE);
String showText = newUriList.get(0).clipboardText.isEmpty()?"(剪切板为空)" : newUriList.get(0).clipboardText;
((TextView) view.findViewById(R.id.itemNameTv)).setText(showText);
Expand All @@ -258,7 +258,7 @@ public void run() {
}
//如果是普通模式
for (UriInterpretation uriInterpretation : newUriList) {
final View view = LayoutInflater.from(MainActivity0.this).inflate(R.layout.flex_item, flexboxLayout, false);
final View view = LayoutInflater.from(MainActivity0.this).inflate(R.layout.flex_item_files, flexboxLayout, false);
view.setTag(uriInterpretation);//把uriInterpretation保存到tag,到时候点击时用它来找到实时的index
((TextView) view.findViewById(R.id.itemNameTv)).setText(uriInterpretation.getPath());
((ImageView) view.findViewById(R.id.isFolderIcon)).setVisibility(uriInterpretation.isDirectory() ? View.VISIBLE : View.GONE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.sibyl.httpfiledominator.MyHttpServer
import com.sibyl.httpfiledominator.UriInterpretation
import com.sibyl.httpfiledominator.mainactivity.repo.MainRepo
import kotlinx.coroutines.launch
import java.io.File

/**
* @author HUANGSHI-PC on 2020-03-06 0006.
Expand All @@ -30,7 +31,10 @@ class MainModel(val repo: MainRepo) : ViewModel() {
val newUrisCache = MutableLiveData<List<UriInterpretation>>()

/**是否剪切板模式*/
val isClipboardMode = MutableLiveData<Boolean>().apply { value = false }
val isClipboardMode = MutableLiveData<Boolean>()

/**刷新剪切板UI*/
val isRefreshClipboardUI = MutableLiveData<Boolean>()

/**处理刚进页面时传入的Intent*/
fun dealWithNewIntent(intent: Intent?) = viewModelScope.launch {
Expand Down Expand Up @@ -62,7 +66,6 @@ class MainModel(val repo: MainRepo) : ViewModel() {
}



/**对新uri的处理*/
fun dealWithNewUris(newUriList: MutableList<UriInterpretation>?) = viewModelScope.launch {
//先过滤一波已经添加过的
Expand All @@ -80,5 +83,21 @@ class MainModel(val repo: MainRepo) : ViewModel() {
isClipboardMode.value = false
}


/**
* 处理剪切板情况下的数据
*/
fun createClipDataRefresh(clipboardFile: File) = viewModelScope.launch {
isLoading.value = true
try{
repo.writeClipboard2File(clipboardFile)
if (httpServer.value == null){
httpServer.value = MyHttpServer(1120)
}
isRefreshClipboardUI.value = true
}catch (e: Exception){
snackbarMsg.value = e.message
}finally {
isLoading.value = false
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ import android.content.Intent
import android.net.Uri
import android.os.Parcelable
import com.sibyl.httpfiledominator.MyApp
import com.sibyl.httpfiledominator.MyHttpServer
import com.sibyl.httpfiledominator.UriInterpretation
import com.sibyl.httpfiledominator.utils.ClipboardUtil
import com.sibyl.httpfiledominator.utils.JsonDominator
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File
import java.util.*

/**
* @author HUANGSHI-PC on 2020-03-06 0006.
Expand Down Expand Up @@ -60,4 +65,15 @@ class MainRepo {
}
theUris
}


/**剪切板模式下的数据处理*/
suspend fun writeClipboard2File(clipboardFile: File) = withContext(Dispatchers.IO) {
//剪切板内容写入到文件
JsonDominator.fire2Dir(ClipboardUtil.getText(MyApp.instance), clipboardFile)
val tempUris = ArrayList<UriInterpretation>().apply {
add(UriInterpretation(Uri.fromFile(clipboardFile), ClipboardUtil.getText(MyApp.instance), MyApp.instance?.getContentResolver()))
}
MyHttpServer.setClipboardUris(tempUris)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import android.view.View
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.get
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
Expand All @@ -34,6 +35,7 @@ import com.sibyl.httpfiledominator.utils.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.link_layout.*
import kotlinx.android.synthetic.main.toolbar.toolbar
import java.io.File

open class MainActivity : BaseActivity() {
companion object {
Expand All @@ -46,11 +48,13 @@ open class MainActivity : BaseActivity() {

val mainModel by lazy { ViewModelProviders.of(this, MainModelFactory(MainRepo())).get(MainModel::class.java) }

val clipboardFile by lazy { File(getExternalFilesDir(null).getAbsolutePath() + File.separator + "clipboard.txt") }

protected var loadWait: LoadWaitDominator? = null

val notiDominator by lazy { NotiDominator(this) }

var isShowModeChangeSnackbar = true

override fun onCreate(savedInstanceState: Bundle?) {
// window.setBackgroundDrawable(null)
Expand All @@ -74,7 +78,7 @@ open class MainActivity : BaseActivity() {
stopServer()
finish()
}
mainModel.dealWithNewIntent(intent)
mainModel.dealWithNewIntent(newIntent)
}

/**绑他妈的*/
Expand Down Expand Up @@ -113,7 +117,7 @@ open class MainActivity : BaseActivity() {
runOnUiThread {
newUriList.forEach {
val view = LayoutInflater.from(this@MainActivity)
.inflate(R.layout.flex_item, fileNameContainer, false)
.inflate(R.layout.flex_item_files, fileNameContainer, false)
view.tag = it //把uriInterpretation保存到tag,到时候点击时用它来找到实时的index
view.findViewById<TextView>(R.id.itemNameTv).text = it.path
view.findViewById<ImageView>(R.id.isFolderIcon).visibility = if (it.isDirectory) View.VISIBLE else View.GONE
Expand All @@ -140,7 +144,26 @@ open class MainActivity : BaseActivity() {
isClipboardMode.observe(this@MainActivity, Observer {
MyHttpServer.changeUrisByMode(it)//切换主url
refreshClipModeVisibility(it)//切换组件显示状态
showSnackbar(fab, getString(if (it) R.string.clipboard_mode_on else R.string.clipboard_mode_off))
if (isShowModeChangeSnackbar){
showSnackbar(fab, getString(if (it) R.string.clipboard_mode_on else R.string.clipboard_mode_off))
}
when(it){
true -> createClipDataRefresh(clipboardFile)//剪切板模式,创建剪切板内容缓存文件,并刷新UI
else -> if (MyHttpServer.getNormalUris().isEmpty()) stopServer()//如果 普通模式 && 并没有添加文件,就应该把服务关掉
}
isShowModeChangeSnackbar = true
})

//刷新剪切板UI显示
isRefreshClipboardUI.observe(this@MainActivity, Observer {
val view: View = if (clipboardContainer.childCount > 0) clipboardContainer.get(0)
else LayoutInflater.from(this@MainActivity).inflate(R.layout.flex_item_clipboard, clipboardContainer, false)
val uriInterpretation = MyHttpServer.getClipboardUris().get(0)
val showText = if (uriInterpretation.clipboardText.isEmpty()) "(剪切板为空)" else uriInterpretation.clipboardText
(view.findViewById<View>(R.id.itemNameTv) as TextView).text = showText
if (clipboardContainer.childCount == 0){
clipboardContainer.addView(view)
}
})
}
}
Expand All @@ -156,7 +179,7 @@ open class MainActivity : BaseActivity() {
}

clipboardBtn.setOnClickListener {
mainModel.isClipboardMode.value = !(mainModel.isClipboardMode.value ?:false)
mainModel.isClipboardMode.value = !(mainModel.isClipboardMode.value ?: false)
}

copyBtn.setOnClickListener {
Expand Down Expand Up @@ -188,6 +211,7 @@ open class MainActivity : BaseActivity() {
fileNameContainer.visibility = if (isClipboardMode) View.GONE else View.VISIBLE
if (isClipboardMode) {
fab.hide()
notiDominator.showNotifi()//剪切板模式必开通知,管你剪切板里有没有内容
} else {
fab.show()
}
Expand Down Expand Up @@ -241,19 +265,33 @@ open class MainActivity : BaseActivity() {
}

private fun stopServer() {
notiDominator.dismissAll(this)
notiDominator.dismissAll(this)//隐藏通知
mainModel.httpServer.run {
value?.stopServer()
value = null
}
MyHttpServer.clearFiles()
//UI
if (isFinishing) return
mainModel.preferredServerUrl.set("")//IP栏不应该再显示IP
}

override fun onDestroy() {
stopServer()
super.onDestroy()
}

override fun onResume() {
super.onResume()
//如果为true,那就再赋一次true,激发它的观察者,以刷新剪切板UI
Handler().postDelayed( {
if (mainModel.isClipboardMode.value ?: false){
isShowModeChangeSnackbar = false//先禁用它的观察者里的Snackbar的显示
mainModel.isClipboardMode.value = true
}
},300)
}

/**
* 6.0的权限
*/
Expand Down
61 changes: 0 additions & 61 deletions app/src/main/res/layout/flex_item.xml

This file was deleted.

89 changes: 89 additions & 0 deletions app/src/main/res/layout/flex_item_clipboard.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginLeft="5dp"
android:layout_marginRight="4dp"
android:layout_marginTop="6dp"
android:layout_marginBottom="3dp"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/file_name_color"
app:cardCornerRadius="8dp"
app:cardElevation="3dp">

<LinearLayout
android:orientation="vertical"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<!--剪切板标题栏-->
<LinearLayout
android:id="@+id/clipboardTitleLayout"
android:background="@color/clipboard_card_title_color"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:padding="5dp"
android:textSize="16sp"
android:gravity="center"
android:textColor="@color/white"
android:text="@string/clipboard_title_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


<!-- 正常正文内容-->
<LinearLayout
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<!-- <ImageView-->
<!-- android:id="@+id/isFolderIcon"-->
<!-- android:layout_marginLeft="8dp"-->
<!-- android:visibility="gone"-->
<!-- android:scaleType="fitCenter"-->
<!-- android:tint="@color/white"-->
<!-- android:src="@drawable/icon_folder"-->
<!-- android:layout_width="20dp"-->
<!-- android:layout_height="20dp" />-->

<TextView
android:id="@+id/itemNameTv"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingLeft="8dp"
android:textSize="15sp"
android:paddingRight="8dp"
android:textColor="@color/white"
tools:text="这是一个文件名.mp4"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />

<!-- <View-->
<!-- android:id="@+id/divider"-->
<!-- android:background="@color/white"-->
<!-- android:layout_width="1px"-->
<!-- android:layout_height="match_parent" />-->

<!-- <ImageButton-->
<!-- android:id="@+id/itemDeleteBtn"-->
<!-- android:src="@drawable/ic_delete"-->
<!-- android:scaleType="fitCenter"-->
<!-- android:padding="6dp"-->
<!-- android:background="@color/transparent"-->
<!-- android:layout_width="30dp"-->
<!-- android:layout_height="match_parent" />-->

</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
Loading

0 comments on commit a44a200

Please sign in to comment.