bug 606235 - Android file picker should honor file type filters r=mwu a=blocking-fennec

This commit is contained in:
Brad Lassey 2010-11-05 13:43:12 -04:00
Родитель b0b7a039e2
Коммит c90d923fa5
7 изменённых файлов: 70 добавлений и 43 удалений

Просмотреть файл

@ -512,10 +512,10 @@ abstract public class GeckoApp
static final int FILE_PICKER_REQUEST = 1;
private SynchronousQueue<String> mFilePickerResult = new SynchronousQueue();
public String showFilePicker() {
public String showFilePicker(String aMimeType) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.setType(aMimeType);
GeckoApp.this.
startActivityForResult(
Intent.createChooser(intent,"choose a file"),

Просмотреть файл

@ -417,8 +417,30 @@ class GeckoAppShell
return new Intent(Intent.ACTION_VIEW);
}
static String getMimeTypeFromExtension(String aFileExt) {
return android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(aFileExt);
static String getMimeTypeFromExtensions(String aFileExt) {
android.webkit.MimeTypeMap mtm =
android.webkit.MimeTypeMap.getSingleton();
StringTokenizer st = new StringTokenizer(aFileExt, "., ");
String type = null;
String subType = null;
while (st.hasMoreElements()) {
String ext = st.nextToken();
String mt = mtm.getMimeTypeFromExtension(ext);
if (mt == null)
continue;
int slash = mt.indexOf('/');
String tmpType = mt.substring(0, slash);
if (!tmpType.equalsIgnoreCase(type))
type = type == null ? tmpType : "*";
String tmpSubType = mt.substring(slash + 1);
if (!tmpSubType.equalsIgnoreCase(subType))
subType = subType == null ? tmpSubType : "*";
}
if (type == null)
type = "*";
if (subType == null)
subType = "*";
return type + "/" + subType;
}
static boolean openUriExternal(String aUriSpec, String aMimeType, String aPackageName,
@ -575,7 +597,8 @@ class GeckoAppShell
GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(metrics);
return metrics.densityDpi;
}
public static String showFilePicker() {
return GeckoApp.mAppContext.showFilePicker();
public static String showFilePicker(String aFilters) {
return GeckoApp.mAppContext.
showFilePicker(getMimeTypeFromExtensions(aFilters));
}
}

Просмотреть файл

@ -102,7 +102,7 @@ nsMIMEInfoAndroid::GetMimeInfoForFileExt(const nsACString& aFileExt,
nsCString mimeType;
if (mozilla::AndroidBridge::Bridge())
mozilla::AndroidBridge::Bridge()->
GetMimeTypeFromExtension(aFileExt, mimeType);
GetMimeTypeFromExtensions(aFileExt, mimeType);
return GetMimeInfoForMimeType(mimeType, aMimeInfo);
}

Просмотреть файл

@ -108,12 +108,12 @@ AndroidBridge::Init(JNIEnv *jEnv,
jGetHandlersForMimeType = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getHandlersForMimeType", "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;");
jGetHandlersForProtocol = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getHandlersForProtocol", "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;");
jOpenUriExternal = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "openUriExternal", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z");
jGetMimeTypeFromExtension = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getMimeTypeFromExtension", "(Ljava/lang/String;)Ljava/lang/String;");
jGetMimeTypeFromExtensions = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getMimeTypeFromExtensions", "(Ljava/lang/String;)Ljava/lang/String;");
jMoveTaskToBack = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "moveTaskToBack", "()V");
jGetClipboardText = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getClipboardText", "()Ljava/lang/String;");
jSetClipboardText = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "setClipboardText", "(Ljava/lang/String;)V");
jShowAlertNotification = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "showAlertNotification", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
jShowFilePicker = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "showFilePicker", "()Ljava/lang/String;");
jShowFilePicker = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "showFilePicker", "(Ljava/lang/String;)Ljava/lang/String;");
jAlertsProgressListener_OnProgress = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "alertsProgressListener_OnProgress", "(Ljava/lang/String;JJLjava/lang/String;)V");
jAlertsProgressListener_OnCancel = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "alertsProgressListener_OnCancel", "(Ljava/lang/String;)V");
jGetDpi = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getDpi", "()I");
@ -389,12 +389,12 @@ AndroidBridge::OpenUriExternal(const nsACString& aUriSpec, const nsACString& aMi
}
void
AndroidBridge::GetMimeTypeFromExtension(const nsACString& aFileExt, nsCString& aMimeType) {
AndroidBridge::GetMimeTypeFromExtensions(const nsACString& aFileExt, nsCString& aMimeType) {
AutoLocalJNIFrame jniFrame;
NS_ConvertUTF8toUTF16 wFileExt(aFileExt);
jstring jstrExt = mJNIEnv->NewString(wFileExt.get(), wFileExt.Length());
jstring jstrType = static_cast<jstring>(mJNIEnv->CallStaticObjectMethod(mGeckoAppShellClass,
jGetMimeTypeFromExtension,
jGetMimeTypeFromExtensions,
jstrExt));
nsJNIString jniStr(jstrType);
aMimeType.Assign(NS_ConvertUTF16toUTF8(jniStr.get()));
@ -506,10 +506,14 @@ AndroidBridge::GetDPI()
}
void
AndroidBridge::ShowFilePicker(nsAString& aFilePath)
AndroidBridge::ShowFilePicker(nsAString& aFilePath, nsAString& aFilters)
{
AutoLocalJNIFrame jniFrame;
jstring jstrFilers = mJNIEnv->NewString(nsPromiseFlatString(aFilters).get(),
aFilters.Length());
jstring jstr = static_cast<jstring>(mJNIEnv->CallStaticObjectMethod(
mGeckoAppShellClass, jShowFilePicker));
mGeckoAppShellClass,
jShowFilePicker, jstrFilers));
aFilePath.Assign(nsJNIString(jstr));
}

