| /* |
| * Copyright (C) 2017 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.base; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.os.UserManager; |
| import android.util.SparseBooleanArray; |
| |
| import androidx.annotation.BoolRes; |
| |
| import com.android.documentsui.R; |
| |
| /** |
| * Provides access to feature flags configured in config.xml. |
| */ |
| public interface Features { |
| |
| /** |
| * Temporary compile-time feature flag to enable in-app cross-profile browsing for some intent. |
| */ |
| boolean CROSS_PROFILE_TABS = true; |
| |
| boolean isArchiveCreationEnabled(); |
| boolean isCommandInterceptorEnabled(); |
| boolean isContentPagingEnabled(); |
| boolean isContentRefreshEnabled(); |
| boolean isDebugSupportEnabled(); |
| boolean isFoldersInSearchResultsEnabled(); |
| boolean isGestureScaleEnabled(); |
| boolean isInspectorEnabled(); |
| boolean isJobProgressDialogEnabled(); |
| boolean isLaunchToDocumentEnabled(); |
| boolean isNotificationChannelEnabled(); |
| boolean isOverwriteConfirmationEnabled(); |
| boolean isRemoteActionsEnabled(); |
| boolean isSystemKeyboardNavigationEnabled(); |
| boolean isVirtualFilesSharingEnabled(); |
| |
| |
| /** |
| * Call this to force-enable any particular feature known by this instance. |
| * Note that all feature may not support being enabled at runtime as |
| * they may depend on runtime initialization guarded by feature check. |
| * |
| * <p>Feature changes will be persisted across activities, but not app restarts. |
| * |
| * @param feature int reference to a boolean feature resource. |
| */ |
| void forceFeature(@BoolRes int feature, boolean enabled); |
| |
| public static Features create(Context context) { |
| return new RuntimeFeatures(context.getResources(), |
| context.getSystemService(UserManager.class)); |
| } |
| |
| final class RuntimeFeatures implements Features { |
| |
| private final SparseBooleanArray mDebugEnabled = new SparseBooleanArray(); |
| |
| private final Resources mRes; |
| private final UserManager mUserMgr; |
| |
| public RuntimeFeatures(Resources resources, UserManager userMgr) { |
| mRes = resources; |
| mUserMgr = userMgr; |
| } |
| |
| @Override |
| public void forceFeature(@BoolRes int feature, boolean enabled) { |
| mDebugEnabled.put(feature, enabled); |
| } |
| |
| private boolean isEnabled(@BoolRes int feature) { |
| return mDebugEnabled.get(feature, mRes.getBoolean(feature)); |
| } |
| |
| @Override |
| public boolean isArchiveCreationEnabled() { |
| return isEnabled(R.bool.feature_archive_creation); |
| } |
| |
| @Override |
| public boolean isCommandInterceptorEnabled() { |
| assert(isDebugPolicyEnabled()); |
| return isEnabled(R.bool.feature_command_interceptor); |
| } |
| |
| @Override |
| public boolean isContentPagingEnabled() { |
| return isEnabled(R.bool.feature_content_paging); |
| } |
| |
| @Override |
| public boolean isContentRefreshEnabled() { |
| return isEnabled(R.bool.feature_content_refresh); |
| } |
| |
| private boolean isFunPolicyEnabled() { |
| return !mUserMgr.hasUserRestriction(UserManager.DISALLOW_FUN); |
| } |
| |
| private boolean isDebugPolicyEnabled() { |
| return !mUserMgr.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES); |
| } |
| |
| @Override |
| public boolean isDebugSupportEnabled() { |
| return isDebugPolicyEnabled() && isFunPolicyEnabled(); |
| } |
| |
| @Override |
| public boolean isFoldersInSearchResultsEnabled() { |
| return isEnabled(R.bool.feature_folders_in_search_results); |
| } |
| |
| @Override |
| public boolean isGestureScaleEnabled() { |
| return isEnabled(R.bool.feature_gesture_scale); |
| } |
| |
| @Override |
| public boolean isInspectorEnabled() { |
| return isEnabled(R.bool.feature_inspector); |
| } |
| |
| @Override |
| public boolean isJobProgressDialogEnabled() { |
| return isEnabled(R.bool.feature_job_progress_dialog); |
| } |
| |
| @Override |
| public boolean isLaunchToDocumentEnabled() { |
| return isEnabled(R.bool.feature_launch_to_document); |
| } |
| |
| @Override |
| public boolean isNotificationChannelEnabled() { |
| return isEnabled(R.bool.feature_notification_channel); |
| } |
| |
| @Override |
| public boolean isOverwriteConfirmationEnabled() { |
| return isEnabled(R.bool.feature_overwrite_confirmation); |
| } |
| |
| @Override |
| public boolean isRemoteActionsEnabled() { |
| return isEnabled(R.bool.feature_remote_actions); |
| } |
| |
| @Override |
| public boolean isSystemKeyboardNavigationEnabled() { |
| return isEnabled(R.bool.feature_system_keyboard_navigation); |
| } |
| |
| @Override |
| public boolean isVirtualFilesSharingEnabled() { |
| return isEnabled(R.bool.feature_virtual_files_sharing); |
| } |
| } |
| } |