Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
沉迷打码的小凳子
glide
提交
d520efbc
G
glide
项目概览
沉迷打码的小凳子
/
glide
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
glide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d520efbc
编写于
3月 06, 2015
作者:
S
Sam Judd
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "Allow recursively pausing/resuming requests in a given context heirarchy."
This reverts commit
66db4a40
.
上级
66db4a40
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
13 addition
and
285 deletion
+13
-285
library/src/androidTest/java/com/bumptech/glide/GlideTest.java
...ry/src/androidTest/java/com/bumptech/glide/GlideTest.java
+1
-3
library/src/androidTest/java/com/bumptech/glide/RequestManagerTest.java
...droidTest/java/com/bumptech/glide/RequestManagerTest.java
+1
-4
library/src/main/java/com/bumptech/glide/RequestManager.java
library/src/main/java/com/bumptech/glide/RequestManager.java
+4
-41
library/src/main/java/com/bumptech/glide/manager/EmptyRequestManagerTreeNode.java
...m/bumptech/glide/manager/EmptyRequestManagerTreeNode.java
+0
-16
library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java
...va/com/bumptech/glide/manager/RequestManagerFragment.java
+0
-92
library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java
...a/com/bumptech/glide/manager/RequestManagerRetriever.java
+7
-19
library/src/main/java/com/bumptech/glide/manager/RequestManagerTreeNode.java
...va/com/bumptech/glide/manager/RequestManagerTreeNode.java
+0
-17
library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java
...bumptech/glide/manager/SupportRequestManagerFragment.java
+0
-93
未找到文件。
library/src/androidTest/java/com/bumptech/glide/GlideTest.java
浏览文件 @
d520efbc
...
...
@@ -48,7 +48,6 @@ import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
import
com.bumptech.glide.manager.Lifecycle
;
import
com.bumptech.glide.request.Request
;
import
com.bumptech.glide.request.RequestListener
;
import
com.bumptech.glide.manager.RequestManagerTreeNode
;
import
com.bumptech.glide.request.animation.GlideAnimation
;
import
com.bumptech.glide.request.target.SizeReadyCallback
;
import
com.bumptech.glide.request.target.Target
;
...
...
@@ -138,8 +137,7 @@ public class GlideTest {
Glide
.
get
(
getContext
()).
register
(
GlideUrl
.
class
,
InputStream
.
class
,
mockUrlLoaderFactory
);
Lifecycle
lifecycle
=
mock
(
Lifecycle
.
class
);
RequestManagerTreeNode
treeNode
=
mock
(
RequestManagerTreeNode
.
class
);
requestManager
=
new
RequestManager
(
getContext
(),
lifecycle
,
treeNode
);
requestManager
=
new
RequestManager
(
getContext
(),
lifecycle
);
requestManager
.
resumeRequests
();
}
...
...
library/src/androidTest/java/com/bumptech/glide/RequestManagerTest.java
浏览文件 @
d520efbc
...
...
@@ -24,7 +24,6 @@ import com.bumptech.glide.manager.ConnectivityMonitor;
import
com.bumptech.glide.manager.ConnectivityMonitor.ConnectivityListener
;
import
com.bumptech.glide.manager.ConnectivityMonitorFactory
;
import
com.bumptech.glide.manager.Lifecycle
;
import
com.bumptech.glide.manager.RequestManagerTreeNode
;
import
com.bumptech.glide.manager.RequestTracker
;
import
com.bumptech.glide.tests.BackgroundUtil
;
import
com.bumptech.glide.tests.GlideShadowLooper
;
...
...
@@ -51,7 +50,6 @@ public class RequestManagerTest {
private
ConnectivityListener
connectivityListener
;
private
RequestManager
.
DefaultOptions
options
;
private
Lifecycle
lifecycle
=
mock
(
Lifecycle
.
class
);
private
RequestManagerTreeNode
treeNode
=
mock
(
RequestManagerTreeNode
.
class
);
@Before
public
void
setUp
()
{
...
...
@@ -66,8 +64,7 @@ public class RequestManagerTest {
}
});
requestTracker
=
mock
(
RequestTracker
.
class
);
manager
=
new
RequestManager
(
RuntimeEnvironment
.
application
,
lifecycle
,
treeNode
,
requestTracker
,
factory
);
manager
=
new
RequestManager
(
Robolectric
.
application
,
lifecycle
,
requestTracker
,
factory
);
options
=
mock
(
RequestManager
.
DefaultOptions
.
class
);
manager
.
setDefaultOptions
(
options
);
}
...
...
library/src/main/java/com/bumptech/glide/RequestManager.java
浏览文件 @
d520efbc
...
...
@@ -17,7 +17,6 @@ import com.bumptech.glide.manager.ConnectivityMonitor;
import
com.bumptech.glide.manager.ConnectivityMonitorFactory
;
import
com.bumptech.glide.manager.Lifecycle
;
import
com.bumptech.glide.manager.LifecycleListener
;
import
com.bumptech.glide.manager.RequestManagerTreeNode
;
import
com.bumptech.glide.manager.RequestTracker
;
import
com.bumptech.glide.signature.ApplicationVersionSignature
;
import
com.bumptech.glide.signature.MediaStoreSignature
;
...
...
@@ -43,21 +42,19 @@ import java.util.UUID;
public
class
RequestManager
implements
LifecycleListener
{
private
final
Context
context
;
private
final
Lifecycle
lifecycle
;
private
final
RequestManagerTreeNode
treeNode
;
private
final
RequestTracker
requestTracker
;
private
final
Glide
glide
;
private
final
OptionsApplier
optionsApplier
;
private
DefaultOptions
options
;
public
RequestManager
(
Context
context
,
Lifecycle
lifecycle
,
RequestManagerTreeNode
treeNode
)
{
this
(
context
,
lifecycle
,
treeNode
,
new
RequestTracker
(),
new
ConnectivityMonitorFactory
());
public
RequestManager
(
Context
context
,
Lifecycle
lifecycle
)
{
this
(
context
,
lifecycle
,
new
RequestTracker
(),
new
ConnectivityMonitorFactory
());
}
RequestManager
(
Context
context
,
final
Lifecycle
lifecycle
,
Request
ManagerTreeNode
treeNode
,
RequestTracker
requestTracker
,
ConnectivityMonitorFactory
factory
)
{
RequestManager
(
Context
context
,
final
Lifecycle
lifecycle
,
Request
Tracker
requestTracker
,
ConnectivityMonitorFactory
factory
)
{
this
.
context
=
context
.
getApplicationContext
();
this
.
lifecycle
=
lifecycle
;
this
.
treeNode
=
treeNode
;
this
.
requestTracker
=
requestTracker
;
this
.
glide
=
Glide
.
get
(
context
);
this
.
optionsApplier
=
new
OptionsApplier
();
...
...
@@ -148,27 +145,6 @@ public class RequestManager implements LifecycleListener {
requestTracker
.
pauseRequests
();
}
/**
* Performs {@link #pauseRequests()} recursively for all managers that are contextually descendant
* to this manager based on the Activity/Fragment hierarchy:
*
* <ul>
* <li>When pausing on an Activity all attached fragments will also get paused.
* <li>When pausing on an attached Fragment all descendant fragments will also get paused.
* <li>When pausing on a detached Fragment or the application context only the current RequestManager is paused.
* </ul>
*
* <p>Note, on pre-Jelly Bean MR1 calling pause on a Fragment will not cause child fragments to pause, in this
* case either call pause on the Activity or use a support Fragment.
*/
public
void
pauseRequestsRecursive
()
{
Util
.
assertMainThread
();
pauseRequests
();
for
(
RequestManager
requestManager
:
treeNode
.
getDescendants
())
{
requestManager
.
pauseRequests
();
}
}
/**
* Restarts any loads that have not yet completed.
*
...
...
@@ -180,19 +156,6 @@ public class RequestManager implements LifecycleListener {
requestTracker
.
resumeRequests
();
}
/**
* Performs {@link #resumeRequests()} recursively for all managers that are contextually descendant
* to this manager based on the Activity/Fragment hierarchy. The hierarchical semantics are identical as for
* {@link #pauseRequestsRecursive()}.
*/
public
void
resumeRequestsRecursive
()
{
Util
.
assertMainThread
();
resumeRequests
();
for
(
RequestManager
requestManager
:
treeNode
.
getDescendants
())
{
requestManager
.
resumeRequests
();
}
}
/**
* Lifecycle callback that registers for connectivity events (if the android.permission.ACCESS_NETWORK_STATE
* permission is present) and restarts failed or paused requests.
...
...
library/src/main/java/com/bumptech/glide/manager/EmptyRequestManagerTreeNode.java
已删除
100644 → 0
浏览文件 @
66db4a40
package
com.bumptech.glide.manager
;
import
com.bumptech.glide.RequestManager
;
import
java.util.Collections
;
import
java.util.Set
;
/**
* A {@link RequestManagerTreeNode} that returns no relatives.
*/
final
class
EmptyRequestManagerTreeNode
implements
RequestManagerTreeNode
{
@Override
public
Set
<
RequestManager
>
getDescendants
()
{
return
Collections
.
emptySet
();
}
}
library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java
浏览文件 @
d520efbc
...
...
@@ -2,16 +2,11 @@ package com.bumptech.glide.manager;
import
android.annotation.SuppressLint
;
import
android.annotation.TargetApi
;
import
android.app.Activity
;
import
android.app.Fragment
;
import
android.os.Build
;
import
com.bumptech.glide.RequestManager
;
import
java.util.Collections
;
import
java.util.HashSet
;
import
java.util.Set
;
/**
* A view-less {@link android.app.Fragment} used to safely store an {@link com.bumptech.glide.RequestManager} that
* can be used to start, stop and manage Glide requests started for targets the fragment or activity this fragment is a
...
...
@@ -24,10 +19,7 @@ import java.util.Set;
@TargetApi
(
Build
.
VERSION_CODES
.
HONEYCOMB
)
public
class
RequestManagerFragment
extends
Fragment
{
private
final
ActivityFragmentLifecycle
lifecycle
;
private
final
RequestManagerTreeNode
requestManagerTreeNode
=
new
FragmentRequestManagerTreeNode
();
private
RequestManager
requestManager
;
private
final
HashSet
<
RequestManagerFragment
>
childRequestManagerFragments
=
new
HashSet
<>();
private
RequestManagerFragment
rootRequestManagerFragment
;
public
RequestManagerFragment
()
{
this
(
new
ActivityFragmentLifecycle
());
...
...
@@ -59,76 +51,6 @@ public class RequestManagerFragment extends Fragment {
return
requestManager
;
}
public
RequestManagerTreeNode
getRequestManagerTreeNode
()
{
return
requestManagerTreeNode
;
}
private
void
addChildRequestManagerFragment
(
RequestManagerFragment
child
)
{
childRequestManagerFragments
.
add
(
child
);
}
private
void
removeChildRequestManagerFragment
(
RequestManagerFragment
child
)
{
childRequestManagerFragments
.
remove
(
child
);
}
/**
* Returns the set of fragments that this RequestManagerFragment's parent is a parent to. (i.e. our parent is
* the fragment that we are annotating).
*/
@TargetApi
(
Build
.
VERSION_CODES
.
JELLY_BEAN_MR1
)
public
Set
<
RequestManagerFragment
>
getDescendantRequestManagerFragments
()
{
if
(
rootRequestManagerFragment
==
this
)
{
return
Collections
.
unmodifiableSet
(
childRequestManagerFragments
);
}
else
if
(
rootRequestManagerFragment
==
null
||
Build
.
VERSION
.
SDK_INT
<
Build
.
VERSION_CODES
.
JELLY_BEAN_MR1
)
{
// Pre JB MR1 doesn't allow us to get the parent fragment so we can't introspect hierarchy, so just
// return an empty set.
return
Collections
.
emptySet
();
}
else
{
HashSet
<
RequestManagerFragment
>
descendants
=
new
HashSet
<>();
for
(
RequestManagerFragment
fragment
:
rootRequestManagerFragment
.
getDescendantRequestManagerFragments
())
{
if
(
isDescendant
(
fragment
.
getParentFragment
()))
{
descendants
.
add
(
fragment
);
}
}
return
Collections
.
unmodifiableSet
(
descendants
);
}
}
/**
* Returns true if the fragment is a descendant of our parent,
*/
@TargetApi
(
Build
.
VERSION_CODES
.
JELLY_BEAN_MR1
)
private
boolean
isDescendant
(
Fragment
fragment
)
{
Fragment
root
=
this
.
getParentFragment
();
while
(
fragment
.
getParentFragment
()
!=
null
)
{
if
(
fragment
.
getParentFragment
()
==
root
)
{
return
true
;
}
fragment
=
fragment
.
getParentFragment
();
}
return
false
;
}
@Override
public
void
onAttach
(
Activity
activity
)
{
super
.
onAttach
(
activity
);
rootRequestManagerFragment
=
RequestManagerRetriever
.
get
()
.
getRequestManagerFragment
(
getActivity
().
getFragmentManager
());
if
(
rootRequestManagerFragment
!=
this
)
{
rootRequestManagerFragment
.
addChildRequestManagerFragment
(
this
);
}
}
@Override
public
void
onDetach
()
{
super
.
onDetach
();
if
(
rootRequestManagerFragment
!=
null
)
{
rootRequestManagerFragment
.
removeChildRequestManagerFragment
(
this
);
rootRequestManagerFragment
=
null
;
}
}
@Override
public
void
onStart
()
{
super
.
onStart
();
...
...
@@ -164,18 +86,4 @@ public class RequestManagerFragment extends Fragment {
requestManager
.
onLowMemory
();
}
}
private
class
FragmentRequestManagerTreeNode
implements
RequestManagerTreeNode
{
@Override
public
Set
<
RequestManager
>
getDescendants
()
{
Set
<
RequestManagerFragment
>
descendantFragments
=
getDescendantRequestManagerFragments
();
HashSet
<
RequestManager
>
descendants
=
new
HashSet
<>(
descendantFragments
.
size
());
for
(
RequestManagerFragment
fragment
:
descendantFragments
)
{
if
(
fragment
.
getRequestManager
()
!=
null
)
{
descendants
.
add
(
fragment
.
getRequestManager
());
}
}
return
descendants
;
}
}
}
library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java
浏览文件 @
d520efbc
...
...
@@ -17,11 +17,8 @@ import android.util.Log;
import
com.bumptech.glide.RequestManager
;
import
com.bumptech.glide.util.Util
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.Map
;
import
java.util.Set
;
/**
* A collection of static methods for creating new {@link com.bumptech.glide.RequestManager}s or retrieving existing
...
...
@@ -73,7 +70,7 @@ public class RequestManagerRetriever implements Handler.Callback {
// However, in this case since the manager attached to the application will not receive lifecycle
// events, we must force the manager to start resumed using ApplicationLifecycle.
applicationManager
=
new
RequestManager
(
context
.
getApplicationContext
(),
new
ApplicationLifecycle
()
,
new
EmptyRequestManagerTreeNode
()
);
new
ApplicationLifecycle
());
}
}
}
...
...
@@ -150,7 +147,8 @@ public class RequestManagerRetriever implements Handler.Callback {
}
}
RequestManagerFragment
getRequestManagerFragment
(
final
android
.
app
.
FragmentManager
fm
)
{
@TargetApi
(
Build
.
VERSION_CODES
.
HONEYCOMB
)
RequestManager
fragmentGet
(
Context
context
,
final
android
.
app
.
FragmentManager
fm
)
{
RequestManagerFragment
current
=
(
RequestManagerFragment
)
fm
.
findFragmentByTag
(
TAG
);
if
(
current
==
null
)
{
current
=
pendingRequestManagerFragments
.
get
(
fm
);
...
...
@@ -161,21 +159,16 @@ public class RequestManagerRetriever implements Handler.Callback {
handler
.
obtainMessage
(
ID_REMOVE_FRAGMENT_MANAGER
,
fm
).
sendToTarget
();
}
}
return
current
;
}
@TargetApi
(
Build
.
VERSION_CODES
.
HONEYCOMB
)
RequestManager
fragmentGet
(
Context
context
,
android
.
app
.
FragmentManager
fm
)
{
RequestManagerFragment
current
=
getRequestManagerFragment
(
fm
);
RequestManager
requestManager
=
current
.
getRequestManager
();
if
(
requestManager
==
null
)
{
requestManager
=
new
RequestManager
(
context
,
current
.
getLifecycle
()
,
current
.
getRequestManagerTreeNode
()
);
requestManager
=
new
RequestManager
(
context
,
current
.
getLifecycle
());
current
.
setRequestManager
(
requestManager
);
}
return
requestManager
;
}
SupportRequestManagerFragment
getSupportRequestManagerFragment
(
final
FragmentManager
fm
)
{
RequestManager
supportFragmentGet
(
Context
context
,
final
FragmentManager
fm
)
{
SupportRequestManagerFragment
current
=
(
SupportRequestManagerFragment
)
fm
.
findFragmentByTag
(
TAG
);
if
(
current
==
null
)
{
current
=
pendingSupportRequestManagerFragments
.
get
(
fm
);
...
...
@@ -186,14 +179,9 @@ public class RequestManagerRetriever implements Handler.Callback {
handler
.
obtainMessage
(
ID_REMOVE_SUPPORT_FRAGMENT_MANAGER
,
fm
).
sendToTarget
();
}
}
return
current
;
}
RequestManager
supportFragmentGet
(
Context
context
,
FragmentManager
fm
)
{
SupportRequestManagerFragment
current
=
getSupportRequestManagerFragment
(
fm
);
RequestManager
requestManager
=
current
.
getRequestManager
();
if
(
requestManager
==
null
)
{
requestManager
=
new
RequestManager
(
context
,
current
.
getLifecycle
()
,
current
.
getRequestManagerTreeNode
()
);
requestManager
=
new
RequestManager
(
context
,
current
.
getLifecycle
());
current
.
setRequestManager
(
requestManager
);
}
return
requestManager
;
...
...
library/src/main/java/com/bumptech/glide/manager/RequestManagerTreeNode.java
已删除
100644 → 0
浏览文件 @
66db4a40
package
com.bumptech.glide.manager
;
import
com.bumptech.glide.RequestManager
;
import
java.util.Set
;
/**
* Provides access to the relatives of a RequestManager based on the current context. The context hierarchy
* is provided by nesting in Activity and Fragments; the application context does not provide access to
* any other RequestManagers hierarchically.
*/
public
interface
RequestManagerTreeNode
{
/**
* Returns all descendant {@link RequestManager}s relative to the context of the current {@link RequestManager}.
*/
Set
<
RequestManager
>
getDescendants
();
}
library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java
浏览文件 @
d520efbc
package
com.bumptech.glide.manager
;
import
android.annotation.SuppressLint
;
import
android.app.Activity
;
import
android.support.v4.app.Fragment
;
import
com.bumptech.glide.RequestManager
;
import
java.util.Collections
;
import
java.util.HashSet
;
import
java.util.Set
;
/**
* A view-less {@link android.support.v4.app.Fragment} used to safely store an
* {@link com.bumptech.glide.RequestManager} that can be used to start, stop and manage Glide requests started for
...
...
@@ -22,10 +17,6 @@ import java.util.Set;
public
class
SupportRequestManagerFragment
extends
Fragment
{
private
RequestManager
requestManager
;
private
final
ActivityFragmentLifecycle
lifecycle
;
private
final
RequestManagerTreeNode
requestManagerTreeNode
=
new
SupportFragmentRequestManagerTreeNode
();
private
final
HashSet
<
SupportRequestManagerFragment
>
childRequestManagerFragments
=
new
HashSet
<>();
private
SupportRequestManagerFragment
rootRequestManagerFragment
;
public
SupportRequestManagerFragment
()
{
this
(
new
ActivityFragmentLifecycle
());
...
...
@@ -57,76 +48,6 @@ public class SupportRequestManagerFragment extends Fragment {
return
requestManager
;
}
/**
* Returns the {@link RequestManagerTreeNode} that provides tree traversal methods relative to the associated
* {@link RequestManager}.
*/
public
RequestManagerTreeNode
getRequestManagerTreeNode
()
{
return
requestManagerTreeNode
;
}
private
void
addChildRequestManagerFragment
(
SupportRequestManagerFragment
child
)
{
childRequestManagerFragments
.
add
(
child
);
}
private
void
removeChildRequestManagerFragment
(
SupportRequestManagerFragment
child
)
{
childRequestManagerFragments
.
remove
(
child
);
}
/**
* Returns the set of fragments that this RequestManagerFragment's parent is a parent to. (i.e. our parent is
* the fragment that we are annotating).
*/
public
Set
<
SupportRequestManagerFragment
>
getDescendantRequestManagerFragments
()
{
if
(
rootRequestManagerFragment
==
null
)
{
return
Collections
.
emptySet
();
}
else
if
(
rootRequestManagerFragment
==
this
)
{
return
Collections
.
unmodifiableSet
(
childRequestManagerFragments
);
}
else
{
HashSet
<
SupportRequestManagerFragment
>
descendants
=
new
HashSet
<>();
for
(
SupportRequestManagerFragment
fragment
:
rootRequestManagerFragment
.
getDescendantRequestManagerFragments
())
{
if
(
isDescendant
(
fragment
.
getParentFragment
()))
{
descendants
.
add
(
fragment
);
}
}
return
Collections
.
unmodifiableSet
(
descendants
);
}
}
/**
* Returns true if the fragment is a descendant of our parent,
*/
private
boolean
isDescendant
(
Fragment
fragment
)
{
Fragment
root
=
this
.
getParentFragment
();
while
(
fragment
.
getParentFragment
()
!=
null
)
{
if
(
fragment
.
getParentFragment
()
==
root
)
{
return
true
;
}
fragment
=
fragment
.
getParentFragment
();
}
return
false
;
}
@Override
public
void
onAttach
(
Activity
activity
)
{
super
.
onAttach
(
activity
);
rootRequestManagerFragment
=
RequestManagerRetriever
.
get
()
.
getSupportRequestManagerFragment
(
getActivity
().
getSupportFragmentManager
());
if
(
rootRequestManagerFragment
!=
this
)
{
rootRequestManagerFragment
.
addChildRequestManagerFragment
(
this
);
}
}
@Override
public
void
onDetach
()
{
super
.
onDetach
();
if
(
rootRequestManagerFragment
!=
null
)
{
rootRequestManagerFragment
.
removeChildRequestManagerFragment
(
this
);
rootRequestManagerFragment
=
null
;
}
}
@Override
public
void
onStart
()
{
super
.
onStart
();
...
...
@@ -154,18 +75,4 @@ public class SupportRequestManagerFragment extends Fragment {
requestManager
.
onLowMemory
();
}
}
private
class
SupportFragmentRequestManagerTreeNode
implements
RequestManagerTreeNode
{
@Override
public
Set
<
RequestManager
>
getDescendants
()
{
Set
<
SupportRequestManagerFragment
>
descendantFragments
=
getDescendantRequestManagerFragments
();
HashSet
<
RequestManager
>
descendants
=
new
HashSet
<>(
descendantFragments
.
size
());
for
(
SupportRequestManagerFragment
fragment
:
descendantFragments
)
{
if
(
fragment
.
getRequestManager
()
!=
null
)
{
descendants
.
add
(
fragment
.
getRequestManager
());
}
}
return
descendants
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录