From 82628c4839ecbc7d96b0cc2a1bb49a8cf9ff4a06 Mon Sep 17 00:00:00 2001 From: Xinghaoxiang <herry_xing@126.com> Date: Tue, 26 Jun 2018 14:08:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=91=E5=BD=A2=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {app => sample}/.gitignore | 0 {app => sample}/build.gradle | 0 {app => sample}/proguard-rules.pro | 0 .../ExampleInstrumentedTest.java | 0 {app => sample}/src/main/AndroidManifest.xml | 0 .../com/bril/webfilemodule/MainActivity.java | 28 +++ .../java/com/bril/webfilemodule/Test.java | 0 .../src/main/res/layout/activity_main.xml | 31 ++- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../bril/webfilemodule/ExampleUnitTest.java | 0 settings.gradle | 2 +- webfile/src/main/AndroidManifest.xml | 1 + .../java/com/bril/webfile/FileActivity.java | 36 ++++ .../com/bril/webfile/NextCloudActivity.java | 139 +++++++++++++ .../java/com/bril/webfile/net/Constant.java | 4 +- .../com/bril/webfile/net/api/FileAPI.java | 7 + .../bril/webfile/net/client/FileClient.java | 6 + .../bril/webfile/response/ChildrenBeans.java | 52 +++++ .../webfile/response/NextCloudResponse.java | 137 +++++++++++++ .../adapter/SimpleTreeListViewAdapter.java | 62 ++++++ .../treeview/adapter/TreeViewAdapter.java | 92 +++++++++ .../webfile/treeview/annotation/NodeName.java | 16 ++ .../webfile/treeview/annotation/NodePID.java | 15 ++ .../webfile/treeview/annotation/NodeType.java | 16 ++ .../webfile/treeview/helper/TreeHelper.java | 188 ++++++++++++++++++ .../com/bril/webfile/treeview/node/Node.java | 154 ++++++++++++++ .../src/main/res/drawable-mdpi/tree_ec.png | Bin 0 -> 2858 bytes .../src/main/res/drawable-mdpi/tree_ex.png | Bin 0 -> 2848 bytes webfile/src/main/res/layout/list_item.xml | 25 +++ 41 files changed, 1007 insertions(+), 4 deletions(-) rename {app => sample}/.gitignore (100%) rename {app => sample}/build.gradle (100%) rename {app => sample}/proguard-rules.pro (100%) rename {app => sample}/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java (100%) rename {app => sample}/src/main/AndroidManifest.xml (100%) rename {app => sample}/src/main/java/com/bril/webfilemodule/MainActivity.java (73%) rename {app => sample}/src/main/java/com/bril/webfilemodule/Test.java (100%) rename {app => sample}/src/main/res/layout/activity_main.xml (75%) rename {app => sample}/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {app => sample}/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {app => sample}/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename {app => sample}/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {app => sample}/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {app => sample}/src/main/res/values/colors.xml (100%) rename {app => sample}/src/main/res/values/strings.xml (100%) rename {app => sample}/src/main/res/values/styles.xml (100%) rename {app => sample}/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java (100%) create mode 100644 webfile/src/main/java/com/bril/webfile/NextCloudActivity.java create mode 100644 webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java create mode 100644 webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java create mode 100644 webfile/src/main/java/com/bril/webfile/treeview/node/Node.java create mode 100644 webfile/src/main/res/drawable-mdpi/tree_ec.png create mode 100644 webfile/src/main/res/drawable-mdpi/tree_ex.png create mode 100644 webfile/src/main/res/layout/list_item.xml diff --git a/app/.gitignore b/sample/.gitignore similarity index 100% rename from app/.gitignore rename to sample/.gitignore diff --git a/app/build.gradle b/sample/build.gradle similarity index 100% rename from app/build.gradle rename to sample/build.gradle diff --git a/app/proguard-rules.pro b/sample/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to sample/proguard-rules.pro diff --git a/app/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java b/sample/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java similarity index 100% rename from app/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java rename to sample/src/androidTest/java/com/bril/webfilemodule/ExampleInstrumentedTest.java diff --git a/app/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml similarity index 100% rename from app/src/main/AndroidManifest.xml rename to sample/src/main/AndroidManifest.xml diff --git a/app/src/main/java/com/bril/webfilemodule/MainActivity.java b/sample/src/main/java/com/bril/webfilemodule/MainActivity.java similarity index 73% rename from app/src/main/java/com/bril/webfilemodule/MainActivity.java rename to sample/src/main/java/com/bril/webfilemodule/MainActivity.java index 7c01d27..86e215e 100644 --- a/app/src/main/java/com/bril/webfilemodule/MainActivity.java +++ b/sample/src/main/java/com/bril/webfilemodule/MainActivity.java @@ -7,9 +7,11 @@ import android.util.Log; import android.view.View; import com.bril.webfile.FileActivity; +import com.bril.webfile.NextCloudActivity; public class MainActivity extends AppCompatActivity { public static final int FILE_CHOOSE = 0x012; + public static final int FILE_NEXTCLOUD= 0x013; String notification = ""; String conferenceManagement = ""; private static final String TAG = "MainActivity"; @@ -86,7 +88,33 @@ public class MainActivity extends AppCompatActivity { String fileId = data.getStringExtra("fileId"); Log.d(TAG, "fileID:" + fileId + " filePath:" + filePath + " fileName:" + fileName); break; + case FILE_NEXTCLOUD: + String absolutePath = data.getStringExtra("absolutePath"); + String filePaths = data.getStringExtra("filePaths"); + Log.d(TAG, "onActivityResult: " + absolutePath + " " + filePaths); + break; } } } + + public void shareFolder(View view) { + Intent intent = new Intent(this, NextCloudActivity.class); + intent.putExtra("userId", "716"); + intent.putExtra("moduleName", "shareFolder"); + startActivityForResult(intent,FILE_NEXTCLOUD); + } + + public void myselfNetDisk(View view) { + Intent intent = new Intent(this, NextCloudActivity.class); + intent.putExtra("userId", "716"); + intent.putExtra("moduleName", "myselfNetDisk"); + startActivityForResult(intent,FILE_NEXTCLOUD); + } + + public void documentManager(View view) { + Intent intent = new Intent(this, NextCloudActivity.class); + intent.putExtra("userId", "716"); + intent.putExtra("moduleName", "documentManager"); + startActivityForResult(intent,FILE_NEXTCLOUD); + } } diff --git a/app/src/main/java/com/bril/webfilemodule/Test.java b/sample/src/main/java/com/bril/webfilemodule/Test.java similarity index 100% rename from app/src/main/java/com/bril/webfilemodule/Test.java rename to sample/src/main/java/com/bril/webfilemodule/Test.java diff --git a/app/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml similarity index 75% rename from app/src/main/res/layout/activity_main.xml rename to sample/src/main/res/layout/activity_main.xml index c688c93..e3617ed 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -91,7 +91,36 @@ android:onClick="documentScan" /> + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="共享文件夹" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:onClick="shareFolder" + /> + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="个人网盘" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:onClick="myselfNetDisk" + /> - + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="文档管ç†" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:onClick="documentManager" + /> </LinearLayout> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/sample/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-hdpi/ic_launcher.png rename to sample/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to sample/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/sample/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher.png rename to sample/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to sample/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/sample/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to sample/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to sample/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sample/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to sample/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/app/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to sample/src/main/res/values/colors.xml diff --git a/app/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to sample/src/main/res/values/strings.xml diff --git a/app/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to sample/src/main/res/values/styles.xml diff --git a/app/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java b/sample/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java similarity index 100% rename from app/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java rename to sample/src/test/java/com/bril/webfilemodule/ExampleUnitTest.java diff --git a/settings.gradle b/settings.gradle index de9a801..9db7da3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':webfile' +include ':sample', ':webfile' diff --git a/webfile/src/main/AndroidManifest.xml b/webfile/src/main/AndroidManifest.xml index 24b0b98..38c8dc1 100644 --- a/webfile/src/main/AndroidManifest.xml +++ b/webfile/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ <application android:supportsRtl="true"> <activity android:name=".FileActivity" /> + <activity android:name=".NextCloudActivity" /> </application> </manifest> diff --git a/webfile/src/main/java/com/bril/webfile/FileActivity.java b/webfile/src/main/java/com/bril/webfile/FileActivity.java index b2b9df1..e686ff1 100644 --- a/webfile/src/main/java/com/bril/webfile/FileActivity.java +++ b/webfile/src/main/java/com/bril/webfile/FileActivity.java @@ -67,8 +67,44 @@ public class FileActivity extends AppCompatActivity implements AdapterView.OnIte throwable.printStackTrace(); } }); +// fileClient.nextCloud(userId, "2") +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribeOn(Schedulers.io()) +// .subscribe(new Consumer<NextCloudResponse>() { +// @Override +// public void accept(NextCloudResponse nextCloudResponses) throws Exception { +// List<NextCloudResponse.ListBean> list = nextCloudResponses.getList(); +// for (NextCloudResponse.ListBean listBean : list) { +// ChildrenBeans childrenBeans = new ChildrenBeans(); +// String type = listBean.getType(); +// String name = listBean.getName(); +// childrenBeans.setName(name); +// childrenBeans.setType(type); +// childrenBeansList.add(childrenBeans); +// addData(listBean.getChildren()); +// } +// Log.d(TAG, "" + childrenBeansList.size()); +// for (ChildrenBeans childrenBeans : childrenBeansList) { +// Log.e(TAG, childrenBeans.toString() ); +// } +// +// SimpleTreeListViewAdapter simpleTreeListViewAdapter +// = new SimpleTreeListViewAdapter(fileLv, FileActivity.this, childrenBeansList, 1); +// fileLv.setAdapter(simpleTreeListViewAdapter); +// +// } +// }, new Consumer<Throwable>() { +// @Override +// public void accept(Throwable throwable) throws Exception { +// throwable.printStackTrace(); +// } +// }); } + + + + @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { FileResponse fileResponse = fileBean.get(position); diff --git a/webfile/src/main/java/com/bril/webfile/NextCloudActivity.java b/webfile/src/main/java/com/bril/webfile/NextCloudActivity.java new file mode 100644 index 0000000..f80368e --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/NextCloudActivity.java @@ -0,0 +1,139 @@ +package com.bril.webfile; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.Toast; + +import com.bril.webfile.net.client.FileClient; +import com.bril.webfile.response.ChildrenBeans; +import com.bril.webfile.response.NextCloudResponse; +import com.bril.webfile.treeview.adapter.SimpleTreeListViewAdapter; +import com.bril.webfile.treeview.adapter.TreeViewAdapter; +import com.bril.webfile.treeview.node.Node; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * Created by Xinghx on 2018/6/26 0026. + */ + +public class NextCloudActivity extends AppCompatActivity { + ListView mTree; + List<ChildrenBeans> childrenBeansList = new ArrayList<>(); + private String userId; + private static final String TAG = "NextCloudActivity"; + private String moduleName; + private LinearLayout file_img_backs; + + private NextCloudResponse cloudResponse; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_file_layout); + userId = getIntent().getStringExtra("userId"); + moduleName = getIntent().getStringExtra("moduleName"); + mTree = (ListView) findViewById(R.id.file_lv); + file_img_backs = (LinearLayout) findViewById(R.id.file_img_backs); + + file_img_backs.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + initData(); + } + + public void initData() { + + String realType = ""; + switch (moduleName) { + case "myselfNetDisk": + realType = "1"; + break; + case "shareFolder": + realType = "2"; + + break; + case "documentManager": + realType = "3"; + break; + } + + FileClient fileClient = new FileClient(); + fileClient.nextCloud(userId, realType).enqueue(new Callback<NextCloudResponse>() { + @Override + public void onResponse(Call<NextCloudResponse> call, Response<NextCloudResponse> response) { + try { + cloudResponse = response.body(); + + List<NextCloudResponse.ListBean> list = response.body().getList(); + for (NextCloudResponse.ListBean listBean : list) { + ChildrenBeans childrenBeans = new ChildrenBeans(); + String type = listBean.getType(); + String name = listBean.getName(); + childrenBeans.setName(name); + childrenBeans.setType(type); + childrenBeansList.add(childrenBeans); + addData(listBean.getChildren()); + } + for (ChildrenBeans childrenBeans : childrenBeansList) { + Log.e(TAG, childrenBeans.toString() ); + } + + SimpleTreeListViewAdapter simpleTreeListViewAdapter + = new SimpleTreeListViewAdapter(mTree, NextCloudActivity.this, childrenBeansList, 0); + mTree.setAdapter(simpleTreeListViewAdapter); + simpleTreeListViewAdapter.setOnNodeClickListener(new TreeViewAdapter.OnTreeNodeClickListener() { + @Override + public void onClick(Node node, int position) { + if (node.isFile()) { + Toast.makeText(NextCloudActivity.this, node.getName(), Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(); + intent.putExtra("absolutePath",cloudResponse.getAbsolutePath()); + intent.putExtra("filePaths", node.getName()); + setResult(0x013, intent); + finish(); + } + } + }); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + } + + @Override + public void onFailure(Call<NextCloudResponse> call, Throwable t) { + t.printStackTrace(); + } + }); + } + + private void addData(List<NextCloudResponse.ListBean.ChildrenBean> mList) { + + for (NextCloudResponse.ListBean.ChildrenBean childrenBean : mList) { + if (childrenBean == null) return; + ChildrenBeans childrenBeans = new ChildrenBeans(); + String name = childrenBean.getName(); + String type = childrenBean.getType(); + childrenBeans.setName(name); + childrenBeans.setType(type); + childrenBeansList.add(childrenBeans); + if (childrenBean.getChildrenBeen() != null) { + addData(childrenBean.getChildrenBeen()); + } + } + } +} diff --git a/webfile/src/main/java/com/bril/webfile/net/Constant.java b/webfile/src/main/java/com/bril/webfile/net/Constant.java index 6e4e669..cf58e08 100644 --- a/webfile/src/main/java/com/bril/webfile/net/Constant.java +++ b/webfile/src/main/java/com/bril/webfile/net/Constant.java @@ -5,6 +5,6 @@ package com.bril.webfile.net; */ public class Constant { - public static String SWAGGERURL = "http://zjk.haomo-tech.com/zhangjiakouOA/"; -// public static String SWAGGERURL = "http://143.19.128.79/api/"; +// public static String SWAGGERURL = "http://zjk.haomo-tech.com/zhangjiakouOA/"; + public static String SWAGGERURL = "http://143.19.128.79/api/"; } diff --git a/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java b/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java index 2430a38..5e4fa22 100644 --- a/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java +++ b/webfile/src/main/java/com/bril/webfile/net/api/FileAPI.java @@ -1,10 +1,12 @@ package com.bril.webfile.net.api; import com.bril.webfile.response.FileResponse; +import com.bril.webfile.response.NextCloudResponse; import java.util.List; import io.reactivex.Observable; +import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; @@ -19,4 +21,9 @@ public interface FileAPI { Observable<List<FileResponse>> fileModel(@Field("user_id") String userId, @Field("module_names") String moduleNames); + @FormUrlEncoded + @POST("get_nextcloud_folders") + Call<NextCloudResponse> nextCloud(@Field("userId") String userId, + @Field("modular") String modular, + @Field("addEmptyFolder") boolean addEmptyFolder); } diff --git a/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java b/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java index cf3e075..fdef4b4 100644 --- a/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java +++ b/webfile/src/main/java/com/bril/webfile/net/client/FileClient.java @@ -4,10 +4,12 @@ package com.bril.webfile.net.client; import com.bril.webfile.net.Constant; import com.bril.webfile.net.api.FileAPI; import com.bril.webfile.response.FileResponse; +import com.bril.webfile.response.NextCloudResponse; import java.util.List; import io.reactivex.Observable; +import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; @@ -29,4 +31,8 @@ public class FileClient extends BaseClient { return fileAPI.fileModel(userId,moduleName); } + public Call<NextCloudResponse> nextCloud(String userId, String moduleName) { + return fileAPI.nextCloud(userId,moduleName,false); + } + } diff --git a/webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java b/webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java new file mode 100644 index 0000000..64dff57 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/response/ChildrenBeans.java @@ -0,0 +1,52 @@ +package com.bril.webfile.response; + +import com.bril.webfile.treeview.annotation.NodeName; +import com.bril.webfile.treeview.annotation.NodeType; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +public class ChildrenBeans { + @NodeName + private String name; + + private String state; + @NodeType + private String type; + + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + return "ChildrenBeans{" + + "name='" + name + '\'' + + ", state='" + state + '\'' + + ", type='" + type + '\'' + + '}'; + } +} diff --git a/webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java b/webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java new file mode 100644 index 0000000..aedd229 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/response/NextCloudResponse.java @@ -0,0 +1,137 @@ +package com.bril.webfile.response; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * Created by Xinghx on 2018/6/21 + */ + +public class NextCloudResponse { + + /** + * absolutePath : /data/nextcloud/networkdisk/data/19803130208/files/ + * list : [{"children":[{"children":[],"name":"Photos/Hummingbird.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Coast.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Nut.jpg","state":"open","type":"file"}],"name":"Photos","state":"closed","type":"folder"},{"children":[],"name":"Docker������Java Web������.docx","state":"open","type":"file"},{"children":[],"name":"Nex tcloud.mp4","state":"open","type":"file"},{"children":[],"name":"B02D88149D896F1D004B03F4076D218E.jpg","state":"open","type":"file"},{"children":[{"children":[],"name":"Documents/About.odt","state":"open","type":"file"},{"children":[],"name":"Documents/About.txt","state":"open","type":"file"}],"name":"Documents","state":"closed","type":"folder"}] + */ + + private String absolutePath; + private List<ListBean> list; + + public String getAbsolutePath() { + return absolutePath; + } + + public void setAbsolutePath(String absolutePath) { + this.absolutePath = absolutePath; + } + + public List<ListBean> getList() { + return list; + } + + public void setList(List<ListBean> list) { + this.list = list; + } + + public static class ListBean { + /** + * children : [{"children":[],"name":"Photos/Hummingbird.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Coast.jpg","state":"open","type":"file"},{"children":[],"name":"Photos/Nut.jpg","state":"open","type":"file"}] + * name : Photos + * state : closed + * type : folder + */ + private String name; + private String state; + private String type; + private List<ChildrenBean> children; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List<ChildrenBean> getChildren() { + return children; + } + + public void setChildren(List<ChildrenBean> children) { + this.children = children; + } + + public class ChildrenBean { + /** + * children : [] + * name : Photos/Hummingbird.jpg + * state : open + * type : file + */ + @SerializedName("children") + private List<ChildrenBean> childrenBeen; + private String name; + private String state; + private String type; + + public List<ChildrenBean> getChildrenBeen() { + return childrenBeen; + } + + public void setChildrenBeen(List<ChildrenBean> childrenBeen) { + this.childrenBeen = childrenBeen; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + return "ChildrenBean{" + + "childrenBeen=" + childrenBeen + + ", name='" + name + '\'' + + ", state='" + state + '\'' + + ", type='" + type + '\'' + + '}'; + } + } + } +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java b/webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java new file mode 100644 index 0000000..8494c64 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/adapter/SimpleTreeListViewAdapter.java @@ -0,0 +1,62 @@ +package com.bril.webfile.treeview.adapter; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.bril.webfile.R; +import com.bril.webfile.treeview.node.Node; + +import java.util.List; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +public class SimpleTreeListViewAdapter extends TreeViewAdapter { + + public SimpleTreeListViewAdapter(ListView tree, Context context, List datas, int defaultLevel) throws IllegalAccessException { + + super(tree, context, datas, defaultLevel); + } + + @Override + public View getConvertView(Node node, int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder = null; + if (convertView == null) { + convertView = mInflater.inflate(R.layout.list_item, parent, false); + viewHolder = new ViewHolder(); + viewHolder.mIcon = convertView.findViewById(R.id.id_item_icon); + viewHolder.mText = convertView.findViewById(R.id.id_item_text); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + if (node.getIcon() == -1) { + viewHolder.mIcon.setVisibility(View.INVISIBLE); + } else { + viewHolder.mIcon.setVisibility(View.VISIBLE); + viewHolder.mIcon.setImageResource(node.getIcon()); + } + String name = node.getName(); + int i = name.lastIndexOf("/"); + String realName = name.substring(i + 1, name.length()); + viewHolder.mText.setText(realName); +// if (i == -1) { +// viewHolder.mText.setText(name); +// } else { +// +// } + + return convertView; + } + + public class ViewHolder{ + ImageView mIcon; + TextView mText; + + } +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java b/webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java new file mode 100644 index 0000000..e687d32 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/adapter/TreeViewAdapter.java @@ -0,0 +1,92 @@ +package com.bril.webfile.treeview.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListView; + +import com.bril.webfile.treeview.helper.TreeHelper; +import com.bril.webfile.treeview.node.Node; + +import java.util.List; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +public abstract class TreeViewAdapter<T> extends BaseAdapter{ + + private Context mContext; + private List<Node> mAllNodes; + private List<Node> mVisiableNodes; + protected LayoutInflater mInflater; + private ListView tree; + public interface OnTreeNodeClickListener{ + void onClick(Node node,int position); + } + + private OnTreeNodeClickListener mListener; + + public void setOnNodeClickListener(OnTreeNodeClickListener mListener) { + this.mListener = mListener; + } + + public TreeViewAdapter(ListView tree, Context context, List<T> datas, int defaultLevel) throws IllegalAccessException { + this.mContext = context; + mAllNodes = TreeHelper.getSortedNodes(datas, defaultLevel); + mVisiableNodes = TreeHelper.filterVisibleNodes(mAllNodes); + mInflater= LayoutInflater.from(context); + this.tree = tree; + + tree.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + expandOrCollapse(position); + if (mListener != null) { + mListener.onClick(mVisiableNodes.get(position),position); + } + } + }); + } + + /** + * 点击收缩或者展开 + * @param position + */ + private void expandOrCollapse(int position) { + Node n = mVisiableNodes.get(position); + if (n.isFile()) return; + n.setExpand(!n.isExpand()); + mVisiableNodes = TreeHelper.filterVisibleNodes(mAllNodes); + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mVisiableNodes.size(); + } + + @Override + public Object getItem(int position) { + return mVisiableNodes.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + Node node = mVisiableNodes.get(position); + convertView = getConvertView(node, position, convertView, parent); + // è®¾ç½®å†…è¾¹è· + convertView.setPadding(node.getLevel() * 50 ,3 , 3 ,3); + return convertView; + } + + public abstract View getConvertView(Node node,int position, View convertView, ViewGroup parent); +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java new file mode 100644 index 0000000..c708478 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeName.java @@ -0,0 +1,16 @@ +package com.bril.webfile.treeview.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NodeName { + +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java new file mode 100644 index 0000000..88cc0c2 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodePID.java @@ -0,0 +1,15 @@ +package com.bril.webfile.treeview.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NodePID { + +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java new file mode 100644 index 0000000..f29ebab --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/annotation/NodeType.java @@ -0,0 +1,16 @@ +package com.bril.webfile.treeview.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NodeType { + +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java b/webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java new file mode 100644 index 0000000..b3a9db7 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/helper/TreeHelper.java @@ -0,0 +1,188 @@ +package com.bril.webfile.treeview.helper; + +import android.util.Log; + +import com.bril.webfile.R; +import com.bril.webfile.treeview.annotation.NodeName; +import com.bril.webfile.treeview.annotation.NodeType; +import com.bril.webfile.treeview.node.Node; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +public class TreeHelper { + private static final String TAG = "TreeHelper"; + /** + * 把用户æä¾›çš„æ•°æ® 转为NODE + * + * @param <T> + * @return + */ + public static <T> List<Node> convertData2Nodes(List<T> datas) throws IllegalAccessException { + List<Node> nodes = new ArrayList<>(); + Node node = null; + + for (T t : datas) { + String type = "folder"; + String name = ""; + + Class clazz = t.getClass(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (field.getAnnotation(NodeType.class) != null) { + field.setAccessible(true); + type = (String) field.get(t); + } + if (field.getAnnotation(NodeName.class) != null) { + field.setAccessible(true); + name = (String) field.get(t); + } + } + + node = new Node(name, type); + nodes.add(node); + } + + // 设置node间节点关系 + for (int i = 0; i < nodes.size(); i++) { + Node n = nodes.get(i); + for (int j = i + 1; j < nodes.size(); j++) { + Node m = nodes.get(j); + Log.d(TAG, "" + m.getName() + " " + n.getName()); + String aaa = m.getName(); + String bbb = n.getName(); + if (aaa.lastIndexOf("/") != -1) { + aaa = aaa.substring(0, aaa.lastIndexOf("/")); + } + + if (aaa.equals(n.getName()) && n.isFolder()) { + Log.d(TAG, "convertData2Nodes: " + m.getName() + " " + n.getName()); + n.getChildren().add(m); + m.setParent(n); + } else if (n.getName().equals(aaa) && m.isFolder()) { + Log.d(TAG, "convertData2Nodes else : " + m.getName() + " " + n.getName()); + m.getChildren().add(n); + n.setParent(m); + } + } + } + + for (Node n : nodes) { + setNodeIcons(n); + } + + + //方法2 +// for (int i = 0; i < datas.size(); i++) { +// Node n = nodes.get(i); +// for (int j = i + 1; j < nodes.size(); j++) { +// Node m = nodes.get(j); +// if (m.getpId() instanceof String) { +// if (m.getpId().equals(n.getId())) { +// n.getChildren().add(m); +// m.setParent(n); +// } else if (m.getId().equals(n.getpId())) { +// m.getChildren().add(n); +// n.setParent(m); +// } +// } else { +// if (m.getpId() == n.getId()) { +// n.getChildren().add(m); +// m.setParent(n); +// } else if (m.getId() == n.getpId()) { +// m.getChildren().add(n); +// n.setParent(m); +// } +// } +// } + return nodes; + } + + /** + * 为nodeè®¾ç½®å›¾æ ‡ + * + * @param n + */ + public static void setNodeIcons(Node n) { + if (n.getChildren().size() > 0 && n.isExpand() && n.isFolder()) { + n.setIcon(R.drawable.tree_ex); + + } else if (n.getChildren().size() > 0 && !n.isExpand() && n.isFolder()) { + n.setIcon(R.drawable.tree_ec); + } else { + n.setIcon(-1); + } + } + + public static <T> List<Node> getSortedNodes(List<T> datas,int defaultExpandLevel) throws IllegalAccessException { + List<Node> result = new ArrayList<>(); + List<Node> nodes = convertData2Nodes(datas); + + List<Node> rootNodes = getRootNodes(nodes); + + for (Node node : rootNodes) { + addNode(result, node, defaultExpandLevel, 1); + } + + Log.e("TAG", result.size() + ""); + return result; + + } + + + /** + * 从所有节点ä¸è¿‡æ»¤å‡ºæ ¹èŠ‚ç‚¹ + * + * @param nodes + * @return + */ + private static List<Node> getRootNodes(List<Node> nodes) { + List<Node> root = new ArrayList<Node>(); + for (Node node : nodes) { + if (node.isRoot()) { + root.add(node); + } + } + return root; + } + + private static void addNode(List<Node> result, Node node, + int defaultExpandLevel, int currentLevel) { + result.add(node); + if (defaultExpandLevel >= currentLevel) { + node.setExpand(true); + } + if (node.isFile()) + return; + + for (int i = 0; i < node.getChildren().size(); i++) { + addNode(result, node.getChildren().get(i), defaultExpandLevel, + currentLevel + 1); + } + + } + + + /** + * 过滤出å¯è§çš„节点 + * + * @param nodes + * @return + */ + public static List<Node> filterVisibleNodes(List<Node> nodes) { + List<Node> result = new ArrayList<Node>(); + + for (Node node : nodes) { + if (node.isRoot() || node.isParentExpand()) { + setNodeIcons(node); + result.add(node); + } + } + return result; + } +} diff --git a/webfile/src/main/java/com/bril/webfile/treeview/node/Node.java b/webfile/src/main/java/com/bril/webfile/treeview/node/Node.java new file mode 100644 index 0000000..3103f64 --- /dev/null +++ b/webfile/src/main/java/com/bril/webfile/treeview/node/Node.java @@ -0,0 +1,154 @@ +package com.bril.webfile.treeview.node; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Xinghx on 2018/6/25 0025. + */ + +public class Node { + + private String id; + private String pId = "0"; + private String name; // 文件的åå— + private String type = "folder"; // 属于文件还是文件夹 + + private int level; // æ ‘çš„æ·±åº¦ + + private boolean isExpand; // 是å¦å±•å¼€ + private int icon; + private Node parent; + private List<Node> children = new ArrayList<>(); + + public Node() { + } + + public Node(String pId, String name, String type) { + this.pId = pId; + this.name = name; + this.type = type; + } + + public Node(String name, String type) { + this.name = name; + this.type = type; + } + + /** + * æ˜¯å¦æ˜¯æ ¹èŠ‚ç‚¹ + * @return + */ + public boolean isRoot() { + return parent == null; + } + + + public boolean isParentExpand() { + if (parent == null) return false; + + return parent.isExpand(); + } + + /** + * æ˜¯å¦æ˜¯æ–‡ä»¶å¤¹ + * @return + */ + public boolean isFolder() { + return "folder".equals(getType()); + } + + public boolean isFile() { + return "file".equals(getType()); + } + + /** + * æ˜¯å¦æ˜¯å¶å节点 + * @return + */ + public boolean isLeaf() { + return children.size() == 0; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getpId() { + return pId; + } + + public void setpId(String pId) { + this.pId = pId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + /** + * 得到当å‰èŠ‚ç‚¹çš„å±‚çº§ + * @return + */ + public int getLevel() { + return parent == null ? 0 : parent.getLevel() + 1; + } + + public void setLevel(int level) { + this.level = level; + } + + public boolean isExpand() { + return isExpand; + } + + public void setExpand(boolean expand) { + isExpand = expand; + if (!isExpand) { + for (Node node : children) { + node.setExpand(false); + } + } + } + + public int getIcon() { + return icon; + } + + public void setIcon(int icon) { + this.icon = icon; + } + + public Node getParent() { + return parent; + } + + public void setParent(Node parent) { + this.parent = parent; + } + + public List<Node> getChildren() { + return children; + } + + public void setChildren(List<Node> children) { + this.children = children; + } +} diff --git a/webfile/src/main/res/drawable-mdpi/tree_ec.png b/webfile/src/main/res/drawable-mdpi/tree_ec.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6bfe9b7850be3eacfc9eb574024ede698f61c8 GIT binary patch literal 2858 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 IM6N<$g67(47ytkO literal 0 HcmV?d00001 diff --git a/webfile/src/main/res/drawable-mdpi/tree_ex.png b/webfile/src/main/res/drawable-mdpi/tree_ex.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb9352cc91f79f985aaed7e65c190709928bf3b GIT binary patch literal 2848 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 literal 0 HcmV?d00001 diff --git a/webfile/src/main/res/layout/list_item.xml b/webfile/src/main/res/layout/list_item.xml new file mode 100644 index 0000000..fcb963b --- /dev/null +++ b/webfile/src/main/res/layout/list_item.xml @@ -0,0 +1,25 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="40dp" > + + <ImageView + android:id="@+id/id_item_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginLeft="5dp" + android:layout_marginRight="5dp" + android:src="@drawable/tree_ec" /> + + <TextView + android:layout_centerVertical="true" + android:id="@+id/id_item_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@id/id_item_icon" + android:text="" + android:textSize="18sp" /> + +</RelativeLayout> \ No newline at end of file -- 2.21.0