-
Notifications
You must be signed in to change notification settings - Fork 68
/
MainActivity.cs
149 lines (122 loc) · 6.66 KB
/
MainActivity.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using Android.App;
using Android.Content;
using Android.Widget;
using Android.OS;
using Plugin.DownloadManager;
using Plugin.DownloadManager.Abstractions;
using System;
using System.Linq;
using System.IO;
namespace DownloadExample.Droid
{
[Activity (Label = "Download Example", Name = "com.example.download_example.MainActivity", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
void InitDownloadManager ()
{
// Define where the files should be stored. MUST be an external storage. (see https://github.com/SimonSimCity/Xamarin-CrossDownloadManager/issues/10)
// If you skip this, you neither need the permission `WRITE_EXTERNAL_STORAGE`.
//CrossDownloadManager.Current.PathNameForDownloadedFile = new Func<IDownloadFile, string> (file => {
// string fileName = Android.Net.Uri.Parse (file.Url).Path.Split ('/').Last ();
// return Path.Combine (ApplicationContext.GetExternalFilesDir (Android.OS.Environment.DirectoryDownloads).AbsolutePath, fileName);
//});
// In case you want to create your own notification :)
//(CrossDownloadManager.Current as DownloadManagerImplementation).NotificationVisibility = DownloadVisibility.Hidden;
// Prevents the file from appearing in the android download manager
(CrossDownloadManager.Current as DownloadManagerImplementation).IsVisibleInDownloadsUi = true;
}
NotificationClickedBroadcastReceiver _receiverNotificationClicked;
protected override void OnResume ()
{
base.OnResume ();
_receiverNotificationClicked = new NotificationClickedBroadcastReceiver ();
RegisterReceiver (
_receiverNotificationClicked,
new IntentFilter (DownloadManager.ActionNotificationClicked)
);
}
protected override void OnPause ()
{
base.OnPause ();
UnregisterReceiver (_receiverNotificationClicked);
}
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
InitDownloadManager ();
// Get our button from the layout resource,
// and attach an event to it
Button button = FindViewById<Button> (Resource.Id.myButton);
var foo = new Downloader ();
button.Click += delegate {
// If already downloading, abort it.
if (foo.IsDownloading()) {
foo.AbortDownloading ();
button.Text = "Download aborted.";
return;
}
button.Text = "Start downloading ...";
foo.InitializeDownload();
foo.File.PropertyChanged += (sender, e) => {
System.Diagnostics.Debug.WriteLine("[Property changed] " + e.PropertyName + " -> " + sender.GetType().GetProperty(e.PropertyName).GetValue(sender, null).ToString());
// Update UI text-fields
var downloadFile = ((IDownloadFile)sender);
switch (e.PropertyName) {
case nameof(IDownloadFile.Status):
FindViewById<TextView>(Resource.Id.value_status).Text = downloadFile.Status.ToString();
break;
case nameof(IDownloadFile.StatusDetails):
FindViewById<TextView>(Resource.Id.value_statusdetails).Text = downloadFile.StatusDetails;
break;
case nameof(IDownloadFile.TotalBytesExpected):
FindViewById<TextView>(Resource.Id.value_totalbytesexpected).Text = downloadFile.TotalBytesExpected.ToString();
break;
case nameof(IDownloadFile.TotalBytesWritten):
FindViewById<TextView>(Resource.Id.value_totalbyteswritten).Text = downloadFile.TotalBytesWritten.ToString();
break;
}
// Update UI if download-status changed.
if (e.PropertyName == "Status") {
switch (((IDownloadFile)sender).Status) {
case DownloadFileStatus.COMPLETED:
case DownloadFileStatus.FAILED:
case DownloadFileStatus.CANCELED:
button.Text = "Downloading finished.";
// Get the path this file was saved to. When you didn't set a custom path, this will be some temporary directory.
var nativeDownloadManager = (DownloadManager)ApplicationContext.GetSystemService (DownloadService);
System.Diagnostics.Debug.WriteLine (nativeDownloadManager.GetUriForDownloadedFile (((DownloadFileImplementation)sender).Id));
break;
}
}
// Update UI while donwloading.
if (e.PropertyName == "TotalBytesWritten" || e.PropertyName == "TotalBytesExpected") {
var bytesExpected = ((IDownloadFile)sender).TotalBytesExpected;
var bytesWritten = ((IDownloadFile)sender).TotalBytesWritten;
if (bytesExpected > 0) {
var percentage = Math.Round (bytesWritten / bytesExpected * 100);
button.Text = "Downloading (" + percentage + "%)";
}
}
};
try {
foo.StartDownloading(FindViewById<Switch>(Resource.Id.switch1).Checked);
} catch (Java.Lang.IllegalArgumentException) {
foo.File = null;
button.Text = "Download crashed.";
try {
//Open the specific App Info page:
Intent intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings);
intent.SetData(Android.Net.Uri.Parse("package:com.android.providers.downloads"));
StartActivity(intent);
} catch (ActivityNotFoundException) {
//Open the generic Apps page:
Intent intent = new Intent(Android.Provider.Settings.ActionManageApplicationsSettings);
StartActivity(intent);
}
}
};
}
}
}