1. 文件类型阐明
- 文件夹分为私人文件和共享文件夹,私人文件夹只有在文件夹治理创立文件夹时,抉择可访问者的那个人能够拜访;
- 共享文件夹只有在文件夹治理创立文件夹时,抉择可访问者的那些人能够拜访。
- 私人文件夹又可分为加密文件夹,未加密文件夹:
- 如果是加密文件夹的话,拜访时须要输出正确明码能力拜访;
- 未加密文件夹能够间接拜访。
- 共享文件夹又分为在创立文件夹时的共享文件夹和他人共享给我的文件夹
1. 如果是在主界面的状况下,创立文件夹时的共享文件夹是不能做任何操作,只能查看文件夹详情
2. 他人共享给我的文件夹,是能够进行共享、下载、复制、重新命名操作
注:上述操作,必须要有相应的操作权限,包含查看文件夹详情。上面是对文件夹类型的进一步阐明。
在阐明之前,咱们能够先看看文件的实体类(有阐明字段定义的字段之外,其它字段都是接口返回):
/**
* 文件实体类
*/
public class FileBean implements Serializable {
/**
* name : config.yaml
* size : 1474
* mod_time : 1622010079
* type : 1
* path : /1/demo-plugin/config.yaml
* from_user :
*/
private String name; // 名称
private long size; // 大小(b)
private long mod_time; // 批改工夫
private int type;// 0 是文件夹 1 文件
private String path; // 门路
private String from_user; // 共享者名称
private boolean selected; // 是否选中该条数据,本人定义的字段
private int is_encrypt; // 是否加密文件夹;文件夹无效:1 加密,0 不须要加密
private int read; // 是否可读:1/0
private int write; // 是否可写:1/0
private int deleted; // 是否可删:1/0
private boolean enabled = true; // 是否可操作,本人定义的字段
...
}
- 如果是私人文件,咱们拜访的接口是:GET: /plugin/wangpan/resources/:path(path 参数为空),在咱们获取到私人文件夹之后,咱们能够依据 is_encrypt(1 加密,0 未加密)这个字段去判断改文件夹是否加密
- 如果是共享文件夹,咱们拜访的接口是 GET: /plugin/wangpan/shares,在咱们获取到共享文件夹之后,咱们能够依据 from_user 这个字段判断是在文件夹创立的共享文件夹还是他人共享给我的文件夹,如果 from_user 未空的话,则是在文件夹治理创立的文件夹,否则的话是他人共享给我的文件夹,而 from_user 的值就是共享给我的用户。
- 文件夹详情,不论是私人文件夹还是共享文件夹,咱们拜访的接口都是 GET: /plugin/wangpan/resources/:path(path:一级目录为空)
1)主界面的文件获取列表代码实现
public class HomePresenter extends BasePresenter<HomeModel, HomeContract.View> implements HomeContract.Presenter {
...
/**
* 文件
* @param scopeToken 凭证
* @param path
* @param map
*/
@Override
public void getFiles(String scopeToken, String path, Map<String, String> map, boolean showLoading) {executeObservable(mModel.getFiles(scopeToken, path, map), new RequestDataCallback<FileListBean>(showLoading) {
@Override
public void onSuccess(FileListBean response) {super.onSuccess(response);
mView.getFilesSuccess(response);
}
@Override
public void onFailed(int errorCode, String errorMessage) {super.onFailed(errorCode, errorMessage);
}
});
}
...
}
2)主界面的共享文件夹获取列表数据代码实现
public class SharePresenter extends BasePresenter<ShareModel, ShareContract.View> implements ShareContract.Presenter {
@Override
public ShareModel createModel() {return new ShareModel();
}
/**
* 共享文件夹列表
* @param scopeToken 凭证
* @param showLoading 是否显示加载弹窗
*/
@Override
public void getShareFolders(String scopeToken, boolean showLoading) {executeObservable(mModel.getShareFolders(scopeToken), new RequestDataCallback<FileListBean>(showLoading) {
@Override
public void onSuccess(FileListBean response) {super.onSuccess(response);
mView.getFilesSuccess(response);
}
@Override
public void onFailed(int errorCode, String errorMessage) {super.onFailed(errorCode, errorMessage);
}
});
}
}
3)获取文件夹详情数据代码实现
public class FileDetailPresenter extends BasePresenter<FileDetailModel, FileDetailContract.View> implements FileDetailContract.Presenter {
...
/**
* 文件列表 有明码参数
* @param scopeToken 凭证
* @param pwd 明码,加密文件的话传对应的明码,没有则传空串就行
* @param path 门路
* @param map 分页参数
* @param showLoading 是否显示加载弹窗
*/
@Override
public void getFiles(String scopeToken, String pwd, String path, Map<String, String> map, boolean showLoading) {executeObservable(mModel.getFiles(scopeToken, pwd, path, map), new RequestDataCallback<FileListBean>(showLoading) {
@Override
public void onSuccess(FileListBean response) {super.onSuccess(response);
if (mView!=null)
mView.getFilesSuccess(response);
}
@Override
public void onFailed(int errorCode, String errorMessage) {super.onFailed(errorCode, errorMessage);
if (mView!=null)
mView.getFilesFail(errorCode, errorMessage);
}
});
}
...
}
2. 权限阐明
1)这里的权限次要是指对文件 / 文件夹的读、写和删的操作权限。在具体阐明之前,咱们先看上面这个表格。
权限 | 备注 |
---|---|
读 | 1、查看该文件夹及其上面所有文件 / 文件夹的权限;2、有权限才展现对应文件夹的入口; |
写 | 1、包含新建文件夹、上传、重命名、共享、下载的权限;2、有权限才展现对应操作的入口; |
删 | 1、包含挪动、删除的权限;2、有权限才展现对应的操作的入口;3、有挪动、复制的权限,不代表能胜利挪动复制,须要看是否有移入文件夹的【写】权限,有能力操作。 |
注:复制性能不受权限管制
从表中咱们能够看出读权限对应文件夹 / 文件的查看操作:
- 写权限对应新建文件、上传、重命名、共享和下载的操作
- 删权限对应挪动和删除的操作。咱们在挪动和复制的时候不肯定可能挪动和复制胜利,因为咱们在挪动到指标文件时是否胜利,还得看指标文件夹是否又写权限。这些权限的设置是从文件夹治理创立文件夹时或共享文件时设置给对应访问者设置。
注:共享只能共享文件夹,不能共享文件
2) 接下来是对共享、挪动和复制操作的进一步阐明,为了更加直观的论述,咱们间接用表格来表白。
- 依据文件类型来决定是否可共享
文件夹的根目录文件类型 | 是否可共享 |
---|---|
私人文件夹(未加密) | 可共享 |
私人文件夹(已加密) | 不可共享 |
共享文件夹 | 可共享 |
他人共享给我的文件夹 | 可共享 |
- 依据文件 / 文件夹类型来决定可挪动到的指标门路
文件 / 文件夹的根目录文件类型操作 | 可挪动到地位 |
---|---|
私人文件夹(未加密) | 任何地位 |
私人文件夹(已加密) | 该已加密文件 / 文件夹所属根目录内 |
共享文件夹 | 任何地位 |
他人共享给我的文件夹 | 该共享文件夹所属根目录内 |
- 依据文件 / 文件夹的类型来决定可复制的指标门路
文件 / 文件夹的根目录文件类型 | 可复制到地位 |
---|---|
私人文件夹(未加密) | 任何地位 |
私人文件夹(已加密) | 该已加密文件 / 文件夹所属根目录内 |
共享文件夹 | 任何地位 |
他人共享给我的文件夹 | 任何地位 |
3)上面局部是局部代码实现
/**
* 文件详情
*/
public class FileDetailActivity extends BaseMVPDBActivity<ActivityFileDetailBinding, FileDetailContract.View, FileDetailPresenter> implements FileDetailContract.View {
...
/**
* 初始化文件列表
*/
private void initRv() {fileDetailAdapter = new FileDetailAdapter(0);
...
fileDetailAdapter.setOnItemChildClickListener((adapter, view, position) -> {if (view.getId() == R.id.ivSelected) {FileBean fileBean = fileDetailAdapter.getItem(position);
fileBean.setSelected(!fileBean.isSelected());
fileDetailAdapter.notifyItemChanged(position);
List<FileBean> selectedData = fileDetailAdapter.getSelectedData();
if (CollectionUtil.isNotEmpty(selectedData)) {if (isEncrypt()) { // 如果是加密文件,不能共享
mOperateData.get(0).setEnabled(false);
} else {mOperateData.get(0).setEnabled(fileDetailAdapter.isOnlyFolder() && FileUtil.hasWritePermission(selectedData)); // 是文件夹且有写权限能力共享
}
mOperateData.get(1).setEnabled(FileUtil.hasWritePermission(selectedData)); // 有写权限能力下载
mOperateData.get(2).setEnabled(FileUtil.hasDelPermission(selectedData)); // 有写权限能力挪动
mOperateData.get(3).setEnabled(true); // 复制不受权限影响
mOperateData.get(4).setEnabled(selectedData.size() == 1 && FileUtil.hasWritePermission(selectedData)); // 有写权限能力重命名
mOperateData.get(5).setEnabled(FileUtil.hasDelPermission(selectedData)); // 有删权限能力删除
fileOperateAdapter.notifyDataSetChanged();} else {setAllEnabled();
}
setOperateVisible(selectedData.size() > 0); // 设置底部文件操作是否可见
binding.rrv.setRefreshAndLoadMore(selectedData.size() <= 0); // 设置列表是否可刷新和加载更多
}
});
}
...
/**
* 文件的操作
*/
private void initRvOperateFile() {binding.rvOperate.setLayoutManager(new GridLayoutManager(this, 6));
fileOperateAdapter = new FileOperateAdapter();
binding.rvOperate.setAdapter(fileOperateAdapter);
mOperateData.add(new FileOperateBean(R.drawable.icon_share, UiUtil.getString(R.string.home_share), true));
mOperateData.add(new FileOperateBean(R.drawable.icon_download, UiUtil.getString(R.string.home_download), true));
mOperateData.add(new FileOperateBean(R.drawable.icon_move, UiUtil.getString(R.string.home_move), true));
mOperateData.add(new FileOperateBean(R.drawable.icon_copy, UiUtil.getString(R.string.home_copy), true));
mOperateData.add(new FileOperateBean(R.drawable.icon_rename, UiUtil.getString(R.string.home_rename), true));
mOperateData.add(new FileOperateBean(R.drawable.icon_remove, UiUtil.getString(R.string.home_remove), true));
fileOperateAdapter.setNewData(mOperateData);
fileOperateAdapter.setOnItemClickListener((adapter, view, position) -> {FileOperateBean fileOperateBean = fileOperateAdapter.getItem(position);
if (fileOperateBean.isEnabled()) {switch (position) {
case 0: // 共享
Bundle bundle = new Bundle();
bundle.putSerializable("folder", (Serializable) fileDetailAdapter.getSelectedData());
bundle.putBoolean("originalWrite", FileUtil.hasWritePermission(fileDetailAdapter.getSelectedData()));
bundle.putBoolean("originalDel", FileUtil.hasDelPermission(fileDetailAdapter.getSelectedData()));
switchToActivity(ShareFolderActivity.class, bundle);
break;
case 1: // 下载
downloadFiles(fileDetailAdapter.getSelectedData());
break;
case 2: // 挪动
toMoveCopyActivity(0, fileDetailAdapter.getSelectedPath());
break;
case 3: // 复制到
toMoveCopyActivity(1, fileDetailAdapter.getSelectedPath());
break;
case 4: // 重命名
FileBean fileBean = fileDetailAdapter.getSingleSelectedData();
int drawableRes = R.drawable.icon_file_big;
if (fileBean.getType() == 0) {drawableRes = R.drawable.icon_file_big;} else {
/**
* 1. word
* 2. excel
* 3. ppt
* 4. 压缩包
* 5. 图片
* 6. 音频
* 7. 视频
* 8. 文本
*
*/
int fileType = FileTypeUtil.fileType(fileBean.getName());
drawableRes = FileTypeUtil.getFileBigLogo(fileType);
}
showCreateFileDialog(1, drawableRes, fileBean);
break;
case 5: // 删除
showRemoveFileTips(fileDetailAdapter.getSelectedPath());
break;
}
}
});
}
...
}
/**
* 文件夹详情列表适配器
*/
public class FileOperateAdapter extends BaseQuickAdapter<FileOperateBean, BaseViewHolder> {
...
@Override
protected void convert(BaseViewHolder helper, FileOperateBean item) {LinearLayout llParent = helper.getView(R.id.llParent);
llParent.setAlpha(item.isEnabled() ? 1 : 0.5f);
ImageView ivLogo = helper.getView(R.id.ivLogo);
ivLogo.setImageResource(item.getDrawable());
TextView tvName = helper.getView(R.id.tvName);
tvName.setText(item.getName());
}
}