2023-01-23 05:47:16 +08:00
|
|
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
|
|
// See the LICENCE file in the repository root for full licence text.
|
|
|
|
|
|
|
|
using System.IO;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Android.Content;
|
|
|
|
using Android.Net;
|
|
|
|
using Android.Provider;
|
|
|
|
using osu.Game.Database;
|
|
|
|
|
|
|
|
namespace osu.Android
|
|
|
|
{
|
|
|
|
public class AndroidImportTask : ImportTask
|
|
|
|
{
|
|
|
|
private readonly ContentResolver contentResolver;
|
|
|
|
|
|
|
|
private readonly Uri uri;
|
|
|
|
|
|
|
|
private AndroidImportTask(Stream stream, string filename, ContentResolver contentResolver, Uri uri)
|
|
|
|
: base(stream, filename)
|
|
|
|
{
|
|
|
|
this.contentResolver = contentResolver;
|
|
|
|
this.uri = uri;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void DeleteFile()
|
|
|
|
{
|
|
|
|
contentResolver.Delete(uri, null, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static async Task<AndroidImportTask?> Create(ContentResolver contentResolver, Uri uri)
|
|
|
|
{
|
|
|
|
// there are more performant overloads of this method, but this one is the most backwards-compatible
|
|
|
|
// (dates back to API 1).
|
|
|
|
|
|
|
|
var cursor = contentResolver.Query(uri, null, null, null, null);
|
|
|
|
|
|
|
|
if (cursor == null)
|
|
|
|
return null;
|
|
|
|
|
2023-01-23 06:11:50 +08:00
|
|
|
if (!cursor.MoveToFirst())
|
|
|
|
return null;
|
2023-01-23 05:47:16 +08:00
|
|
|
|
|
|
|
int filenameColumn = cursor.GetColumnIndex(IOpenableColumns.DisplayName);
|
2023-01-23 06:11:50 +08:00
|
|
|
string filename = cursor.GetString(filenameColumn) ?? uri.Path ?? string.Empty;
|
2023-01-23 05:47:16 +08:00
|
|
|
|
|
|
|
// SharpCompress requires archive streams to be seekable, which the stream opened by
|
|
|
|
// OpenInputStream() seems to not necessarily be.
|
|
|
|
// copy to an arbitrary-access memory stream to be able to proceed with the import.
|
|
|
|
var copy = new MemoryStream();
|
|
|
|
|
|
|
|
using (var stream = contentResolver.OpenInputStream(uri))
|
2023-01-23 06:11:50 +08:00
|
|
|
{
|
|
|
|
if (stream == null)
|
|
|
|
return null;
|
|
|
|
|
2023-01-23 05:47:16 +08:00
|
|
|
await stream.CopyToAsync(copy).ConfigureAwait(false);
|
2023-01-23 06:11:50 +08:00
|
|
|
}
|
2023-01-23 05:47:16 +08:00
|
|
|
|
|
|
|
return new AndroidImportTask(copy, filename, contentResolver, uri);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|