summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PREUPLOAD.cfg3
-rw-r--r--preupload-checks.xml27
-rw-r--r--res/values/strings.xml17
-rw-r--r--src/com/android/documentsui/AbstractActionHandler.java8
-rw-r--r--src/com/android/documentsui/ActionModeController.java6
-rw-r--r--src/com/android/documentsui/BaseActivity.java24
-rw-r--r--src/com/android/documentsui/DrawerController.java4
-rw-r--r--src/com/android/documentsui/Injector.java4
-rw-r--r--src/com/android/documentsui/MenuManager.java10
-rw-r--r--src/com/android/documentsui/NavigationViewManager.java13
-rw-r--r--src/com/android/documentsui/ProfileTabs.java4
-rw-r--r--src/com/android/documentsui/dirlist/AppsRowManager.java4
-rw-r--r--src/com/android/documentsui/dirlist/DirectoryFragment.java12
-rw-r--r--src/com/android/documentsui/dirlist/DocumentHolder.java6
-rw-r--r--src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java4
-rw-r--r--src/com/android/documentsui/dirlist/GridDocumentHolder.java14
-rw-r--r--src/com/android/documentsui/dirlist/ListDocumentHolder.java11
-rw-r--r--src/com/android/documentsui/files/ActionHandler.java12
-rw-r--r--src/com/android/documentsui/files/FilesActivity.java12
-rw-r--r--src/com/android/documentsui/files/MenuManager.java5
-rw-r--r--src/com/android/documentsui/loaders/SearchLoader.kt2
-rw-r--r--src/com/android/documentsui/picker/PickActivity.java6
-rw-r--r--src/com/android/documentsui/queries/SearchChipViewManager.java10
-rw-r--r--src/com/android/documentsui/queries/SearchViewManager.java4
-rw-r--r--src/com/android/documentsui/services/CompressJob.java25
-rw-r--r--src/com/android/documentsui/services/CopyJob.java61
-rw-r--r--src/com/android/documentsui/services/DeleteJob.java33
-rw-r--r--src/com/android/documentsui/services/Job.java2
-rw-r--r--src/com/android/documentsui/services/JobProgress.kt69
-rw-r--r--src/com/android/documentsui/services/MoveJob.java27
-rw-r--r--src/com/android/documentsui/sidebar/AppItem.java4
-rw-r--r--src/com/android/documentsui/sidebar/RootItem.java4
-rw-r--r--src/com/android/documentsui/sidebar/RootsAdapter.java4
-rw-r--r--src/com/android/documentsui/sidebar/RootsFragment.java15
-rw-r--r--src/com/android/documentsui/sorting/HeaderCell.java4
-rw-r--r--src/com/android/documentsui/sorting/TableHeaderController.java8
-rw-r--r--src/com/android/documentsui/ui/Snackbars.java4
-rw-r--r--src/com/android/documentsui/util/FlagUtils.kt57
-rw-r--r--tests/common/com/android/documentsui/bots/UiBot.java6
-rw-r--r--tests/common/com/android/documentsui/services/TestJob.java8
-rw-r--r--tests/unit/com/android/documentsui/files/ActionHandlerTest.java4
-rw-r--r--tests/unit/com/android/documentsui/files/MenuManagerTest.java4
42 files changed, 447 insertions, 114 deletions
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index ebc1264c7..8f318d23d 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,4 +1,5 @@
[Hook Scripts]
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
-
ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
+docsui_checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT} --config_xml ${REPO_ROOT}/packages/apps/DocumentsUI/preupload-checks.xml
+
diff --git a/preupload-checks.xml b/preupload-checks.xml
new file mode 100644
index 000000000..b30b4240b
--- /dev/null
+++ b/preupload-checks.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+<module name="Checker">
+ <module name="TreeWalker">
+ <module name="RegexpSinglelineJava">
+ <property name="ignoreComments" value="true" />
+ <property name="severity" value="error" />
+ <property name="format" value="com.android.documentsui.flags.Flags" />
+ <property name="message" value="Please don't use Flags.* directly, instead add the flag to FlagUtils and use that instead." />
+ </module>
+ </module>
+</module>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9e76b23a9..8a147f2d4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -409,6 +409,23 @@
during a copy. [CHAR LIMIT=48] -->
<string name="notification_copy_files_converted_title">Some files were converted</string>
+ <string name="copy_in_progress" translatable="false">{count, plural,
+ =1 {Copying <xliff:g id="filename" example="foobar.txt">{filename}</xliff:g> to <xliff:g id="directory" example="example folder">{directory}</xliff:g>}
+ other {Copying # files to <xliff:g id="directory" example="example folder">{directory}</xliff:g>}
+ }</string>
+ <string name="move_in_progress" translatable="false">{count, plural,
+ =1 {Moving <xliff:g id="filename" example="foobar.txt">{filename}</xliff:g> to <xliff:g id="directory" example="example folder">{directory}</xliff:g>}
+ other {Moving # files to <xliff:g id="directory" example="example folder">{directory}</xliff:g>}
+ }</string>
+ <string name="delete_in_progress" translatable="false">{count, plural,
+ =1 {Deleting <xliff:g id="filename" example="foobar.txt">{filename}</xliff:g>}
+ other {Deleting # files}
+ }</string>
+ <string name="compress_in_progress" translatable="false">{count, plural,
+ =1 {Zipping <xliff:g id="filename" example="foobar.txt">{filename}</xliff:g>}
+ other {Zipping # files}
+ }</string>
+
<!-- Text in an alert dialog asking user to grant app access to a given directory in an external storage volume -->
<string name="open_external_dialog_request">Grant <xliff:g id="appName" example="System Settings"><b>^1</b></xliff:g>
access to <xliff:g id="directory" example="Pictures"><i>^2</i></xliff:g> directory on
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index 619162f90..de193e235 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -19,8 +19,8 @@ package com.android.documentsui;
import static com.android.documentsui.base.DocumentInfo.getCursorInt;
import static com.android.documentsui.base.DocumentInfo.getCursorString;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
-import static com.android.documentsui.flags.Flags.desktopFileHandling;
-import static com.android.documentsui.flags.Flags.useSearchV2Rw;
+import static com.android.documentsui.util.FlagUtils.isDesktopFileHandlingFlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isUseSearchV2RwFlagEnabled;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
@@ -576,7 +576,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
flags |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
}
// On desktop users expect files to open in a new window.
- if (desktopFileHandling()) {
+ if (isDesktopFileHandlingFlagEnabled()) {
// The combination of NEW_DOCUMENT and MULTIPLE_TASK allows multiple instances of the
// same activity to open in separate windows.
flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
@@ -916,7 +916,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
mState.stack.changeRoot(mActivity.getCurrentRoot());
}
- if (useSearchV2Rw()) {
+ if (isUseSearchV2RwFlagEnabled()) {
return onCreateLoaderV2(id, args);
}
return onCreateLoaderV1(id, args);
diff --git a/src/com/android/documentsui/ActionModeController.java b/src/com/android/documentsui/ActionModeController.java
index 6259a8bba..931942fca 100644
--- a/src/com/android/documentsui/ActionModeController.java
+++ b/src/com/android/documentsui/ActionModeController.java
@@ -17,7 +17,7 @@
package com.android.documentsui;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.Activity;
import android.util.Log;
@@ -138,7 +138,7 @@ public class ActionModeController extends SelectionObserver<String>
// Re-enable TalkBack for the toolbars, as they are no longer covered by action mode.
int[] toolbarIds =
- useMaterial3()
+ isUseMaterial3FlagEnabled()
? new int[] {R.id.toolbar}
: new int[] {R.id.toolbar, R.id.roots_toolbar};
mScope.accessibilityImportanceSetter.setAccessibilityImportance(
@@ -159,7 +159,7 @@ public class ActionModeController extends SelectionObserver<String>
// Hide the toolbars if action mode is enabled, so TalkBack doesn't navigate to
// these controls when using linear navigation.
int[] toolbarIds =
- useMaterial3()
+ isUseMaterial3FlagEnabled()
? new int[] {R.id.toolbar}
: new int[] {R.id.toolbar, R.id.roots_toolbar};
mScope.accessibilityImportanceSetter.setAccessibilityImportance(
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index aa46acbe9..11717de4e 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -19,7 +19,7 @@ package com.android.documentsui;
import static com.android.documentsui.base.Shared.EXTRA_BENCHMARK;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.State.MODE_GRID;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.Context;
import android.content.Intent;
@@ -184,7 +184,7 @@ public abstract class BaseActivity
// in case Activity continuously encounter resource not found exception.
getTheme().applyStyle(R.style.DocumentsDefaultTheme, false);
- if (useMaterial3() && SdkLevel.isAtLeastS()) {
+ if (isUseMaterial3FlagEnabled() && SdkLevel.isAtLeastS()) {
DynamicColors.applyToActivityIfAvailable(this);
}
@@ -205,7 +205,7 @@ public abstract class BaseActivity
mDrawer = DrawerController.create(this, mInjector.config);
Metrics.logActivityLaunch(mState, intent);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
View navRailRoots = findViewById(R.id.nav_rail_container_roots);
if (navRailRoots != null) {
// Bind event listener for the burger menu on nav rail.
@@ -369,7 +369,7 @@ public abstract class BaseActivity
if (roots != null) {
roots.onSelectedUserChanged();
}
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
final RootsFragment navRailRoots =
RootsFragment.getNavRail(getSupportFragmentManager());
if (navRailRoots != null) {
@@ -397,7 +397,7 @@ public abstract class BaseActivity
});
mSortController = SortController.create(this, mState.derivedMode, mState.sortModel);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
View previewIconPlaceholder = findViewById(R.id.preview_icon_placeholder);
if (previewIconPlaceholder != null) {
previewIconPlaceholder.setVisibility(
@@ -454,7 +454,7 @@ public abstract class BaseActivity
super.onPostCreate(savedInstanceState);
Runnable finishActionMode =
- (useMaterial3())
+ (isUseMaterial3FlagEnabled())
? mNavigator::closeSelectionBar
: mInjector.actionModeController::finishActionMode;
@@ -479,7 +479,7 @@ public abstract class BaseActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
// In Material3 the menu is now inflated in the `NavigationViewMenu`. This is currently
// to allow for us to inflate between the action_menu and the activity menu. Once the
// Material 3 flag is removed, the menus will be merged and we can rely on this single
@@ -510,7 +510,7 @@ public abstract class BaseActivity
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
// Remove the subMenu when material3 is launched b/379776735.
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
if (mNavigator != null) {
mNavigator.updateActionMenu();
}
@@ -574,7 +574,7 @@ public abstract class BaseActivity
insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), 0);
// in M3, no additional bottom gap in full screen mode.
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
View saveContainer = findViewById(R.id.container_save);
saveContainer.setPadding(
0, 0, 0, insets.getSystemWindowInsetBottom());
@@ -617,7 +617,7 @@ public abstract class BaseActivity
return;
}
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mNavigator.closeSelectionBar();
} else {
mInjector.actionModeController.finishActionMode();
@@ -759,7 +759,7 @@ public abstract class BaseActivity
if (roots != null) {
roots.onCurrentRootChanged();
}
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
final RootsFragment navRailRoots =
RootsFragment.getNavRail(getSupportFragmentManager());
if (navRailRoots != null) {
@@ -843,7 +843,7 @@ public abstract class BaseActivity
mState.derivedMode = mode;
// Remove the subMenu when material3 is launched b/379776735.
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mInjector.menuManager.updateSubMenu(null);
} else {
final ActionMenuView subMenuView = findViewById(R.id.sub_menu);
diff --git a/src/com/android/documentsui/DrawerController.java b/src/com/android/documentsui/DrawerController.java
index 88c41b3f2..a519b6001 100644
--- a/src/com/android/documentsui/DrawerController.java
+++ b/src/com/android/documentsui/DrawerController.java
@@ -17,7 +17,7 @@
package com.android.documentsui;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.Activity;
import android.util.Log;
@@ -208,7 +208,7 @@ public abstract class DrawerController implements DrawerListener {
@Override
void setTitle(String title) {
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
mToolbar.setTitle(title);
}
}
diff --git a/src/com/android/documentsui/Injector.java b/src/com/android/documentsui/Injector.java
index 5fd716a97..6b68ba1f1 100644
--- a/src/com/android/documentsui/Injector.java
+++ b/src/com/android/documentsui/Injector.java
@@ -15,7 +15,7 @@
*/
package com.android.documentsui;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -129,7 +129,7 @@ public class Injector<T extends ActionHandler> {
public final ActionModeController getActionModeController(
SelectionDetails selectionDetails, EventHandler<MenuItem> menuItemClicker) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
return null;
}
return actionModeController.reset(selectionDetails, menuItemClicker);
diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java
index 126a777da..5f17d7e02 100644
--- a/src/com/android/documentsui/MenuManager.java
+++ b/src/com/android/documentsui/MenuManager.java
@@ -16,7 +16,8 @@
package com.android.documentsui;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isZipNgFlagEnabled;
import android.view.KeyboardShortcutGroup;
import android.view.Menu;
@@ -33,7 +34,6 @@ import com.android.documentsui.base.Menus;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;
import com.android.documentsui.dirlist.DirectoryFragment;
-import com.android.documentsui.flags.Flags;
import com.android.documentsui.queries.SearchViewManager;
import com.android.documentsui.sidebar.RootsFragment;
@@ -93,7 +93,7 @@ public abstract class MenuManager {
return;
}
updateCreateDir(mOptionMenu.findItem(R.id.option_menu_create_dir));
- if (Flags.zipNg()) {
+ if (isZipNgFlagEnabled()) {
updateExtractAll(mOptionMenu.findItem(R.id.option_menu_extract_all));
}
updateSettings(mOptionMenu.findItem(R.id.option_menu_settings));
@@ -105,7 +105,7 @@ public abstract class MenuManager {
updateLauncher(mOptionMenu.findItem(R.id.option_menu_launcher));
updateShowHiddenFiles(mOptionMenu.findItem(R.id.option_menu_show_hidden_files));
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
updateModePicker(mOptionMenu.findItem(R.id.sub_menu_grid),
mOptionMenu.findItem(R.id.sub_menu_list));
}
@@ -116,7 +116,7 @@ public abstract class MenuManager {
public void updateSubMenu(Menu menu) {
// Remove the subMenu when material3 is launched b/379776735.
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
menu = mOptionMenu;
if (menu == null) {
return;
diff --git a/src/com/android/documentsui/NavigationViewManager.java b/src/com/android/documentsui/NavigationViewManager.java
index bd139ec7a..86b5e517f 100644
--- a/src/com/android/documentsui/NavigationViewManager.java
+++ b/src/com/android/documentsui/NavigationViewManager.java
@@ -17,7 +17,7 @@
package com.android.documentsui;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -157,7 +157,7 @@ public class NavigationViewManager extends SelectionTracker.SelectionObserver<St
onNavigationIconClicked();
}
});
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mToolbar.setOnMenuItemClickListener(
new Toolbar.OnMenuItemClickListener() {
@Override
@@ -261,7 +261,7 @@ public class NavigationViewManager extends SelectionTracker.SelectionObserver<St
}
private void onNavigationIconClicked() {
- if (useMaterial3() && inSelectionMode()) {
+ if (isUseMaterial3FlagEnabled() && inSelectionMode()) {
closeSelectionBar();
} else if (mDrawer.isPresent()) {
mDrawer.setOpen(true);
@@ -311,7 +311,7 @@ public class NavigationViewManager extends SelectionTracker.SelectionObserver<St
mDrawer.setTitle(mEnv.getDrawerTitle());
boolean showBurgerMenuOnToolbar = true;
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
View navRailRoots = mActivity.findViewById(R.id.nav_rail_container_roots);
if (navRailRoots != null) {
// If nav rail exists, burger menu will show on the nav rail instead.
@@ -322,6 +322,9 @@ public class NavigationViewManager extends SelectionTracker.SelectionObserver<St
if (showBurgerMenuOnToolbar) {
mToolbar.setNavigationIcon(getActionBarIcon());
mToolbar.setNavigationContentDescription(R.string.drawer_open);
+ } else {
+ mToolbar.setNavigationIcon(null);
+ mToolbar.setNavigationContentDescription(null);
}
if (shouldShowSearchBar()) {
@@ -333,7 +336,7 @@ public class NavigationViewManager extends SelectionTracker.SelectionObserver<St
mSearchBarView.setVisibility(View.GONE);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
updateActionMenu();
if (inSelectionMode()) {
final int quantity = mInjector.selectionMgr.getSelection().size();
diff --git a/src/com/android/documentsui/ProfileTabs.java b/src/com/android/documentsui/ProfileTabs.java
index 9fbae8bae..5aacc22b0 100644
--- a/src/com/android/documentsui/ProfileTabs.java
+++ b/src/com/android/documentsui/ProfileTabs.java
@@ -20,7 +20,7 @@ import static androidx.core.util.Preconditions.checkNotNull;
import static com.android.documentsui.DevicePolicyResources.Strings.PERSONAL_TAB;
import static com.android.documentsui.DevicePolicyResources.Strings.WORK_TAB;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.admin.DevicePolicyManager;
import android.os.Build;
@@ -156,7 +156,7 @@ public class ProfileTabs implements ProfileTabsAddons {
(ViewGroup.MarginLayoutParams) tab.getLayoutParams();
int tabMarginSide = (int) mTabsContainer.getContext().getResources()
.getDimension(R.dimen.profile_tab_margin_side);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
// M3 uses the margin value as the right margin, except for the last child.
if (i != mTabs.getTabCount() - 1) {
marginLayoutParams.setMargins(0, 0, tabMarginSide, 0);
diff --git a/src/com/android/documentsui/dirlist/AppsRowManager.java b/src/com/android/documentsui/dirlist/AppsRowManager.java
index 53e9bd44d..33cb67a02 100644
--- a/src/com/android/documentsui/dirlist/AppsRowManager.java
+++ b/src/com/android/documentsui/dirlist/AppsRowManager.java
@@ -16,7 +16,7 @@
package com.android.documentsui.dirlist;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.text.TextUtils;
import android.view.LayoutInflater;
@@ -105,7 +105,7 @@ public class AppsRowManager {
}
private boolean shouldShow(State state, boolean isSearchExpanded) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
return false;
}
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index 9cd7c2f7c..855a8273d 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -21,8 +21,8 @@ import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
import static com.android.documentsui.base.State.MODE_GRID;
import static com.android.documentsui.base.State.MODE_LIST;
-import static com.android.documentsui.flags.Flags.desktopFileHandling;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isDesktopFileHandlingFlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
@@ -611,7 +611,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
new RefreshHelper(mRefreshLayout::setEnabled)
.attach(mRecView);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mSelectionMgr.addObserver(mActivity.getNavigator());
mActivity.getNavigator().updateSelection(mSelectionMetadata, this::handleMenuItemClick);
} else {
@@ -924,7 +924,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
}
private void closeSelectionBar() {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mActivity.getNavigator().closeSelectionBar();
} else {
mActionModeController.finishActionMode();
@@ -939,7 +939,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
mSelectionMgr.copySelection(selection);
final int id = item.getItemId();
- if (desktopFileHandling() && id == R.id.dir_menu_open) {
+ if (isDesktopFileHandlingFlagEnabled() && id == R.id.dir_menu_open) {
// On desktop, "open" is displayed in file management mode (i.e. `files.MenuManager`).
// This menu item behaves the same as double click on the menu item which is handled by
// onItemActivated but since onItemActivated requires a RecylcerView ItemDetails, we're
@@ -1535,7 +1535,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
// For orientation changed case, sometimes the docs loading comes after the menu
// update. We need to update the menu here to ensure the status is correct.
mInjector.menuManager.updateModel(mModel);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mActivity.getNavigator().updateActionMenu();
} else {
mInjector.menuManager.updateOptionMenu();
diff --git a/src/com/android/documentsui/dirlist/DocumentHolder.java b/src/com/android/documentsui/dirlist/DocumentHolder.java
index b1b2765f8..8e5f50636 100644
--- a/src/com/android/documentsui/dirlist/DocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/DocumentHolder.java
@@ -18,7 +18,7 @@ package com.android.documentsui.dirlist;
import static com.android.documentsui.DevicePolicyResources.Strings.PREVIEW_WORK_FILE_ACCESSIBILITY;
import static com.android.documentsui.DevicePolicyResources.Strings.UNDEFINED;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
@@ -56,9 +56,9 @@ import javax.annotation.Nullable;
public abstract class DocumentHolder
extends RecyclerView.ViewHolder implements View.OnKeyListener {
- static final float DISABLED_ALPHA = useMaterial3() ? 0.6f : 0.3f;
+ static final float DISABLED_ALPHA = isUseMaterial3FlagEnabled() ? 0.6f : 0.3f;
- static final int THUMBNAIL_STROKE_WIDTH = useMaterial3() ? 2 : 0;
+ static final int THUMBNAIL_STROKE_WIDTH = isUseMaterial3FlagEnabled() ? 2 : 0;
protected final Context mContext;
diff --git a/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java b/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java
index 92faee198..838b1fa72 100644
--- a/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java
+++ b/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java
@@ -16,7 +16,7 @@
package com.android.documentsui.dirlist;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.Context;
import android.content.res.TypedArray;
@@ -45,7 +45,7 @@ public class DocumentsSwipeRefreshLayout extends SwipeRefreshLayout {
public DocumentsSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
TypedValue spinnerColor = new TypedValue();
context.getTheme()
.resolveAttribute(
diff --git a/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
index 112e98702..e321f8ba7 100644
--- a/src/com/android/documentsui/dirlist/GridDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
@@ -21,7 +21,7 @@ import static com.android.documentsui.DevicePolicyResources.Drawables.WORK_PROFI
import static com.android.documentsui.base.DocumentInfo.getCursorInt;
import static com.android.documentsui.base.DocumentInfo.getCursorLong;
import static com.android.documentsui.base.DocumentInfo.getCursorString;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
@@ -81,7 +81,7 @@ final class GridDocumentHolder extends DocumentHolder {
ConfigStore configStore) {
super(context, parent, R.layout.item_doc_grid, configStore);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mIconWrapper = itemView.findViewById(R.id.icon_wrapper);
mIconLayout = null;
mIconMimeSm = null;
@@ -119,7 +119,7 @@ final class GridDocumentHolder extends DocumentHolder {
@Override
public void setSelected(boolean selected, boolean animate) {
float checkAlpha = selected ? 1f : 0f;
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
// We always want to make sure our check box disappears if we're not selected,
// even if the item is disabled. This is because this object can be reused
// and this method will be called to setup initial state.
@@ -139,7 +139,7 @@ final class GridDocumentHolder extends DocumentHolder {
super.setSelected(selected, animate);
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
if (animate) {
fade(mIconMimeSm, 1f - checkAlpha).start();
} else {
@@ -164,7 +164,7 @@ final class GridDocumentHolder extends DocumentHolder {
float imgAlpha = enabled ? 1f : DISABLED_ALPHA;
mIconMimeLg.setAlpha(imgAlpha);
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
mIconMimeSm.setAlpha(imgAlpha);
}
mIconThumb.setAlpha(imgAlpha);
@@ -206,7 +206,7 @@ final class GridDocumentHolder extends DocumentHolder {
@Override
public boolean inSelectRegion(MotionEvent event) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
return Views.isEventOver(event, itemView.getParent(), mIconWrapper);
}
return Views.isEventOver(event, itemView.getParent(), mIconLayout);
@@ -240,7 +240,7 @@ final class GridDocumentHolder extends DocumentHolder {
mIconThumb.animate().cancel();
mIconThumb.setAlpha(0f);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mIconHelper.load(
mDoc, mIconThumb, mIconMimeLg, /* subIconMime= */ null,
thumbnailLoaded -> {
diff --git a/src/com/android/documentsui/dirlist/ListDocumentHolder.java b/src/com/android/documentsui/dirlist/ListDocumentHolder.java
index a4839d4f4..58473d5aa 100644
--- a/src/com/android/documentsui/dirlist/ListDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/ListDocumentHolder.java
@@ -20,7 +20,7 @@ import static com.android.documentsui.DevicePolicyResources.Drawables.Style.SOLI
import static com.android.documentsui.DevicePolicyResources.Drawables.WORK_PROFILE_ICON;
import static com.android.documentsui.base.DocumentInfo.getCursorInt;
import static com.android.documentsui.base.DocumentInfo.getCursorString;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
@@ -89,7 +89,8 @@ final class ListDocumentHolder extends DocumentHolder {
super(context, parent, R.layout.item_doc_list, configStore);
mIconLayout = itemView.findViewById(R.id.icon);
- mIconWrapper = useMaterial3() ? itemView.findViewById(R.id.icon_wrapper) : null;
+ mIconWrapper =
+ isUseMaterial3FlagEnabled() ? itemView.findViewById(R.id.icon_wrapper) : null;
mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime);
mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check);
@@ -147,7 +148,7 @@ final class ListDocumentHolder extends DocumentHolder {
}
// Do not show stroke when selected, only show stroke when not selected if it has thumbnail.
- if (useMaterial3() && mIconWrapper != null) {
+ if (isUseMaterial3FlagEnabled() && mIconWrapper != null) {
if (selected) {
mIconWrapper.setStrokeWidth(0);
} else if (mIconThumb.getDrawable() != null) {
@@ -160,7 +161,7 @@ final class ListDocumentHolder extends DocumentHolder {
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
itemView.setAlpha(enabled ? 1f : DISABLED_ALPHA);
} else {
// Text colors enabled/disabled is handle via a color set.
@@ -269,7 +270,7 @@ final class ListDocumentHolder extends DocumentHolder {
/* subIconMime= */ null,
thumbnailLoaded -> {
// Show stroke when thumbnail is loaded.
- if (useMaterial3() && mIconWrapper != null) {
+ if (isUseMaterial3FlagEnabled() && mIconWrapper != null) {
mIconWrapper.setStrokeWidth(thumbnailLoaded ? THUMBNAIL_STROKE_WIDTH : 0);
}
});
diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java
index 33057d140..86f7a1a14 100644
--- a/src/com/android/documentsui/files/ActionHandler.java
+++ b/src/com/android/documentsui/files/ActionHandler.java
@@ -19,6 +19,9 @@ package com.android.documentsui.files;
import static android.content.ContentResolver.wrap;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
+import static com.android.documentsui.util.FlagUtils.isDesktopFileHandlingFlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isUsePeekPreviewFlagEnabled;
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
@@ -67,7 +70,6 @@ import com.android.documentsui.clipping.ClipStore;
import com.android.documentsui.clipping.DocumentClipper;
import com.android.documentsui.clipping.UrisSupplier;
import com.android.documentsui.dirlist.AnimationView;
-import com.android.documentsui.flags.Flags;
import com.android.documentsui.inspector.InspectorActivity;
import com.android.documentsui.queries.SearchViewManager;
import com.android.documentsui.roots.ProvidersAccess;
@@ -234,7 +236,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
@Override
public void springOpenDirectory(DocumentInfo doc) {
assert (doc.isDirectory());
- if (Flags.useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mCloseSelectionBar.run();
} else {
mActionModeAddons.finishActionMode();
@@ -330,7 +332,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
return;
}
- if (Flags.useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mCloseSelectionBar.run();
} else {
mActionModeAddons.finishActionMode();
@@ -562,7 +564,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
return;
}
- if (Flags.desktopFileHandling()) {
+ if (isDesktopFileHandlingFlagEnabled()) {
Intent intent = buildViewIntent(doc);
intent.setComponent(
new ComponentName("android", "com.android.internal.app.ResolverActivity"));
@@ -613,7 +615,7 @@ public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.Co
@Override
public void showPreview(DocumentInfo doc) {
- if (Flags.useMaterial3() && Flags.usePeekPreview()) {
+ if (isUseMaterial3FlagEnabled() && isUsePeekPreviewFlagEnabled()) {
showPeek();
} else {
showInspector(doc);
diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java
index ff9d30106..50e266d38 100644
--- a/src/com/android/documentsui/files/FilesActivity.java
+++ b/src/com/android/documentsui/files/FilesActivity.java
@@ -18,7 +18,8 @@ package com.android.documentsui.files;
import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_UNKNOWN;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isZipNgFlagEnabled;
import android.app.ActivityManager.TaskDescription;
import android.content.Intent;
@@ -60,7 +61,6 @@ import com.android.documentsui.clipping.DocumentClipper;
import com.android.documentsui.dirlist.AnimationView.AnimationType;
import com.android.documentsui.dirlist.AppsRowManager;
import com.android.documentsui.dirlist.DirectoryFragment;
-import com.android.documentsui.flags.Flags;
import com.android.documentsui.services.FileOperationService;
import com.android.documentsui.sidebar.RootsFragment;
import com.android.documentsui.ui.DialogController;
@@ -140,7 +140,7 @@ public class FilesActivity extends BaseActivity implements AbstractActionHandler
mInjector.getModel()::getItemUri,
mInjector.getModel()::getItemCount);
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
mInjector.actionModeController =
new ActionModeController(
this,
@@ -190,7 +190,7 @@ public class FilesActivity extends BaseActivity implements AbstractActionHandler
RootsFragment.show(getSupportFragmentManager(), /* includeApps= */ false,
/* intent= */ null);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
View navRailRoots = findViewById(R.id.nav_rail_container_roots);
if (navRailRoots != null) {
// Medium layout, populate navigation rail layout.
@@ -332,7 +332,7 @@ public class FilesActivity extends BaseActivity implements AbstractActionHandler
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
mInjector.menuManager.updateOptionMenu(menu);
}
return true;
@@ -349,7 +349,7 @@ public class FilesActivity extends BaseActivity implements AbstractActionHandler
} else if (id == R.id.option_menu_settings) {
mInjector.actions.openSettings(getCurrentRoot());
} else if (id == R.id.option_menu_extract_all) {
- if (!Flags.zipNg()) return false;
+ if (!isZipNgFlagEnabled()) return false;
final DirectoryFragment dir = getDirectoryFragment();
if (dir == null) return false;
mInjector.actions.selectAllFiles();
diff --git a/src/com/android/documentsui/files/MenuManager.java b/src/com/android/documentsui/files/MenuManager.java
index 0fb7c4fa1..9b3564eeb 100644
--- a/src/com/android/documentsui/files/MenuManager.java
+++ b/src/com/android/documentsui/files/MenuManager.java
@@ -16,7 +16,7 @@
package com.android.documentsui.files;
-import static com.android.documentsui.flags.Flags.desktopFileHandling;
+import static com.android.documentsui.util.FlagUtils.isDesktopFileHandlingFlagEnabled;
import android.content.Context;
import android.content.res.Resources;
@@ -168,7 +168,8 @@ public final class MenuManager extends com.android.documentsui.MenuManager {
@Override
protected void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
- Menus.setEnabledAndVisible(open, desktopFileHandling() && selectionDetails.canOpen());
+ Menus.setEnabledAndVisible(
+ open, isDesktopFileHandlingFlagEnabled() && selectionDetails.canOpen());
}
@Override
diff --git a/src/com/android/documentsui/loaders/SearchLoader.kt b/src/com/android/documentsui/loaders/SearchLoader.kt
index b17271bdc..f0da924e2 100644
--- a/src/com/android/documentsui/loaders/SearchLoader.kt
+++ b/src/com/android/documentsui/loaders/SearchLoader.kt
@@ -101,7 +101,7 @@ class SearchLoader(
}
@Volatile
- private lateinit var mSearchTaskList: List<SearchTask>
+ private var mSearchTaskList: List<SearchTask> = listOf()
// Creates a directory result object corresponding to the current parameters of the loader.
override fun loadInBackground(): DirectoryResult? {
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index 51b35e155..68a797397 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -21,7 +21,7 @@ import static com.android.documentsui.base.State.ACTION_GET_CONTENT;
import static com.android.documentsui.base.State.ACTION_OPEN;
import static com.android.documentsui.base.State.ACTION_OPEN_TREE;
import static com.android.documentsui.base.State.ACTION_PICK_COPY_DESTINATION;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.Intent;
import android.content.res.Resources;
@@ -128,7 +128,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
new DirectoryDetails(this),
mInjector.getModel()::getItemCount);
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
mInjector.actionModeController =
new ActionModeController(
this,
@@ -253,7 +253,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
RootsFragment.show(getSupportFragmentManager(),
/* includeApps= */ mState.action == ACTION_GET_CONTENT,
/* intent= */ moreApps);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
View navRailRoots = findViewById(R.id.nav_rail_container_roots);
if (navRailRoots != null) {
// Medium layout, populate navigation rail layout.
diff --git a/src/com/android/documentsui/queries/SearchChipViewManager.java b/src/com/android/documentsui/queries/SearchChipViewManager.java
index 8bc548493..18cde82a5 100644
--- a/src/com/android/documentsui/queries/SearchChipViewManager.java
+++ b/src/com/android/documentsui/queries/SearchChipViewManager.java
@@ -16,7 +16,7 @@
package com.android.documentsui.queries;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.animation.ObjectAnimator;
import android.content.Context;
@@ -399,7 +399,7 @@ public class SearchChipViewManager {
chip.setChipIcon(chipIcon);
chip.setOnClickListener(this::onChipClick);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
chip.setOnFocusChangeListener(this::onChipFocusChange);
}
@@ -420,7 +420,7 @@ public class SearchChipViewManager {
// For M3, we don't want to use MIME type icons for image/audio/video/document from the
// system.
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
return switch (chipType) {
case TYPE_IMAGES -> context.getDrawable(R.drawable.ic_chip_image);
case TYPE_AUDIO -> context.getDrawable(R.drawable.ic_chip_audio);
@@ -468,14 +468,14 @@ public class SearchChipViewManager {
}
final int chipSpacing =
- useMaterial3()
+ isUseMaterial3FlagEnabled()
? ((ChipGroup) mChipGroup).getChipSpacingHorizontal()
: mChipGroup
.getResources()
.getDimensionPixelSize(R.dimen.search_chip_spacing);
final boolean isRtl = mChipGroup.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
final float chipGroupPaddingStart =
- useMaterial3()
+ isUseMaterial3FlagEnabled()
? mChipGroup.getPaddingStart()
: mChipGroup
.getResources()
diff --git a/src/com/android/documentsui/queries/SearchViewManager.java b/src/com/android/documentsui/queries/SearchViewManager.java
index 1e26e4e08..ca132a187 100644
--- a/src/com/android/documentsui/queries/SearchViewManager.java
+++ b/src/com/android/documentsui/queries/SearchViewManager.java
@@ -20,7 +20,7 @@ import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.State.ACTION_GET_CONTENT;
import static com.android.documentsui.base.State.ACTION_OPEN;
import static com.android.documentsui.base.State.ActionType;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.Intent;
import android.os.Bundle;
@@ -335,7 +335,7 @@ public class SearchViewManager implements
// Recent root show open search bar, do not show duplicate search icon.
boolean enabled = supportsSearch && (!stack.isRecents() || !mShowSearchBar);
mMenuItem.setVisible(enabled);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
// When the use_material3 flag is enabled, we inflate and deflate the menu.
// This causes the search button to be disabled on inflation, toggle it in
// this scenario.
diff --git a/src/com/android/documentsui/services/CompressJob.java b/src/com/android/documentsui/services/CompressJob.java
index a7d2de9aa..ccb3ee835 100644
--- a/src/com/android/documentsui/services/CompressJob.java
+++ b/src/com/android/documentsui/services/CompressJob.java
@@ -24,11 +24,13 @@ import android.app.Notification;
import android.app.Notification.Builder;
import android.content.ContentResolver;
import android.content.Context;
+import android.icu.text.MessageFormat;
import android.net.Uri;
import android.os.Messenger;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.provider.DocumentsContract;
+import android.text.BidiFormatter;
import android.util.Log;
import com.android.documentsui.R;
@@ -40,6 +42,9 @@ import com.android.documentsui.base.UserId;
import com.android.documentsui.clipping.UrisSupplier;
import java.io.FileNotFoundException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
// TODO: Stop extending CopyJob.
final class CompressJob extends CopyJob {
@@ -87,6 +92,26 @@ final class CompressJob extends CopyJob {
}
@Override
+ protected String getProgressMessage() {
+ switch (getState()) {
+ case Job.STATE_SET_UP:
+ case Job.STATE_COMPLETED:
+ case Job.STATE_CANCELED:
+ Map<String, Object> formatArgs = new HashMap<>();
+ formatArgs.put("count", mResolvedDocs.size());
+ if (mResolvedDocs.size() == 1) {
+ formatArgs.put("filename", BidiFormatter.getInstance().unicodeWrap(
+ mResolvedDocs.get(0).displayName));
+ }
+ return (new MessageFormat(
+ service.getString(R.string.compress_in_progress), Locale.getDefault()))
+ .format(formatArgs);
+ default:
+ return "";
+ }
+ }
+
+ @Override
public boolean setUp() {
if (!super.setUp()) {
return false;
diff --git a/src/com/android/documentsui/services/CopyJob.java b/src/com/android/documentsui/services/CopyJob.java
index c972c33ef..9fb3f5d09 100644
--- a/src/com/android/documentsui/services/CopyJob.java
+++ b/src/com/android/documentsui/services/CopyJob.java
@@ -46,6 +46,7 @@ import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.database.ContentObserver;
import android.database.Cursor;
+import android.icu.text.MessageFormat;
import android.net.Uri;
import android.os.DeadObjectException;
import android.os.FileUtils;
@@ -66,6 +67,7 @@ import android.system.Int64Ref;
import android.system.Os;
import android.system.OsConstants;
import android.system.StructStat;
+import android.text.BidiFormatter;
import android.util.ArrayMap;
import android.util.Log;
import android.webkit.MimeTypeMap;
@@ -93,6 +95,8 @@ import java.io.InputStream;
import java.io.SyncFailedException;
import java.text.NumberFormat;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@@ -195,6 +199,49 @@ class CopyJob extends ResolvedResourcesJob {
return warningBuilder.build();
}
+ protected String getProgressMessage() {
+ switch (getState()) {
+ case Job.STATE_SET_UP:
+ case Job.STATE_COMPLETED:
+ case Job.STATE_CANCELED:
+ Map<String, Object> formatArgs = new HashMap<>();
+ formatArgs.put("count", mResolvedDocs.size());
+ formatArgs.put("directory",
+ BidiFormatter.getInstance().unicodeWrap(mDstInfo.displayName));
+ if (mResolvedDocs.size() == 1) {
+ formatArgs.put("filename",
+ BidiFormatter.getInstance().unicodeWrap(
+ mResolvedDocs.get(0).displayName));
+ }
+ return (new MessageFormat(
+ service.getString(R.string.copy_in_progress), Locale.getDefault()))
+ .format(formatArgs);
+
+ default:
+ return "";
+ }
+ }
+
+ @Override
+ JobProgress getJobProgress() {
+ if (mProgressTracker == null) {
+ return new JobProgress(
+ id,
+ getState(),
+ getProgressMessage(),
+ hasFailures());
+ }
+ mProgressTracker.updateEstimateRemainingTime();
+ return new JobProgress(
+ id,
+ getState(),
+ getProgressMessage(),
+ hasFailures(),
+ mProgressTracker.getCurrentBytes(),
+ mProgressTracker.getRequiredBytes(),
+ mProgressTracker.getRemainingTimeEstimate());
+ }
+
@Override
boolean setUp() {
if (!super.setUp()) {
@@ -986,6 +1033,10 @@ class CopyJob extends ResolvedResourcesJob {
return -1;
}
+ protected long getCurrentBytes() {
+ return -1;
+ }
+
protected void start() {
mStartTime = mElapsedRealTimeSupplier.getAsLong();
}
@@ -1058,6 +1109,16 @@ class CopyJob extends ResolvedResourcesJob {
}
@Override
+ protected long getRequiredBytes() {
+ return mBytesRequired;
+ }
+
+ @Override
+ protected long getCurrentBytes() {
+ return mBytesCopied.get();
+ }
+
+ @Override
public void onBytesCopied(long numBytes) {
mBytesCopied.getAndAdd(numBytes);
}
diff --git a/src/com/android/documentsui/services/DeleteJob.java b/src/com/android/documentsui/services/DeleteJob.java
index ede46a937..801cc6dd3 100644
--- a/src/com/android/documentsui/services/DeleteJob.java
+++ b/src/com/android/documentsui/services/DeleteJob.java
@@ -23,7 +23,9 @@ import android.app.Notification;
import android.app.Notification.Builder;
import android.content.ContentResolver;
import android.content.Context;
+import android.icu.text.MessageFormat;
import android.net.Uri;
+import android.text.BidiFormatter;
import android.util.Log;
import com.android.documentsui.MetricConsts;
@@ -36,6 +38,9 @@ import com.android.documentsui.base.UserId;
import com.android.documentsui.clipping.UrisSupplier;
import java.io.FileNotFoundException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
import javax.annotation.Nullable;
@@ -97,6 +102,34 @@ final class DeleteJob extends ResolvedResourcesJob {
throw new UnsupportedOperationException();
}
+ private String getProgressMessage() {
+ switch (getState()) {
+ case Job.STATE_SET_UP:
+ case Job.STATE_COMPLETED:
+ case Job.STATE_CANCELED:
+ Map<String, Object> formatArgs = new HashMap<>();
+ formatArgs.put("count", mResolvedDocs.size());
+ if (mResolvedDocs.size() == 1) {
+ formatArgs.put("filename", BidiFormatter.getInstance().unicodeWrap(
+ mResolvedDocs.get(0).displayName));
+ }
+ return (new MessageFormat(
+ service.getString(R.string.delete_in_progress), Locale.getDefault()))
+ .format(formatArgs);
+ default:
+ return "";
+ }
+ }
+
+ @Override
+ JobProgress getJobProgress() {
+ return new JobProgress(
+ id,
+ getState(),
+ getProgressMessage(),
+ hasFailures());
+ }
+
@Override
void start() {
ContentResolver resolver = appContext.getContentResolver();
diff --git a/src/com/android/documentsui/services/Job.java b/src/com/android/documentsui/services/Job.java
index 71f0ae861..0f432cc19 100644
--- a/src/com/android/documentsui/services/Job.java
+++ b/src/com/android/documentsui/services/Job.java
@@ -190,6 +190,8 @@ abstract public class Job implements Runnable {
abstract Notification getWarningNotification();
+ abstract JobProgress getJobProgress();
+
Uri getDataUriForIntent(String tag) {
return Uri.parse(String.format("data,%s-%s", tag, id));
}
diff --git a/src/com/android/documentsui/services/JobProgress.kt b/src/com/android/documentsui/services/JobProgress.kt
new file mode 100644
index 000000000..98be92f6a
--- /dev/null
+++ b/src/com/android/documentsui/services/JobProgress.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui.services
+
+import android.os.Parcel
+import android.os.Parcelable
+
+/**
+ * Represents the current progress on an individual job owned by the FileOperationService.
+ * JobProgress objects are broadcast from the service to activities in order to update the UI.
+ */
+data class JobProgress @JvmOverloads constructor(
+ @JvmField val id: String,
+ @JvmField @Job.State val state: Int,
+ @JvmField val msg: String?,
+ @JvmField val hasFailures: Boolean,
+ @JvmField val currentBytes: Long = -1,
+ @JvmField val requiredBytes: Long = -1,
+ @JvmField val msRemaining: Long = -1,
+) : Parcelable {
+
+ override fun describeContents(): Int {
+ return 0
+ }
+
+ override fun writeToParcel(dest: Parcel, flags: Int) {
+ dest.apply {
+ writeString(id)
+ writeInt(state)
+ writeString(msg)
+ writeBoolean(hasFailures)
+ writeLong(currentBytes)
+ writeLong(requiredBytes)
+ writeLong(msRemaining)
+ }
+ }
+
+ companion object CREATOR : Parcelable.Creator<JobProgress?> {
+ override fun createFromParcel(parcel: Parcel): JobProgress? {
+ return JobProgress(
+ parcel.readString()!!,
+ parcel.readInt(),
+ parcel.readString(),
+ parcel.readBoolean(),
+ parcel.readLong(),
+ parcel.readLong(),
+ parcel.readLong(),
+ )
+ }
+
+ override fun newArray(size: Int): Array<JobProgress?> {
+ return arrayOfNulls(size)
+ }
+ }
+}
diff --git a/src/com/android/documentsui/services/MoveJob.java b/src/com/android/documentsui/services/MoveJob.java
index ddbe727ac..b2974c5e7 100644
--- a/src/com/android/documentsui/services/MoveJob.java
+++ b/src/com/android/documentsui/services/MoveJob.java
@@ -24,12 +24,14 @@ import static com.android.documentsui.services.FileOperationService.OPERATION_MO
import android.app.Notification;
import android.app.Notification.Builder;
import android.content.Context;
+import android.icu.text.MessageFormat;
import android.net.Uri;
import android.os.DeadObjectException;
import android.os.Messenger;
import android.os.RemoteException;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
+import android.text.BidiFormatter;
import android.util.Log;
import com.android.documentsui.MetricConsts;
@@ -42,6 +44,9 @@ import com.android.documentsui.base.UserId;
import com.android.documentsui.clipping.UrisSupplier;
import java.io.FileNotFoundException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
import javax.annotation.Nullable;
@@ -94,6 +99,28 @@ final class MoveJob extends CopyJob {
}
@Override
+ protected String getProgressMessage() {
+ switch (getState()) {
+ case Job.STATE_SET_UP:
+ case Job.STATE_COMPLETED:
+ case Job.STATE_CANCELED:
+ Map<String, Object> formatArgs = new HashMap<>();
+ formatArgs.put("count", mResolvedDocs.size());
+ formatArgs.put("directory",
+ BidiFormatter.getInstance().unicodeWrap(mDstInfo.displayName));
+ if (mResolvedDocs.size() == 1) {
+ formatArgs.put("filename", BidiFormatter.getInstance().unicodeWrap(
+ mResolvedDocs.get(0).displayName));
+ }
+ return (new MessageFormat(
+ service.getString(R.string.move_in_progress), Locale.getDefault()))
+ .format(formatArgs);
+ default:
+ return "";
+ }
+ }
+
+ @Override
public boolean setUp() {
if (mSrcParentUri != null) {
try {
diff --git a/src/com/android/documentsui/sidebar/AppItem.java b/src/com/android/documentsui/sidebar/AppItem.java
index c719241d2..d9aed1522 100644
--- a/src/com/android/documentsui/sidebar/AppItem.java
+++ b/src/com/android/documentsui/sidebar/AppItem.java
@@ -16,7 +16,7 @@
package com.android.documentsui.sidebar;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -102,7 +102,7 @@ public class AppItem extends Item {
// In M3, we don't show action icon for the app items, do nothing here because the icons
// are hidden by default.
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
final View actionIconArea = convertView.findViewById(R.id.action_icon_area);
final ImageView actionIcon = (ImageView) convertView.findViewById(R.id.action_icon);
bindActionIcon(actionIconArea, actionIcon);
diff --git a/src/com/android/documentsui/sidebar/RootItem.java b/src/com/android/documentsui/sidebar/RootItem.java
index 326f086e1..af72a5239 100644
--- a/src/com/android/documentsui/sidebar/RootItem.java
+++ b/src/com/android/documentsui/sidebar/RootItem.java
@@ -16,7 +16,7 @@
package com.android.documentsui.sidebar;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -110,7 +110,7 @@ public class RootItem extends Item {
}
protected final void bindAction(View view, int visibility, int iconId, String description) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
final MaterialButton actionIcon = view.findViewById(R.id.action_icon);
actionIcon.setVisibility(visibility);
diff --git a/src/com/android/documentsui/sidebar/RootsAdapter.java b/src/com/android/documentsui/sidebar/RootsAdapter.java
index b64e39d5f..d689705be 100644
--- a/src/com/android/documentsui/sidebar/RootsAdapter.java
+++ b/src/com/android/documentsui/sidebar/RootsAdapter.java
@@ -16,7 +16,7 @@
package com.android.documentsui.sidebar;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.Activity;
import android.os.Looper;
@@ -86,7 +86,7 @@ class RootsAdapter extends ArrayAdapter<Item> {
final Item item = getItem(position);
final View view = item.getView(convertView, parent);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
// In order to have hover showing on the list item, we need to have
// "android:clickable=true" on the list item level, which will break the click handler
// because it's set at the list level, so here we "bubble up" the item level click
diff --git a/src/com/android/documentsui/sidebar/RootsFragment.java b/src/com/android/documentsui/sidebar/RootsFragment.java
index e30017fe4..1735f9a29 100644
--- a/src/com/android/documentsui/sidebar/RootsFragment.java
+++ b/src/com/android/documentsui/sidebar/RootsFragment.java
@@ -19,8 +19,8 @@ package com.android.documentsui.sidebar;
import static com.android.documentsui.base.Shared.compareToIgnoreCaseNullable;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
-import static com.android.documentsui.flags.Flags.hideRootsOnDesktop;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isHideRootsOnDesktopFlagEnabled;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
@@ -150,7 +150,7 @@ public class RootsFragment extends Fragment {
private List<Item> mApplicationItemList;
// Weather the fragment is using nav_rail_container_roots as its container (in nav_rail_layout).
- // This will always be false if useMaterial3() flag is off.
+ // This will always be false if isUseMaterial3FlagEnabled() flag is off.
private boolean mUseRailAsContainer = false;
/**
@@ -183,7 +183,7 @@ public class RootsFragment extends Fragment {
final Bundle args = new Bundle();
args.putBoolean(EXTRA_INCLUDE_APPS, includeApps);
args.putParcelable(EXTRA_INCLUDE_APPS_INTENT, intent);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
args.putInt(EXTRA_CONTAINER_ID, containerId);
}
@@ -215,7 +215,7 @@ public class RootsFragment extends Fragment {
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
mUseRailAsContainer =
getArguments() != null
&& getArguments().getInt(EXTRA_CONTAINER_ID)
@@ -481,8 +481,9 @@ public class RootsFragment extends Fragment {
if (root.isExternalStorageHome()) {
continue;
- } else if (hideRootsOnDesktop() && context.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_PC) && (root.isImages() || root.isVideos()
+ } else if (isHideRootsOnDesktopFlagEnabled()
+ && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PC)
+ && (root.isImages() || root.isVideos()
|| root.isDocuments()
|| root.isAudio())) {
// Hide Images/Videos/Documents/Audio roots on desktop.
diff --git a/src/com/android/documentsui/sorting/HeaderCell.java b/src/com/android/documentsui/sorting/HeaderCell.java
index e9fce67cc..7f72f13da 100644
--- a/src/com/android/documentsui/sorting/HeaderCell.java
+++ b/src/com/android/documentsui/sorting/HeaderCell.java
@@ -16,7 +16,7 @@
package com.android.documentsui.sorting;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.animation.AnimatorInflater;
import android.animation.LayoutTransition;
@@ -134,7 +134,7 @@ public class HeaderCell extends LinearLayout {
}
private void setDataTypeNumber(View label) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
label.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
} else {
diff --git a/src/com/android/documentsui/sorting/TableHeaderController.java b/src/com/android/documentsui/sorting/TableHeaderController.java
index 52fa465a9..cb72ac916 100644
--- a/src/com/android/documentsui/sorting/TableHeaderController.java
+++ b/src/com/android/documentsui/sorting/TableHeaderController.java
@@ -16,7 +16,7 @@
package com.android.documentsui.sorting;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.view.KeyEvent;
import android.view.View;
@@ -92,12 +92,12 @@ public final class TableHeaderController implements SortController.WidgetControl
if (dimension.getVisibility() == View.VISIBLE
&& dimension.getSortCapability() != SortDimension.SORT_CAPABILITY_NONE) {
cell.setOnClickListener(mOnCellClickListener);
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
cell.setSortArrowListeners(mOnCellClickListener, mOnCellKeyListener, dimension);
}
} else {
cell.setOnClickListener(null);
- if (useMaterial3()) cell.setSortArrowListeners(null, null, null);
+ if (isUseMaterial3FlagEnabled()) cell.setSortArrowListeners(null, null, null);
}
}
@@ -109,7 +109,7 @@ public final class TableHeaderController implements SortController.WidgetControl
/** Sorts the column if the key pressed was Enter or Space. */
private boolean onCellKeyEvent(View v, int keyCode, KeyEvent event) {
- if (!useMaterial3()) {
+ if (!isUseMaterial3FlagEnabled()) {
return false;
}
// Only the enter and space bar should trigger the sort header to engage.
diff --git a/src/com/android/documentsui/ui/Snackbars.java b/src/com/android/documentsui/ui/Snackbars.java
index c6eaf4661..795b6248b 100644
--- a/src/com/android/documentsui/ui/Snackbars.java
+++ b/src/com/android/documentsui/ui/Snackbars.java
@@ -16,7 +16,7 @@
package com.android.documentsui.ui;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import android.app.Activity;
import android.view.Gravity;
@@ -112,7 +112,7 @@ public final class Snackbars {
public static final Snackbar makeSnackbar(
Activity activity, CharSequence message, int duration) {
- final View view = activity.findViewById(useMaterial3()
+ final View view = activity.findViewById(isUseMaterial3FlagEnabled()
? R.id.coordinator_layout
: R.id.container_save
);
diff --git a/src/com/android/documentsui/util/FlagUtils.kt b/src/com/android/documentsui/util/FlagUtils.kt
new file mode 100644
index 000000000..49c55de57
--- /dev/null
+++ b/src/com/android/documentsui/util/FlagUtils.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui.util
+
+import com.android.documentsui.flags.Flags
+
+/**
+ * Wraps the static flags classes to enable a single place to refactor flag usage
+ * (or combine usage when required).
+ */
+class FlagUtils {
+ companion object {
+ @JvmStatic
+ fun isUseMaterial3FlagEnabled(): Boolean {
+ return Flags.useMaterial3()
+ }
+
+ @JvmStatic
+ fun isZipNgFlagEnabled(): Boolean {
+ return Flags.zipNg()
+ }
+
+ @JvmStatic
+ fun isUseSearchV2RwFlagEnabled(): Boolean {
+ return Flags.useSearchV2Rw()
+ }
+
+ @JvmStatic
+ fun isDesktopFileHandlingFlagEnabled(): Boolean {
+ return Flags.desktopFileHandling()
+ }
+
+ @JvmStatic
+ fun isHideRootsOnDesktopFlagEnabled(): Boolean {
+ return Flags.hideRootsOnDesktop()
+ }
+
+ @JvmStatic
+ fun isUsePeekPreviewFlagEnabled(): Boolean {
+ return Flags.usePeekPreview()
+ }
+ }
+}
diff --git a/tests/common/com/android/documentsui/bots/UiBot.java b/tests/common/com/android/documentsui/bots/UiBot.java
index 161510e2a..47e0acd5a 100644
--- a/tests/common/com/android/documentsui/bots/UiBot.java
+++ b/tests/common/com/android/documentsui/bots/UiBot.java
@@ -25,7 +25,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.withClassName;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
@@ -211,7 +211,7 @@ public class UiBot extends Bots.BaseBot {
}
public void clickActionbarOverflowItem(String label) {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
onView(TOOLBAR_OVERFLOW).perform(click());
} else {
onView(ACTIONBAR_OVERFLOW).perform(click());
@@ -231,7 +231,7 @@ public class UiBot extends Bots.BaseBot {
}
public boolean waitForActionModeBarToAppear() {
- String actionModeId = useMaterial3() ? "toolbar" : "action_mode_bar";
+ String actionModeId = isUseMaterial3FlagEnabled() ? "toolbar" : "action_mode_bar";
UiObject2 bar =
mDevice.wait(
Until.findObject(By.res(mTargetPackage + ":id/" + actionModeId)), mTimeout);
diff --git a/tests/common/com/android/documentsui/services/TestJob.java b/tests/common/com/android/documentsui/services/TestJob.java
index 10addebd9..426cb9575 100644
--- a/tests/common/com/android/documentsui/services/TestJob.java
+++ b/tests/common/com/android/documentsui/services/TestJob.java
@@ -23,11 +23,11 @@ import android.app.Notification;
import android.app.Notification.Builder;
import android.content.Context;
-import com.android.documentsui.base.Features;
-import com.android.documentsui.clipping.UrisSupplier;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.DocumentStack;
+import com.android.documentsui.base.Features;
+import com.android.documentsui.clipping.UrisSupplier;
import com.android.documentsui.services.FileOperationService.OpType;
import java.text.NumberFormat;
@@ -97,6 +97,10 @@ public class TestJob extends Job {
throw new UnsupportedOperationException();
}
+ JobProgress getJobProgress() {
+ return new JobProgress(id, getState(), "test job", false);
+ }
+
@Override
Builder createProgressBuilder() {
++mNumOfNotifications;
diff --git a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
index 01dfa1c76..54a685776 100644
--- a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
@@ -16,7 +16,7 @@
package com.android.documentsui.files;
-import static com.android.documentsui.flags.Flags.useMaterial3;
+import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled;
import static com.android.documentsui.testing.IntentAsserts.assertHasAction;
import static com.android.documentsui.testing.IntentAsserts.assertHasData;
import static com.android.documentsui.testing.IntentAsserts.assertHasExtra;
@@ -160,7 +160,7 @@ public class ActionHandlerTest {
}
private void assertSelectionContainerClosed() {
- if (useMaterial3()) {
+ if (isUseMaterial3FlagEnabled()) {
verify(mMockCloseSelectionBar, times(1)).run();
} else {
assertTrue(mActionModeAddons.finishActionModeCalled);
diff --git a/tests/unit/com/android/documentsui/files/MenuManagerTest.java b/tests/unit/com/android/documentsui/files/MenuManagerTest.java
index 394537784..f9737dc39 100644
--- a/tests/unit/com/android/documentsui/files/MenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/files/MenuManagerTest.java
@@ -16,6 +16,8 @@
package com.android.documentsui.files;
+import static com.android.documentsui.util.FlagUtils.isZipNgFlagEnabled;
+
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -492,7 +494,7 @@ public final class MenuManagerTest {
public void testOptionMenu_ExtractAll() {
dirDetails.isInArchive = true;
mgr.updateOptionMenu(testMenu);
- if (Flags.zipNg()) {
+ if (isZipNgFlagEnabled()) {
mOptionExtractAll.assertEnabledAndVisible();
} else {
mOptionExtractAll.assertDisabledAndInvisible();