Просмотреть файл

@ -140,7 +140,7 @@ public:
const nsAString& aAction = EmptyString(),
const nsAString& aTitle = EmptyString());
void GetMimeTypeFromExtension(const nsACString& aFileExt, nsCString& aMimeType);
void GetMimeTypeFromExtensions(const nsACString& aFileExt, nsCString& aMimeType);
void MoveTaskToBack();
@ -168,7 +168,7 @@ public:
int GetDPI();
void ShowFilePicker(nsAString& aFilePath);
void ShowFilePicker(nsAString& aFilePath, nsAString& aFilters);
struct AutoLocalJNIFrame {
AutoLocalJNIFrame(int nEntries = 128) : mEntries(nEntries) {
@ -226,7 +226,7 @@ protected:
jmethodID jGetHandlersForMimeType;
jmethodID jGetHandlersForProtocol;
jmethodID jOpenUriExternal;
jmethodID jGetMimeTypeFromExtension;
jmethodID jGetMimeTypeFromExtensions;
jmethodID jMoveTaskToBack;
jmethodID jGetClipboardText;
jmethodID jSetClipboardText;

Просмотреть файл

@ -48,14 +48,13 @@ NS_IMETHODIMP nsFilePicker::Init(nsIDOMWindow *parent, const nsAString& title,
return nsIFilePicker::modeOpen == mode ? NS_OK : NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsFilePicker::AppendFilters(PRInt32 filterMask)
NS_IMETHODIMP nsFilePicker::AppendFilter(const nsAString& /*title*/,
const nsAString& filter)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsFilePicker::AppendFilter(const nsAString & title, const nsAString & filter)
{
return NS_ERROR_NOT_IMPLEMENTED;
if (!mFilters.IsEmpty())
mFilters.AppendLiteral(", ");
mFilters.Append(filter);
return NS_OK;
}
NS_IMETHODIMP nsFilePicker::GetDefaultString(nsAString & aDefaultString)
@ -76,15 +75,6 @@ NS_IMETHODIMP nsFilePicker::SetDefaultExtension(const nsAString & aDefaultExtens
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsFilePicker::GetFilterIndex(PRInt32 *aFilterIndex)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsFilePicker::SetFilterIndex(PRInt32 aFilterIndex)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsFilePicker::GetDisplayDirectory(nsILocalFile **aDisplayDirectory)
{
return NS_ERROR_NOT_IMPLEMENTED;
@ -127,17 +117,13 @@ NS_IMETHODIMP nsFilePicker::GetFileURL(nsIURI **aFileURL)
return CallQueryInterface(uri, aFileURL);
}
NS_IMETHODIMP nsFilePicker::GetFiles(nsISimpleEnumerator **aFiles)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsFilePicker::Show(PRInt16 *_retval NS_OUTPARAM)
{
if (!mozilla::AndroidBridge::Bridge())
return NS_ERROR_NOT_IMPLEMENTED;
nsAutoString filePath;
mozilla::AndroidBridge::Bridge()->ShowFilePicker(filePath);
mozilla::AndroidBridge::Bridge()->ShowFilePicker(filePath, mFilters);
*_retval = EmptyString().Equals(filePath) ?
nsIFilePicker::returnCancel : nsIFilePicker::returnOK;
if (*_retval == nsIFilePicker::returnOK)

Просмотреть файл

@ -38,16 +38,30 @@
#ifndef NSFILEPICKER_H
#define NSFILEPICKER_H
#include "nsIFilePicker.h"
#include "nsBaseFilePicker.h"
#include "nsString.h"
class nsFilePicker : public nsIFilePicker
class nsFilePicker : public nsBaseFilePicker
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIFILEPICKER
NS_DECL_ISUPPORTS
NS_IMETHODIMP Init(nsIDOMWindow *parent, const nsAString& title,
PRInt16 mode);
NS_IMETHOD AppendFilter(const nsAString & aTitle,
const nsAString & aFilter);
NS_IMETHOD GetDefaultString(nsAString & aDefaultString);
NS_IMETHOD SetDefaultString(const nsAString & aDefaultString);
NS_IMETHOD GetDefaultExtension(nsAString & aDefaultExtension);
NS_IMETHOD SetDefaultExtension(const nsAString & aDefaultExtension);
NS_IMETHOD GetFile(nsILocalFile * *aFile);
NS_IMETHOD GetFileURL(nsIURI * *aFileURL);
NS_IMETHOD SetDisplayDirectory(nsILocalFile *aDisplayDirectory);
NS_IMETHOD GetDisplayDirectory(nsILocalFile **aDisplayDirectory);
NS_IMETHOD Show(PRInt16 *aReturn);
private:
nsString mFilePath;
void InitNative(nsIWidget*, const nsAString&, PRInt16) {};
nsString mFilePath;
nsString mFilters;
};
#endif