Loading src/com/android/documentsui/AbstractActionHandler.java +46 −21 Original line number Diff line number Diff line Loading @@ -22,30 +22,34 @@ import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Parcelable; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.manager.LauncherActivity; import com.android.documentsui.sidebar.EjectRootTask; import java.util.List; /** * Provides support for specializing the actions (viewDocument etc.) to the host activity. */ public abstract class AbstractActionHandler<T extends Activity> implements ActionHandler { public abstract class AbstractActionHandler<T extends Activity & CommonAddons> implements ActionHandler { protected final T mActivity; public AbstractActionHandler(T activity) { assert(activity != null); mActivity = activity; } @Override public void openSettings(RootInfo root) { throw new UnsupportedOperationException("Can't open settings."); } @Override public void ejectRoot(RootInfo root, BooleanConsumer listener) { new EjectRootTask( Loading @@ -55,21 +59,6 @@ public abstract class AbstractActionHandler<T extends Activity> implements Actio listener).executeOnExecutor(ProviderExecutor.forAuthority(root.authority)); } @Override public void openRoot(ResolveInfo app) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void showAppDetails(ResolveInfo info) { throw new UnsupportedOperationException("Can't show app details."); } @Override public boolean dropOn(ClipData data, RootInfo root) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void openInNewWindow(DocumentStack path) { Metrics.logUserAction(mActivity, Metrics.USER_ACTION_NEW_WINDOW); Loading @@ -87,6 +76,26 @@ public abstract class AbstractActionHandler<T extends Activity> implements Actio mActivity.startActivity(intent); } @Override public void openSettings(RootInfo root) { throw new UnsupportedOperationException("Can't open settings."); } @Override public void openRoot(ResolveInfo app) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void showAppDetails(ResolveInfo info) { throw new UnsupportedOperationException("Can't show app details."); } @Override public boolean dropOn(ClipData data, RootInfo root) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void pasteIntoFolder(RootInfo root) { throw new UnsupportedOperationException("Can't paste into folder."); Loading @@ -101,4 +110,20 @@ public abstract class AbstractActionHandler<T extends Activity> implements Actio public boolean previewDocument(DocumentDetails doc) { throw new UnsupportedOperationException("Preview not supported!"); } @Override public void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback) { throw new UnsupportedOperationException("Delete not supported!"); } /** * A class primarily for the support of isolating our tests * from our concrete activity implementations. */ public interface CommonAddons { void onRootPicked(RootInfo root); void onDocumentPicked(DocumentInfo doc, Model model); // TODO: Move this to PickAddons. void onDocumentsPicked(List<DocumentInfo> docs); } } src/com/android/documentsui/ActionHandler.java +5 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,12 @@ import android.content.ClipData; import android.content.pm.ResolveInfo; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager.Selection; public interface ActionHandler { Loading Loading @@ -54,4 +57,6 @@ public interface ActionHandler { boolean previewDocument(DocumentDetails doc); boolean openDocument(DocumentDetails doc); void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback); } src/com/android/documentsui/BaseActivity.java +17 −38 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.NavigationViewManager.Breadcrumb; import com.android.documentsui.SearchViewManager.SearchManagerListener; import com.android.documentsui.base.DocumentInfo; Loading @@ -70,11 +71,10 @@ import com.android.documentsui.dirlist.MultiSelectManager; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.roots.LoadRootTask; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperations; import com.android.documentsui.sidebar.RootsFragment; import com.android.documentsui.sorting.SortController; import com.android.documentsui.sorting.SortModel; import com.android.documentsui.ui.DialogController; import java.util.ArrayList; import java.util.Collection; Loading @@ -82,33 +82,8 @@ import java.util.Date; import java.util.List; import java.util.concurrent.Executor; public abstract class BaseActivity extends Activity implements NavigationViewManager.Environment { public final FileOperations.Callback fileOpCallback = (status, opType, docCount) -> { if (status == FileOperations.Callback.STATUS_REJECTED) { Snackbars.showPasteFailed(this); return; } if (docCount == 0) { // Nothing has been pasted, so there is no need to show a snackbar. return; } switch (opType) { case FileOperationService.OPERATION_MOVE: Snackbars.showMove(this, docCount); break; case FileOperationService.OPERATION_COPY: Snackbars.showCopy(this, docCount); break; case FileOperationService.OPERATION_DELETE: // We don't show anything for deletion. break; default: throw new UnsupportedOperationException("Unsupported Operation: " + opType); } }; public abstract class BaseActivity extends Activity implements CommonAddons, NavigationViewManager.Environment { private static final String BENCHMARK_TESTING_PACKAGE = "com.android.documentsui.appperftests"; Loading Loading @@ -136,6 +111,12 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan private boolean mNavDrawerHasFocus; private long mStartTime; protected abstract void onTaskFinished(Uri... uris); protected abstract void refreshDirectory(int anim); /** Allows sub-classes to include information in a newly created State instance. */ protected abstract void includeState(State initialState); protected abstract void onDirectoryCreated(DocumentInfo doc); /** * Provides Activity a means of injection into and specialization of * DirectoryFragment. Loading @@ -154,6 +135,12 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan */ public abstract MenuManager getMenuManager(); /** * Provides Activity a means of injection into and specialization of * DirectoryFragment. */ public abstract DialogController getDialogController(); /** * Provides Activity a means of injection into and specialization of * fragment actions. Loading @@ -163,15 +150,6 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan public abstract ActionHandler getActionHandler( @Nullable Model model, @Nullable MultiSelectManager selectionMgr); public abstract void onDocumentPicked(DocumentInfo doc, Model model); public abstract void onDocumentsPicked(List<DocumentInfo> docs); protected abstract void onTaskFinished(Uri... uris); protected abstract void refreshDirectory(int anim); /** Allows sub-classes to include information in a newly created State instance. */ protected abstract void includeState(State initialState); protected abstract void onDirectoryCreated(DocumentInfo doc); public BaseActivity(@LayoutRes int layoutId, String tag) { mLayoutId = layoutId; mTag = tag; Loading Loading @@ -313,6 +291,7 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan mNavigator.revealRootsDrawer(open); } @Override public void onRootPicked(RootInfo root) { // Clicking on the current root removes search mSearchManager.cancelSearch(); Loading src/com/android/documentsui/CreateDirectoryFragment.java +1 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import android.widget.TextView.OnEditorActionListener; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.ui.Snackbars; /** * Dialog to create a new directory. Loading src/com/android/documentsui/DocumentsApplication.java +7 −6 Original line number Diff line number Diff line Loading @@ -28,8 +28,9 @@ import android.net.Uri; import android.os.RemoteException; import android.text.format.DateUtils; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.clipping.ClipStore; import com.android.documentsui.clipping.DocumentClipper; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.roots.RootsCache; public class DocumentsApplication extends Application { Loading @@ -38,7 +39,7 @@ public class DocumentsApplication extends Application { private RootsCache mRoots; private ThumbnailCache mThumbnailCache; private ClipStorage mClipStorage; private ClipStorage mClipStore; private DocumentClipper mClipper; public static RootsCache getRootsCache(Context context) { Loading @@ -65,8 +66,8 @@ public class DocumentsApplication extends Application { return ((DocumentsApplication) context.getApplicationContext()).mClipper; } public static ClipStorage getClipStorage(Context context) { return ((DocumentsApplication) context.getApplicationContext()).mClipStorage; public static ClipStore getClipStore(Context context) { return ((DocumentsApplication) context.getApplicationContext()).mClipStore; } @Override Loading @@ -81,10 +82,10 @@ public class DocumentsApplication extends Application { mThumbnailCache = new ThumbnailCache(memoryClassBytes / 4); mClipStorage = new ClipStorage( mClipStore = new ClipStorage( ClipStorage.prepareStorage(getCacheDir()), getSharedPreferences(ClipStorage.PREF_NAME, 0)); mClipper = new DocumentClipper(this, mClipStorage); mClipper = new DocumentClipper(this, mClipStore); final IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); Loading Loading
src/com/android/documentsui/AbstractActionHandler.java +46 −21 Original line number Diff line number Diff line Loading @@ -22,30 +22,34 @@ import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Parcelable; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.manager.LauncherActivity; import com.android.documentsui.sidebar.EjectRootTask; import java.util.List; /** * Provides support for specializing the actions (viewDocument etc.) to the host activity. */ public abstract class AbstractActionHandler<T extends Activity> implements ActionHandler { public abstract class AbstractActionHandler<T extends Activity & CommonAddons> implements ActionHandler { protected final T mActivity; public AbstractActionHandler(T activity) { assert(activity != null); mActivity = activity; } @Override public void openSettings(RootInfo root) { throw new UnsupportedOperationException("Can't open settings."); } @Override public void ejectRoot(RootInfo root, BooleanConsumer listener) { new EjectRootTask( Loading @@ -55,21 +59,6 @@ public abstract class AbstractActionHandler<T extends Activity> implements Actio listener).executeOnExecutor(ProviderExecutor.forAuthority(root.authority)); } @Override public void openRoot(ResolveInfo app) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void showAppDetails(ResolveInfo info) { throw new UnsupportedOperationException("Can't show app details."); } @Override public boolean dropOn(ClipData data, RootInfo root) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void openInNewWindow(DocumentStack path) { Metrics.logUserAction(mActivity, Metrics.USER_ACTION_NEW_WINDOW); Loading @@ -87,6 +76,26 @@ public abstract class AbstractActionHandler<T extends Activity> implements Actio mActivity.startActivity(intent); } @Override public void openSettings(RootInfo root) { throw new UnsupportedOperationException("Can't open settings."); } @Override public void openRoot(ResolveInfo app) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void showAppDetails(ResolveInfo info) { throw new UnsupportedOperationException("Can't show app details."); } @Override public boolean dropOn(ClipData data, RootInfo root) { throw new UnsupportedOperationException("Can't open an app."); } @Override public void pasteIntoFolder(RootInfo root) { throw new UnsupportedOperationException("Can't paste into folder."); Loading @@ -101,4 +110,20 @@ public abstract class AbstractActionHandler<T extends Activity> implements Actio public boolean previewDocument(DocumentDetails doc) { throw new UnsupportedOperationException("Preview not supported!"); } @Override public void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback) { throw new UnsupportedOperationException("Delete not supported!"); } /** * A class primarily for the support of isolating our tests * from our concrete activity implementations. */ public interface CommonAddons { void onRootPicked(RootInfo root); void onDocumentPicked(DocumentInfo doc, Model model); // TODO: Move this to PickAddons. void onDocumentsPicked(List<DocumentInfo> docs); } }
src/com/android/documentsui/ActionHandler.java +5 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,12 @@ import android.content.ClipData; import android.content.pm.ResolveInfo; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; import com.android.documentsui.dirlist.DocumentDetails; import com.android.documentsui.dirlist.Model; import com.android.documentsui.dirlist.MultiSelectManager.Selection; public interface ActionHandler { Loading Loading @@ -54,4 +57,6 @@ public interface ActionHandler { boolean previewDocument(DocumentDetails doc); boolean openDocument(DocumentDetails doc); void deleteDocuments(Model model, Selection selection, ConfirmationCallback callback); }
src/com/android/documentsui/BaseActivity.java +17 −38 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.NavigationViewManager.Breadcrumb; import com.android.documentsui.SearchViewManager.SearchManagerListener; import com.android.documentsui.base.DocumentInfo; Loading @@ -70,11 +71,10 @@ import com.android.documentsui.dirlist.MultiSelectManager; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.roots.LoadRootTask; import com.android.documentsui.roots.RootsCache; import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperations; import com.android.documentsui.sidebar.RootsFragment; import com.android.documentsui.sorting.SortController; import com.android.documentsui.sorting.SortModel; import com.android.documentsui.ui.DialogController; import java.util.ArrayList; import java.util.Collection; Loading @@ -82,33 +82,8 @@ import java.util.Date; import java.util.List; import java.util.concurrent.Executor; public abstract class BaseActivity extends Activity implements NavigationViewManager.Environment { public final FileOperations.Callback fileOpCallback = (status, opType, docCount) -> { if (status == FileOperations.Callback.STATUS_REJECTED) { Snackbars.showPasteFailed(this); return; } if (docCount == 0) { // Nothing has been pasted, so there is no need to show a snackbar. return; } switch (opType) { case FileOperationService.OPERATION_MOVE: Snackbars.showMove(this, docCount); break; case FileOperationService.OPERATION_COPY: Snackbars.showCopy(this, docCount); break; case FileOperationService.OPERATION_DELETE: // We don't show anything for deletion. break; default: throw new UnsupportedOperationException("Unsupported Operation: " + opType); } }; public abstract class BaseActivity extends Activity implements CommonAddons, NavigationViewManager.Environment { private static final String BENCHMARK_TESTING_PACKAGE = "com.android.documentsui.appperftests"; Loading Loading @@ -136,6 +111,12 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan private boolean mNavDrawerHasFocus; private long mStartTime; protected abstract void onTaskFinished(Uri... uris); protected abstract void refreshDirectory(int anim); /** Allows sub-classes to include information in a newly created State instance. */ protected abstract void includeState(State initialState); protected abstract void onDirectoryCreated(DocumentInfo doc); /** * Provides Activity a means of injection into and specialization of * DirectoryFragment. Loading @@ -154,6 +135,12 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan */ public abstract MenuManager getMenuManager(); /** * Provides Activity a means of injection into and specialization of * DirectoryFragment. */ public abstract DialogController getDialogController(); /** * Provides Activity a means of injection into and specialization of * fragment actions. Loading @@ -163,15 +150,6 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan public abstract ActionHandler getActionHandler( @Nullable Model model, @Nullable MultiSelectManager selectionMgr); public abstract void onDocumentPicked(DocumentInfo doc, Model model); public abstract void onDocumentsPicked(List<DocumentInfo> docs); protected abstract void onTaskFinished(Uri... uris); protected abstract void refreshDirectory(int anim); /** Allows sub-classes to include information in a newly created State instance. */ protected abstract void includeState(State initialState); protected abstract void onDirectoryCreated(DocumentInfo doc); public BaseActivity(@LayoutRes int layoutId, String tag) { mLayoutId = layoutId; mTag = tag; Loading Loading @@ -313,6 +291,7 @@ public abstract class BaseActivity extends Activity implements NavigationViewMan mNavigator.revealRootsDrawer(open); } @Override public void onRootPicked(RootInfo root) { // Clicking on the current root removes search mSearchManager.cancelSearch(); Loading
src/com/android/documentsui/CreateDirectoryFragment.java +1 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import android.widget.TextView.OnEditorActionListener; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.ui.Snackbars; /** * Dialog to create a new directory. Loading
src/com/android/documentsui/DocumentsApplication.java +7 −6 Original line number Diff line number Diff line Loading @@ -28,8 +28,9 @@ import android.net.Uri; import android.os.RemoteException; import android.text.format.DateUtils; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.clipping.ClipStore; import com.android.documentsui.clipping.DocumentClipper; import com.android.documentsui.clipping.ClipStorage; import com.android.documentsui.roots.RootsCache; public class DocumentsApplication extends Application { Loading @@ -38,7 +39,7 @@ public class DocumentsApplication extends Application { private RootsCache mRoots; private ThumbnailCache mThumbnailCache; private ClipStorage mClipStorage; private ClipStorage mClipStore; private DocumentClipper mClipper; public static RootsCache getRootsCache(Context context) { Loading @@ -65,8 +66,8 @@ public class DocumentsApplication extends Application { return ((DocumentsApplication) context.getApplicationContext()).mClipper; } public static ClipStorage getClipStorage(Context context) { return ((DocumentsApplication) context.getApplicationContext()).mClipStorage; public static ClipStore getClipStore(Context context) { return ((DocumentsApplication) context.getApplicationContext()).mClipStore; } @Override Loading @@ -81,10 +82,10 @@ public class DocumentsApplication extends Application { mThumbnailCache = new ThumbnailCache(memoryClassBytes / 4); mClipStorage = new ClipStorage( mClipStore = new ClipStorage( ClipStorage.prepareStorage(getCacheDir()), getSharedPreferences(ClipStorage.PREF_NAME, 0)); mClipper = new DocumentClipper(this, mClipStorage); mClipper = new DocumentClipper(this, mClipStore); final IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); Loading