diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index c98da471cd881..0dcd02da442b2 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -286,51 +286,34 @@ public class RootsFragment extends Fragment { public RootsAdapter(Context context, Collection roots, Intent includeApps) { super(context, 0); - RootItem recents = null; - RootItem images = null; - RootItem videos = null; - RootItem audio = null; - RootItem downloads = null; - - final List clouds = new ArrayList<>(); - final List locals = new ArrayList<>(); + final List libraries = new ArrayList<>(); + final List clouds = new ArrayList<>(); + final List locals = new ArrayList<>(); for (RootInfo root : roots) { - if (root.isRecents()) { - recents = new RootItem(root); - } else if (root.isExternalStorage()) { - locals.add(root); - } else if (root.isDownloads()) { - downloads = new RootItem(root); - } else if (root.isImages()) { - images = new RootItem(root); - } else if (root.isVideos()) { - videos = new RootItem(root); - } else if (root.isAudio()) { - audio = new RootItem(root); - } else { - clouds.add(root); + RootItem item = new RootItem(root); + switch (root.derivedType) { + case RootInfo.TYPE_LOCAL: + locals.add(item); + break; + case RootInfo.TYPE_CLOUD: + clouds.add(item); + break; + default: + libraries.add(item); + break; } } final RootComparator comp = new RootComparator(); - Collections.sort(clouds, comp); + Collections.sort(libraries, comp); Collections.sort(locals, comp); + Collections.sort(clouds, comp); - if (recents != null) add(recents); - - for (RootInfo cloud : clouds) { - add(new RootItem(cloud)); - } - - if (images != null) add(images); - if (videos != null) add(videos); - if (audio != null) add(audio); - if (downloads != null) add(downloads); - - for (RootInfo local : locals) { - add(new RootItem(local)); - } + addAll(libraries); + add(new SpacerItem()); + addAll(locals); + addAll(clouds); if (includeApps != null) { final PackageManager pm = context.getPackageManager(); @@ -348,9 +331,7 @@ public class RootsFragment extends Fragment { if (apps.size() > 0) { add(new SpacerItem()); - for (Item item : apps) { - add(item); - } + addAll(apps); } } } @@ -387,15 +368,20 @@ public class RootsFragment extends Fragment { } } - public static class RootComparator implements Comparator { + public static class RootComparator implements Comparator { @Override - public int compare(RootInfo lhs, RootInfo rhs) { - final int score = DocumentInfo.compareToIgnoreCaseNullable(lhs.title, rhs.title); + public int compare(RootItem lhs, RootItem rhs) { + // Sort by root type, then title, then summary. + int score = lhs.root.derivedType - rhs.root.derivedType; if (score != 0) { return score; - } else { - return DocumentInfo.compareToIgnoreCaseNullable(lhs.summary, rhs.summary); } + score = DocumentInfo.compareToIgnoreCaseNullable(lhs.root.title, rhs.root.title); + if (score != 0) { + return score; + } + + return DocumentInfo.compareToIgnoreCaseNullable(lhs.root.summary, rhs.root.summary); } } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java index ecf4d6c3bc998..17e6a801c53ea 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java @@ -44,6 +44,15 @@ public class RootInfo implements Durable, Parcelable { private static final int VERSION_INIT = 1; private static final int VERSION_DROP_TYPE = 2; + // The values of these constants determine the sort order of various roots in the RootsFragment. + public static final int TYPE_IMAGES = 1; + public static final int TYPE_VIDEO = 2; + public static final int TYPE_AUDIO = 3; + public static final int TYPE_RECENTS = 4; + public static final int TYPE_DOWNLOADS = 5; + public static final int TYPE_LOCAL = 6; + public static final int TYPE_CLOUD = 7; + public String authority; public String rootId; public int flags; @@ -57,6 +66,7 @@ public class RootInfo implements Durable, Parcelable { /** Derived fields that aren't persisted */ public String[] derivedMimeTypes; public int derivedIcon; + public int derivedType; public RootInfo() { reset(); @@ -76,6 +86,7 @@ public class RootInfo implements Durable, Parcelable { derivedMimeTypes = null; derivedIcon = 0; + derivedType = 0; } @Override @@ -158,14 +169,23 @@ public class RootInfo implements Durable, Parcelable { // TODO: remove these special case icons if (isExternalStorage()) { derivedIcon = R.drawable.ic_root_sdcard; + derivedType = TYPE_LOCAL; } else if (isDownloads()) { derivedIcon = R.drawable.ic_root_download; + derivedType = TYPE_DOWNLOADS; } else if (isImages()) { derivedIcon = R.drawable.ic_doc_image; + derivedType = TYPE_IMAGES; } else if (isVideos()) { derivedIcon = R.drawable.ic_doc_video; + derivedType = TYPE_VIDEO; } else if (isAudio()) { derivedIcon = R.drawable.ic_doc_audio; + derivedType = TYPE_AUDIO; + } else if (isRecents()) { + derivedType = TYPE_RECENTS; + } else { + derivedType = TYPE_CLOUD; } }