Loading src/com/android/documentsui/AbstractActionHandler.java +34 −2 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.app.Activity; import android.content.ClipData; import android.content.ClipData; import android.content.Intent; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Parcelable; import android.os.Parcelable; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.AbstractActionHandler.CommonAddons; Loading @@ -27,15 +28,21 @@ import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.Lookup; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; import com.android.documentsui.dirlist.AnimationView.AnimationType; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.manager.LauncherActivity; import com.android.documentsui.manager.LauncherActivity; import com.android.documentsui.roots.LoadRootTask; import com.android.documentsui.roots.RootsAccess; import com.android.documentsui.sidebar.EjectRootTask; import com.android.documentsui.sidebar.EjectRootTask; import java.util.List; import java.util.List; import java.util.concurrent.Executor; /** /** * Provides support for specializing the actions (viewDocument etc.) to the host activity. * Provides support for specializing the actions (viewDocument etc.) to the host activity. Loading @@ -44,10 +51,24 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> implements ActionHandler { implements ActionHandler { protected final T mActivity; protected final T mActivity; protected final State mState; protected final RootsAccess mRoots; protected final Lookup<String, Executor> mExecutors; public AbstractActionHandler( T activity, State state, RootsAccess roots, Lookup<String, Executor> executors) { public AbstractActionHandler(T activity) { assert(activity != null); assert(activity != null); assert(state != null); assert(roots != null); mActivity = activity; mActivity = activity; mState = state; mRoots = roots; mExecutors = executors; } } @Override @Override Loading Loading @@ -116,14 +137,25 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> throw new UnsupportedOperationException("Delete not supported!"); throw new UnsupportedOperationException("Delete not supported!"); } } @Override public final void loadRoot(Uri uri) { new LoadRootTask<>(mActivity, mRoots, mState, uri).executeOnExecutor( mExecutors.lookup(uri.getAuthority())); } protected final void loadHomeDir() { loadRoot(Shared.getDefaultRootUri(mActivity)); } /** /** * A class primarily for the support of isolating our tests * A class primarily for the support of isolating our tests * from our concrete activity implementations. * from our concrete activity implementations. */ */ public interface CommonAddons { public interface CommonAddons { void onRootPicked(RootInfo root); void onRootPicked(RootInfo root); void onDocumentPicked(DocumentInfo doc, Model model); // TODO: Move this to PickAddons. // TODO: Move this to PickAddons. void onDocumentsPicked(List<DocumentInfo> docs); void onDocumentsPicked(List<DocumentInfo> docs); void onDocumentPicked(DocumentInfo doc, Model model); void refreshCurrentRootAndDirectory(@AnimationType int anim); } } } } src/com/android/documentsui/ActionHandler.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,9 @@ package com.android.documentsui; package com.android.documentsui; import android.content.ClipData; import android.content.ClipData; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.net.Uri; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.ConfirmationCallback; Loading Loading @@ -48,6 +50,8 @@ public interface ActionHandler { void openRoot(ResolveInfo app); void openRoot(ResolveInfo app); void loadRoot(Uri uri); void openInNewWindow(DocumentStack path); void openInNewWindow(DocumentStack path); void pasteIntoFolder(RootInfo root); void pasteIntoFolder(RootInfo root); Loading @@ -59,4 +63,11 @@ public interface ActionHandler { boolean openDocument(DocumentDetails doc); boolean openDocument(DocumentDetails doc); void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback); void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback); /** * Called when initial activity setup is complete. Implementations * should override this method to set the initial location of the * app. */ void initLocation(Intent intent); } } src/com/android/documentsui/BaseActivity.java +1 −36 Original line number Original line Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.app.Activity; import android.app.Fragment; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentManager; import android.content.Intent; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo; Loading Loading @@ -69,7 +68,6 @@ import com.android.documentsui.dirlist.FragmentTuner; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager; import com.android.documentsui.dirlist.MultiSelectManager; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.roots.LoadRootTask; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.sidebar.RootsFragment; import com.android.documentsui.sidebar.RootsFragment; import com.android.documentsui.sorting.SortController; import com.android.documentsui.sorting.SortController; Loading Loading @@ -182,7 +180,6 @@ public abstract class BaseActivity getContentResolver().registerContentObserver( getContentResolver().registerContentObserver( RootsCache.sNotificationUri, false, mRootsCacheObserver); RootsCache.sNotificationUri, false, mRootsCacheObserver); DocumentsToolbar toolbar = (DocumentsToolbar) findViewById(R.id.toolbar); DocumentsToolbar toolbar = (DocumentsToolbar) findViewById(R.id.toolbar); setActionBar(toolbar); setActionBar(toolbar); Loading Loading @@ -418,11 +415,6 @@ public abstract class BaseActivity invalidateOptionsMenu(); invalidateOptionsMenu(); } } protected final void loadRoot(final Uri uri) { new LoadRootTask(this, mRoots, mState, uri).executeOnExecutor( ProviderExecutor.forAuthority(uri.getAuthority())); } /** /** * This is called when user hovers over a doc for enough time during a drag n' drop, to open a * This is called when user hovers over a doc for enough time during a drag n' drop, to open a * folder that accepts drop. We should only open a container that's not an archive. * folder that accepts drop. We should only open a container that's not an archive. Loading @@ -442,7 +434,7 @@ public abstract class BaseActivity List<String> authorities = new ArrayList<>(); List<String> authorities = new ArrayList<>(); if (getIntent().getBooleanExtra(DocumentsContract.EXTRA_EXCLUDE_SELF, false)) { if (getIntent().getBooleanExtra(DocumentsContract.EXTRA_EXCLUDE_SELF, false)) { // Exclude roots provided by the calling package. // Exclude roots provided by the calling package. String packageName = getCallingPackageMaybeExtra(); String packageName = Shared.getCallingPackageName(this); try { try { PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName, PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName, PackageManager.GET_PROVIDERS); PackageManager.GET_PROVIDERS); Loading @@ -461,22 +453,6 @@ public abstract class BaseActivity return (root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0; return (root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0; } } public final String getCallingPackageMaybeExtra() { String callingPackage = getCallingPackage(); // System apps can set the calling package name using an extra. try { ApplicationInfo info = getPackageManager().getApplicationInfo(callingPackage, 0); if (info.isSystemApp() || info.isUpdatedSystemApp()) { final String extra = getIntent().getStringExtra(DocumentsContract.EXTRA_PACKAGE_NAME); if (extra != null) { callingPackage = extra; } } } finally { return callingPackage; } } public static BaseActivity get(Fragment fragment) { public static BaseActivity get(Fragment fragment) { return (BaseActivity) fragment.getActivity(); return (BaseActivity) fragment.getActivity(); } } Loading @@ -485,17 +461,6 @@ public abstract class BaseActivity return mState; return mState; } } /* * Get the default directory to be presented after starting the activity. * Method can be overridden if the change of the behavior of the the child activity is needed. */ public Uri getDefaultRoot() { return Shared.shouldShowDocumentsRoot(this, getIntent()) ? DocumentsContract.buildHomeUri() : DocumentsContract.buildRootUri( "com.android.providers.downloads.documents", "downloads"); } /** /** * Set internal storage visible based on explicit user action. * Set internal storage visible based on explicit user action. */ */ Loading src/com/android/documentsui/DocumentsApplication.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -28,9 +28,9 @@ import android.net.Uri; import android.os.RemoteException; import android.os.RemoteException; import android.text.format.DateUtils; import android.text.format.DateUtils; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.clipping.ClipStore; import com.android.documentsui.clipping.ClipStore; import com.android.documentsui.clipping.DocumentClipper; import com.android.documentsui.clipping.DocumentClipper; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.roots.RootsCache; public class DocumentsApplication extends Application { public class DocumentsApplication extends Application { Loading src/com/android/documentsui/NavigationViewManager.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -132,6 +132,7 @@ public class NavigationViewManager { interface Environment { interface Environment { RootInfo getCurrentRoot(); RootInfo getCurrentRoot(); String getDrawerTitle(); String getDrawerTitle(); @Deprecated // Use CommonAddones#refreshCurrentRootAndDirectory void refreshCurrentRootAndDirectory(int animation); void refreshCurrentRootAndDirectory(int animation); boolean isSearchExpanded(); boolean isSearchExpanded(); } } Loading Loading
src/com/android/documentsui/AbstractActionHandler.java +34 −2 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.app.Activity; import android.content.ClipData; import android.content.ClipData; import android.content.Intent; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Parcelable; import android.os.Parcelable; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.AbstractActionHandler.CommonAddons; Loading @@ -27,15 +28,21 @@ import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.Lookup; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; import com.android.documentsui.dirlist.AnimationView.AnimationType; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.manager.LauncherActivity; import com.android.documentsui.manager.LauncherActivity; import com.android.documentsui.roots.LoadRootTask; import com.android.documentsui.roots.RootsAccess; import com.android.documentsui.sidebar.EjectRootTask; import com.android.documentsui.sidebar.EjectRootTask; import java.util.List; import java.util.List; import java.util.concurrent.Executor; /** /** * Provides support for specializing the actions (viewDocument etc.) to the host activity. * Provides support for specializing the actions (viewDocument etc.) to the host activity. Loading @@ -44,10 +51,24 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> implements ActionHandler { implements ActionHandler { protected final T mActivity; protected final T mActivity; protected final State mState; protected final RootsAccess mRoots; protected final Lookup<String, Executor> mExecutors; public AbstractActionHandler( T activity, State state, RootsAccess roots, Lookup<String, Executor> executors) { public AbstractActionHandler(T activity) { assert(activity != null); assert(activity != null); assert(state != null); assert(roots != null); mActivity = activity; mActivity = activity; mState = state; mRoots = roots; mExecutors = executors; } } @Override @Override Loading Loading @@ -116,14 +137,25 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> throw new UnsupportedOperationException("Delete not supported!"); throw new UnsupportedOperationException("Delete not supported!"); } } @Override public final void loadRoot(Uri uri) { new LoadRootTask<>(mActivity, mRoots, mState, uri).executeOnExecutor( mExecutors.lookup(uri.getAuthority())); } protected final void loadHomeDir() { loadRoot(Shared.getDefaultRootUri(mActivity)); } /** /** * A class primarily for the support of isolating our tests * A class primarily for the support of isolating our tests * from our concrete activity implementations. * from our concrete activity implementations. */ */ public interface CommonAddons { public interface CommonAddons { void onRootPicked(RootInfo root); void onRootPicked(RootInfo root); void onDocumentPicked(DocumentInfo doc, Model model); // TODO: Move this to PickAddons. // TODO: Move this to PickAddons. void onDocumentsPicked(List<DocumentInfo> docs); void onDocumentsPicked(List<DocumentInfo> docs); void onDocumentPicked(DocumentInfo doc, Model model); void refreshCurrentRootAndDirectory(@AnimationType int anim); } } } }
src/com/android/documentsui/ActionHandler.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,9 @@ package com.android.documentsui; package com.android.documentsui; import android.content.ClipData; import android.content.ClipData; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.net.Uri; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.ConfirmationCallback; Loading Loading @@ -48,6 +50,8 @@ public interface ActionHandler { void openRoot(ResolveInfo app); void openRoot(ResolveInfo app); void loadRoot(Uri uri); void openInNewWindow(DocumentStack path); void openInNewWindow(DocumentStack path); void pasteIntoFolder(RootInfo root); void pasteIntoFolder(RootInfo root); Loading @@ -59,4 +63,11 @@ public interface ActionHandler { boolean openDocument(DocumentDetails doc); boolean openDocument(DocumentDetails doc); void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback); void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback); /** * Called when initial activity setup is complete. Implementations * should override this method to set the initial location of the * app. */ void initLocation(Intent intent); } }
src/com/android/documentsui/BaseActivity.java +1 −36 Original line number Original line Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.app.Activity; import android.app.Fragment; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentManager; import android.content.Intent; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo; Loading Loading @@ -69,7 +68,6 @@ import com.android.documentsui.dirlist.FragmentTuner; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager; import com.android.documentsui.dirlist.MultiSelectManager; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.roots.LoadRootTask; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.sidebar.RootsFragment; import com.android.documentsui.sidebar.RootsFragment; import com.android.documentsui.sorting.SortController; import com.android.documentsui.sorting.SortController; Loading Loading @@ -182,7 +180,6 @@ public abstract class BaseActivity getContentResolver().registerContentObserver( getContentResolver().registerContentObserver( RootsCache.sNotificationUri, false, mRootsCacheObserver); RootsCache.sNotificationUri, false, mRootsCacheObserver); DocumentsToolbar toolbar = (DocumentsToolbar) findViewById(R.id.toolbar); DocumentsToolbar toolbar = (DocumentsToolbar) findViewById(R.id.toolbar); setActionBar(toolbar); setActionBar(toolbar); Loading Loading @@ -418,11 +415,6 @@ public abstract class BaseActivity invalidateOptionsMenu(); invalidateOptionsMenu(); } } protected final void loadRoot(final Uri uri) { new LoadRootTask(this, mRoots, mState, uri).executeOnExecutor( ProviderExecutor.forAuthority(uri.getAuthority())); } /** /** * This is called when user hovers over a doc for enough time during a drag n' drop, to open a * This is called when user hovers over a doc for enough time during a drag n' drop, to open a * folder that accepts drop. We should only open a container that's not an archive. * folder that accepts drop. We should only open a container that's not an archive. Loading @@ -442,7 +434,7 @@ public abstract class BaseActivity List<String> authorities = new ArrayList<>(); List<String> authorities = new ArrayList<>(); if (getIntent().getBooleanExtra(DocumentsContract.EXTRA_EXCLUDE_SELF, false)) { if (getIntent().getBooleanExtra(DocumentsContract.EXTRA_EXCLUDE_SELF, false)) { // Exclude roots provided by the calling package. // Exclude roots provided by the calling package. String packageName = getCallingPackageMaybeExtra(); String packageName = Shared.getCallingPackageName(this); try { try { PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName, PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName, PackageManager.GET_PROVIDERS); PackageManager.GET_PROVIDERS); Loading @@ -461,22 +453,6 @@ public abstract class BaseActivity return (root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0; return (root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0; } } public final String getCallingPackageMaybeExtra() { String callingPackage = getCallingPackage(); // System apps can set the calling package name using an extra. try { ApplicationInfo info = getPackageManager().getApplicationInfo(callingPackage, 0); if (info.isSystemApp() || info.isUpdatedSystemApp()) { final String extra = getIntent().getStringExtra(DocumentsContract.EXTRA_PACKAGE_NAME); if (extra != null) { callingPackage = extra; } } } finally { return callingPackage; } } public static BaseActivity get(Fragment fragment) { public static BaseActivity get(Fragment fragment) { return (BaseActivity) fragment.getActivity(); return (BaseActivity) fragment.getActivity(); } } Loading @@ -485,17 +461,6 @@ public abstract class BaseActivity return mState; return mState; } } /* * Get the default directory to be presented after starting the activity. * Method can be overridden if the change of the behavior of the the child activity is needed. */ public Uri getDefaultRoot() { return Shared.shouldShowDocumentsRoot(this, getIntent()) ? DocumentsContract.buildHomeUri() : DocumentsContract.buildRootUri( "com.android.providers.downloads.documents", "downloads"); } /** /** * Set internal storage visible based on explicit user action. * Set internal storage visible based on explicit user action. */ */ Loading
src/com/android/documentsui/DocumentsApplication.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -28,9 +28,9 @@ import android.net.Uri; import android.os.RemoteException; import android.os.RemoteException; import android.text.format.DateUtils; import android.text.format.DateUtils; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.clipping.ClipStore; import com.android.documentsui.clipping.ClipStore; import com.android.documentsui.clipping.DocumentClipper; import com.android.documentsui.clipping.DocumentClipper; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.roots.RootsCache; public class DocumentsApplication extends Application { public class DocumentsApplication extends Application { Loading
src/com/android/documentsui/NavigationViewManager.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -132,6 +132,7 @@ public class NavigationViewManager { interface Environment { interface Environment { RootInfo getCurrentRoot(); RootInfo getCurrentRoot(); String getDrawerTitle(); String getDrawerTitle(); @Deprecated // Use CommonAddones#refreshCurrentRootAndDirectory void refreshCurrentRootAndDirectory(int animation); void refreshCurrentRootAndDirectory(int animation); boolean isSearchExpanded(); boolean isSearchExpanded(); } } Loading