| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -4,11 +4,11 @@ import android.annotation.SuppressLint | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.app.Activity | 
					 | 
					 | 
					 | 
					import android.app.Activity | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.content.Intent | 
					 | 
					 | 
					 | 
					import android.content.Intent | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.net.Uri | 
					 | 
					 | 
					 | 
					import android.net.Uri | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					import android.os.Build | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.os.Bundle | 
					 | 
					 | 
					 | 
					import android.os.Bundle | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.provider.DocumentsContract | 
					 | 
					 | 
					 | 
					import android.provider.DocumentsContract | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.view.Menu | 
					 | 
					 | 
					 | 
					import android.view.Menu | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.view.MenuItem | 
					 | 
					 | 
					 | 
					import android.view.MenuItem | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import android.view.View | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import androidx.appcompat.widget.PopupMenu | 
					 | 
					 | 
					 | 
					import androidx.appcompat.widget.PopupMenu | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import androidx.documentfile.provider.DocumentFile | 
					 | 
					 | 
					 | 
					import androidx.documentfile.provider.DocumentFile | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import androidx.lifecycle.LiveData | 
					 | 
					 | 
					 | 
					import androidx.lifecycle.LiveData | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -119,36 +119,32 @@ class ImportBookActivity : VMBaseActivity<ImportBookViewModel>(R.layout.activity | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private fun upRootDoc() { | 
					 | 
					 | 
					 | 
					    private fun upRootDoc() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        AppConfig.importBookPath?.let { | 
					 | 
					 | 
					 | 
					        AppConfig.importBookPath?.let { lastPath -> | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if (it.isContentPath()) { | 
					 | 
					 | 
					 | 
					            when { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                val rootUri = Uri.parse(it) | 
					 | 
					 | 
					 | 
					                lastPath.isContentPath() -> { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                rootDoc = DocumentFile.fromTreeUri(this, rootUri) | 
					 | 
					 | 
					 | 
					                    val rootUri = Uri.parse(lastPath) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                subDocs.clear() | 
					 | 
					 | 
					 | 
					                    rootDoc = DocumentFile.fromTreeUri(this, rootUri) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } else { | 
					 | 
					 | 
					 | 
					                    subDocs.clear() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                rootDoc = null | 
					 | 
					 | 
					 | 
					                    upPath() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                subDocs.clear() | 
					 | 
					 | 
					 | 
					                } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                path = it | 
					 | 
					 | 
					 | 
					                Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } | 
					 | 
					 | 
					 | 
					                    FilePicker.selectFolder(this, requestCodeSelectFolder) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } ?: let { | 
					 | 
					 | 
					 | 
					                } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            // 没有权限就显示一个授权提示和按钮 | 
					 | 
					 | 
					 | 
					                lastPath.isNotBlank() -> { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if (PermissionsCompat.check(this, *Permissions.Group.STORAGE)) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                hint_per.visibility = View.GONE | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } else { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                hint_per.visibility = View.VISIBLE | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                tv_request_per.onClick { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    PermissionsCompat.Builder(this) | 
					 | 
					 | 
					 | 
					                    PermissionsCompat.Builder(this) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                        .addPermissions(*Permissions.Group.STORAGE) | 
					 | 
					 | 
					 | 
					                        .addPermissions(*Permissions.Group.STORAGE) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                        .rationale(R.string.tip_perm_request_storage) | 
					 | 
					 | 
					 | 
					                        .rationale(R.string.tip_perm_request_storage) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                        .onGranted { | 
					 | 
					 | 
					 | 
					                        .onGranted { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                            hint_per.visibility = View.GONE | 
					 | 
					 | 
					 | 
					                            rootDoc = null | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                            initData() | 
					 | 
					 | 
					 | 
					                            subDocs.clear() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                            upRootDoc() | 
					 | 
					 | 
					 | 
					                            path = lastPath | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                            upPath() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                        } | 
					 | 
					 | 
					 | 
					                        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                        .request() | 
					 | 
					 | 
					 | 
					                        .request() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                } | 
					 | 
					 | 
					 | 
					                } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                else -> FilePicker.selectFolder(this, requestCodeSelectFolder) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } | 
					 | 
					 | 
					 | 
					            } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        upPath() | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    @SuppressLint("SetTextI18n") | 
					 | 
					 | 
					 | 
					    @SuppressLint("SetTextI18n") | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -183,6 +179,7 @@ class ImportBookActivity : VMBaseActivity<ImportBookViewModel>(R.layout.activity | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                } | 
					 | 
					 | 
					 | 
					                } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } | 
					 | 
					 | 
					 | 
					            } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } ?: let { | 
					 | 
					 | 
					 | 
					        } ?: let { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            if (path.isBlank()) return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            tv_path.text = path.replace(sdPath, "SD") | 
					 | 
					 | 
					 | 
					            tv_path.text = path.replace(sdPath, "SD") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            val docList = arrayListOf<DocItem>() | 
					 | 
					 | 
					 | 
					            val docList = arrayListOf<DocItem>() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            File(path).listFiles()?.forEach { | 
					 | 
					 | 
					 | 
					            File(path).listFiles()?.forEach { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |