This reverts commit 2e4e14789e.
Bug: 28371571
Change-Id: I7aad5eb483c17cccb3485eb22effb677e1ba2160
214 lines
7.1 KiB
Java
214 lines
7.1 KiB
Java
/*
|
|
* 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.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".
|
|
*/
|
|
public static boolean productivityMode(Context context) {
|
|
return context.getResources().getBoolean(R.bool.productivity_device);
|
|
}
|
|
|
|
/*
|
|
* 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);
|
|
}
|
|
}
|