| /* |
| * Copyright (C) 2015 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; |
| |
| import android.app.Activity; |
| import android.app.AlertDialog; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.res.Configuration; |
| import android.provider.DocumentsContract; |
| import android.text.TextUtils; |
| import android.text.format.DateUtils; |
| import android.text.format.Time; |
| import android.view.WindowManager; |
| |
| import java.text.Collator; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** @hide */ |
| public final class Shared { |
| |
| public static final String TAG = "Documents"; |
| |
| public static final boolean DEBUG = false; |
| |
| /** Intent action name to pick a copy destination. */ |
| public static final String ACTION_PICK_COPY_DESTINATION = |
| "com.android.documentsui.PICK_COPY_DESTINATION"; |
| |
| /** |
| * Extra flag allowing app to be opened in productivity mode (less downloadsy). |
| * Useful developers and the likes. When set to true overrides the default |
| * config value of productivity_device. |
| */ |
| public static final String EXTRA_PRODUCTIVITY_MODE = "com.android.documentsui.PRODUCTIVITY"; |
| |
| /** |
| * Extra boolean flag for {@link ACTION_PICK_COPY_DESTINATION}, which |
| * specifies if the destination directory needs to create new directory or not. |
| */ |
| public static final String EXTRA_DIRECTORY_COPY = "com.android.documentsui.DIRECTORY_COPY"; |
| |
| /** |
| * Extra flag used to store the current stack so user opens in right spot. |
| */ |
| public static final String EXTRA_STACK = "com.android.documentsui.STACK"; |
| |
| /** |
| * Extra flag used to store query of type String in the bundle. |
| */ |
| public static final String EXTRA_QUERY = "query"; |
| |
| /** |
| * Extra flag used to store state of type State in the bundle. |
| */ |
| public static final String EXTRA_STATE = "state"; |
| |
| /** |
| * Extra flag used to store type of DirectoryFragment's type ResultType type in the bundle. |
| */ |
| public static final String EXTRA_TYPE = "type"; |
| |
| /** |
| * Extra flag used to store root of type RootInfo in the bundle. |
| */ |
| public static final String EXTRA_ROOT = "root"; |
| |
| /** |
| * Extra flag used to store document of DocumentInfo type in the bundle. |
| */ |
| public static final String EXTRA_DOC = "document"; |
| |
| /** |
| * Extra flag used to store DirectoryFragment's selection of Selection type in the bundle. |
| */ |
| public static final String EXTRA_SELECTION = "selection"; |
| |
| /** |
| * Extra flag used to store DirectoryFragment's search mode of boolean type in the bundle. |
| */ |
| public static final String EXTRA_SEARCH_MODE = "searchMode"; |
| |
| /** |
| * Extra flag used to store DirectoryFragment's ignore state of boolean type in the bundle. |
| */ |
| public static final String EXTRA_IGNORE_STATE = "ignoreState"; |
| |
| /** |
| * Extra for an Intent for enabling performance benchmark. Used only by tests. |
| */ |
| public static final String EXTRA_BENCHMARK = "com.android.documentsui.benchmark"; |
| |
| /** |
| * Maximum number of items in a Binder transaction packet. |
| */ |
| public static final int MAX_DOCS_IN_INTENT = 1000; |
| |
| private static final Collator sCollator; |
| |
| static { |
| sCollator = Collator.getInstance(); |
| sCollator.setStrength(Collator.SECONDARY); |
| } |
| |
| /** |
| * Generates a formatted quantity string. |
| */ |
| public static final String getQuantityString(Context context, int resourceId, int quantity) { |
| return context.getResources().getQuantityString(resourceId, quantity, quantity); |
| } |
| |
| public static String formatTime(Context context, long when) { |
| // TODO: DateUtils should make this easier |
| Time then = new Time(); |
| then.set(when); |
| Time now = new Time(); |
| now.setToNow(); |
| |
| int flags = DateUtils.FORMAT_NO_NOON | DateUtils.FORMAT_NO_MIDNIGHT |
| | DateUtils.FORMAT_ABBREV_ALL; |
| |
| if (then.year != now.year) { |
| flags |= DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE; |
| } else if (then.yearDay != now.yearDay) { |
| flags |= DateUtils.FORMAT_SHOW_DATE; |
| } else { |
| flags |= DateUtils.FORMAT_SHOW_TIME; |
| } |
| |
| return DateUtils.formatDateTime(context, when, flags); |
| } |
| |
| /** |
| * A convenient way to transform any list into a (parcelable) ArrayList. |
| * Uses cast if possible, else creates a new list with entries from {@code list}. |
| */ |
| public static <T> ArrayList<T> asArrayList(List<T> list) { |
| return list instanceof ArrayList |
| ? (ArrayList<T>) list |
| : new ArrayList<T>(list); |
| } |
| |
| /** |
| * Compare two strings against each other using system default collator in a |
| * case-insensitive mode. Clusters strings prefixed with {@link DIR_PREFIX} |
| * before other items. |
| */ |
| public static int compareToIgnoreCaseNullable(String lhs, String rhs) { |
| final boolean leftEmpty = TextUtils.isEmpty(lhs); |
| final boolean rightEmpty = TextUtils.isEmpty(rhs); |
| |
| if (leftEmpty && rightEmpty) return 0; |
| if (leftEmpty) return -1; |
| if (rightEmpty) return 1; |
| |
| return sCollator.compare(lhs, rhs); |
| } |
| |
| public static boolean isHardwareKeyboardAvailable(Context context) { |
| return context.getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS; |
| } |
| |
| public static void ensureKeyboardPresent(Context context, AlertDialog dialog) { |
| if (!isHardwareKeyboardAvailable(context)) { |
| dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); |
| } |
| } |
| |
| /* |
| * Returns true if app is running in "productivity mode". |
| */ |
| private static boolean isProductivityMode(Context context, Intent intent) { |
| return intent.getBooleanExtra( |
| Shared.EXTRA_PRODUCTIVITY_MODE, |
| context.getResources().getBoolean(R.bool.productivity_device)); |
| } |
| |
| /* |
| * Returns true if "Documents" root should be shown. |
| */ |
| public static boolean shouldShowDocumentsRoot(Context context, Intent intent) { |
| return isProductivityMode(context, intent); |
| } |
| |
| /* |
| * Returns true if device root should be shown. |
| */ |
| public static boolean shouldShowDeviceRoot(Context context, Intent intent) { |
| return isProductivityMode(context, intent) |
| || intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false); |
| } |
| |
| /** |
| * Returns true if device root should be shown. |
| */ |
| public static boolean shouldShowFancyFeatures(Activity activity) { |
| Intent intent = activity.getIntent(); |
| return isProductivityMode(activity, intent) |
| || intent.getBooleanExtra(DocumentsContract.EXTRA_FANCY_FEATURES, false); |
| } |
| } |