first sync
1
Components/square.picasso-2.5.2.2.info
Normal file
314
Components/square.picasso-2.5.2.2.png
Normal file
@@ -0,0 +1,314 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
|
||||
<meta charset="utf-8" />
|
||||
|
||||
<title></title>
|
||||
|
||||
<link rel="shortcut icon" href="//xamarin.com/favicon.ico?2" />
|
||||
<meta name="viewport" content="width=1060" />
|
||||
|
||||
|
||||
<link href="/cassette.axd/stylesheet/75304d341f2692195046382a03c9d77c7b7b1e36/resources/ui/global" type="text/css" rel="stylesheet"/>
|
||||
<link href="/cassette.axd/stylesheet/cf21e2a5d7749f53d57d1a2aad772bcaffa48f1e/threeoh" type="text/css" rel="stylesheet"/>
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<noscript>
|
||||
<iframe src="//www.googletagmanager.com/ns.html?id=GTM-57C4Z7"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe>
|
||||
</noscript>
|
||||
<script>
|
||||
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||||
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer','GTM-57C4Z7');</script>
|
||||
|
||||
<!--[if IE]><div id="ie" ><![endif]-->
|
||||
<!--[if IE 9]><div id="ie9" ><![endif]-->
|
||||
<!--[if IE 8]><div id="ie8" ><![endif]-->
|
||||
<!--[if IE 7]><div id="ie7" ><![endif]-->
|
||||
<!--[if IE 6]><div id="ie6" ><![endif]-->
|
||||
|
||||
|
||||
<div id="top-container" class="covering-main-page">
|
||||
<div id="global-header">
|
||||
<div class="global-bar">
|
||||
<div class="wrapper">
|
||||
<h1 class="xamarin logo">
|
||||
<a href="/">Xamarin</a>
|
||||
</h1>
|
||||
<div class="navigation">
|
||||
<a class="label">
|
||||
<span class="menu">Menu</span>
|
||||
<span class="close icon"></span>
|
||||
</a>
|
||||
<ul>
|
||||
<li class="dropdown ">
|
||||
<a data-toggle="dropdown" href="//xamarin.com/products">Products</a>
|
||||
<script type="text/javascript">
|
||||
var preloadProductsIcons = new Image(); preloadProductsIcons.src = "/resources/ui/images/structure/header/products-icons.svg";
|
||||
</script>
|
||||
<ul class="products-list" role="menu">
|
||||
<li>
|
||||
<ul>
|
||||
<li class="platfrom">
|
||||
<a href="https://xamarin.com/platform">
|
||||
Xamarin Platform
|
||||
<small>C# on iOS, Android, Mac & Windows</small>
|
||||
</a>
|
||||
</li>
|
||||
<li class="test-cloud">
|
||||
<a href="https://xamarin.com/test-cloud">
|
||||
Xamarin Test Cloud
|
||||
<small>Find bugs before your users do</small>
|
||||
</a>
|
||||
</li>
|
||||
<li class="insights">
|
||||
<a href="https://xamarin.com/insights">
|
||||
Xamarin Insights
|
||||
<small>Improve your apps with real-time monitoring</small>
|
||||
</a>
|
||||
</li>
|
||||
<li class="university">
|
||||
<a href="https://xamarin.com/university">
|
||||
Xamarin University
|
||||
<small>Unlimited, live mobile development training</small>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<ul>
|
||||
<li class="all"><a href="//xamarin.com/products">All Products</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="https://xamarin.com/customers">Customers</a></li>
|
||||
<li class=""><a href="https://store.xamarin.com/">Pricing</a></li>
|
||||
<li class=""><a href="http://developer.xamarin.com">Developers</a></li>
|
||||
<li class="dropdown ">
|
||||
<a href="//xamarin.com/support">Support</a>
|
||||
<ul role="menu">
|
||||
<li><a href="//xamarin.com/support">Developer Support</a></li>
|
||||
<li><a href="//xamarin.com/partners">Consulting Partners</a></li>
|
||||
<li><a href="//xamarin.com/partners/services">Consulting Services</a></li>
|
||||
<li><a href="//xamarin.com/contact-us">Contact Sales</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="hide-on-mobile dropdown ">
|
||||
<a data-toggle="dropdown" href="//xamarin.com/resources">Resources</a>
|
||||
<ul role="menu">
|
||||
<li><a href="http://blog.xamarin.com">Blog</a></li>
|
||||
<li><a href="//xamarin.com/faq">FAQ</a></li>
|
||||
<li><a href="//xamarin.com/partners">Partners</a></li>
|
||||
<li><a href="//xamarin.com/resources/webinars">Webinars</a></li>
|
||||
<li><a href="//xamarin.com/about">About Xamarin</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="show-on-mobile"><a href="http://blog.xamarin.com">Blog</a></li>
|
||||
<li class="show-on-mobile"><a href="//xamarin.com/about">About Xamarin</a></li>
|
||||
|
||||
<li class="user "><a href="/auth">Sign In</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="local-bar">
|
||||
<div class="wrapper">
|
||||
<div class="navigation">
|
||||
<ul>
|
||||
<li><a href="https://xamarin.uservoice.com/forums/145075-xamarin-component-ideas" class="external">Suggest a Component</a></li>
|
||||
<li><a href="/submit">Submit a Component</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="container">
|
||||
|
||||
<div class="main-page">
|
||||
<div class="main container">
|
||||
|
||||
|
||||
<div class="content">
|
||||
<div class="bottom-gap centered">
|
||||
<h1 class="dark-blue" style="font-size: 240px; line-height: normal; font-weight: 100; margin: 40px 0 0; letter-spacing: -0.035em;">Error</h1>
|
||||
<h2>Oops, something unexpected happened.</h2>
|
||||
<p class="muted">Check out the links above and below. Maybe they can help.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="global-footer">
|
||||
<div class="wrapper width-10">
|
||||
<a href="https://www.xamarin.com" class="hexagon"></a>
|
||||
<div class="social-icons show-on-mobile">
|
||||
<a class="facebook" href="https://facebook.com/xamarinhq">Facebook</a>
|
||||
<a class="twitter" href="https://twitter.com/xamarinhq">Twitter</a>
|
||||
<a class="github" href="https://github.com/xamarin">GitHub</a>
|
||||
</div>
|
||||
|
||||
<div class="navigation hide-on-mobile">
|
||||
<ul>
|
||||
<li>
|
||||
Products
|
||||
<ul>
|
||||
<li><a href="https://www.xamarin.com/platform">Xamarin for Visual Studio</a></li>
|
||||
<li><a href="https://www.xamarin.com/test-cloud">Xamarin Test Cloud</a></li>
|
||||
<li><a href="https://www.xamarin.com/insights">Xamarin Insights</a></li>
|
||||
<li><a href="https://www.xamarin.com/university">Xamarin University</a></li>
|
||||
<li><a href="https://www.xamarin.com/studio">Xamarin Studio</a></li>
|
||||
<li><a href="https://www.xamarin.com/visual-studio">Visual Studio</a></li>
|
||||
<li><a href="https://www.xamarin.com/forms">Xamarin.Forms</a></li>
|
||||
<li><a href="https://www.xamarin.com/prebuilt-apps">Pre-built apps</a></li>
|
||||
<li><a href="https://www.xamarin.com/licensing">Mono Licensing</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
Company
|
||||
<ul>
|
||||
<li><a href="https://www.xamarin.com/about">About Us</a></li>
|
||||
<li><a href="https://www.xamarin.com/customers">Customers</a></li>
|
||||
<li><a href="https://www.xamarin.com/consulting-partners">Partners</a></li>
|
||||
<li><a href="https://blog.xamarin.com">Blog</a></li>
|
||||
<li><a href="https://www.xamarin.com/jobs">Jobs</a></li>
|
||||
<li><a href="https://www.xamarin.com/press">Press</a></li>
|
||||
<li><a href="https://store.xamarin.com">Pricing</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
Developer Center
|
||||
<ul>
|
||||
<li><a href="http://developer.xamarin.com">Get Started</a></li>
|
||||
<li><a href="http://developer.xamarin.com/guides">Guides</a></li>
|
||||
<li><a href="http://developer.xamarin.com/recipes">Recipes</a></li>
|
||||
<li><a href="http://iosapi.xamarin.com/">Xamarin.iOS APIs</a></li>
|
||||
<li><a href="http://androidapi.xamarin.com/">Xamarin.Android APIs</a></li>
|
||||
<li><a href="http://macapi.xamarin.com/">Xamarin.Mac APIs</a></li>
|
||||
<li><a href="https://forums.xamarin.com">Forums</a></li>
|
||||
<li><a href="http://planet.xamarin.com">Community Blogs</a></li>
|
||||
<li><a href="https://components.xamarin.com">Components</a></li>
|
||||
<li><a href="http://developer.xamarin.com/videos/">Videos</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
Connect
|
||||
<ul>
|
||||
<li><a href="https://www.xamarin.com/support">Developer Support</a></li>
|
||||
<li><a href="https://www.xamarin.com/resources">Resources</a></li>
|
||||
<li><a href="https://www.xamarin.com/consulting-partners/services">Consulting Services</a></li>
|
||||
<li><a href="https://www.xamarin.com/contact-us">Contact Sales</a></li>
|
||||
<li><a href="https://twitter.com/xamarinhq">Twitter</a></li>
|
||||
<li><a href="https://github.com/xamarin">GitHub</a></li>
|
||||
<li><a href="http://stackoverflow.com/questions/tagged/xamarin">Stack Overflow</a></li>
|
||||
<li><a href="https://www.facebook.com/xamarinhq">Facebook</a></li>
|
||||
<li><a href="https://plus.google.com/101300081691995092351/posts">Google+</a></li>
|
||||
<li><a href="https://www.youtube.com/user/XamarinVideos">YouTube</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="wrapper">
|
||||
<div class="contact">
|
||||
<a class="tel" href="tel:18559262746">+1 (855) 926-2746</a>
|
||||
<a class="email" href="mailto:hello@xamarin.com">hello@xamarin.com</a>
|
||||
</div>
|
||||
<a class="microsoft-logo" href="https://www.microsoft.com"><img src="/resources/img/microsoft-logo-invert.svg" alt="Microsoft"></a>
|
||||
<div class="legal">
|
||||
<a href="https://www.xamarin.com/privacy">Privacy policy</a>
|
||||
<span>© <noscript>2016</noscript>
|
||||
<script>document.write(new Date().getFullYear())</script> Xamarin Inc.</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
<!--[if gte IE 6]></div><![endif]-->
|
||||
<!--[if IE]></div><![endif]-->
|
||||
|
||||
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="//code.jquery.com/jquery-migrate-1.2.1.js"></script>
|
||||
|
||||
|
||||
<script src="/cassette.axd/script/1b27fd9cd2a430dbb6551fbbebf3ca11bfb1b5d6/resources/scripts/global" type="text/javascript"></script>
|
||||
|
||||
|
||||
<!--[if (gte IE 6)&(lte IE 8)]>
|
||||
<script type="text/javascript" src="~/resources/scripts/jquery-extra-selectors.js"></script>
|
||||
<script type="text/javascript" src="~/resources/scripts/selectivizr.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script>
|
||||
window.pre_authed_by_view=!1;
|
||||
</script>
|
||||
|
||||
<!-- [User: Identity=, EmailAddress=no-email@not-xamarin.com, DisplayName=Anonymous, IsAdmin=False, IsLoggedIn=False] -->
|
||||
|
||||
<script>
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-23759232-11']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
window.analytics || (window.analytics = []), window.analytics.methods = ["identify", "track", "trackLink", "trackForm", "trackClick", "trackSubmit", "page", "pageview", "ab", "alias", "ready", "group", "on", "once", "off"], window.analytics.factory = function (a) {
|
||||
return function () {
|
||||
var t = Array.prototype.slice.call (arguments);
|
||||
return t.unshift (a), window.analytics.push (t), window.analytics;
|
||||
};
|
||||
};
|
||||
for (var i = 0; i < window.analytics.methods.length; i++) {
|
||||
var method = window.analytics.methods[i];
|
||||
window.analytics [method] = window.analytics.factory (method);
|
||||
}
|
||||
window.analytics.load = function (a) {
|
||||
var t = document.createElement("script");
|
||||
t.type = "text/javascript", t.async = true, t.src = ("https:" === document.location.protocol ? "https://" : "http://") + "d2dq2ahtl5zl1z.cloudfront.net/analytics.js/v1/" + a + "/analytics.min.js";
|
||||
var n = document.getElementsByTagName("script")[0];
|
||||
n.parentNode.insertBefore (t, n);
|
||||
};
|
||||
var newRegistrant = false;
|
||||
window.XamVisitor = window.XamVisitor || {};
|
||||
window.analytics.load('7iordhccdt');
|
||||
window.analytics.page('Component Store', "Component Store Page");
|
||||
|
||||
// TODO: Replace this with some AJAX stuff or something...
|
||||
|
||||
XamVisitor.anonymous = true;
|
||||
window.analytics.track ("Visited Component Store");
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
103
Components/square.picasso-2.5.2.2/component/Details.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# Picasso Details
|
||||
|
||||
> A powerful **image downloading** and **caching** library for Android.
|
||||
|
||||
Images add much-needed context and visual flair to Android applications.
|
||||
Picasso allows for hassle-free image loading in your application -- often in one
|
||||
line of code!
|
||||
|
||||
Picasso.With(context)
|
||||
.Load("http://i.imgur.com/DvpvklR.png")
|
||||
.Into(imageView);
|
||||
|
||||
Many common pitfalls of image loading on Android are handled automatically by
|
||||
Picasso:
|
||||
|
||||
* Handling `ImageView` recycling and download cancelation in an adapter.
|
||||
* Complex image transformations with minimal memory use.
|
||||
* Automatic memory and disk caching.
|
||||
|
||||
## Features
|
||||
|
||||
### Adapter Downloads
|
||||
|
||||
Adapter re-use is automatically detected and the previous download canceled:
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent) {
|
||||
SquaredImageView view = (SquaredImageView) convertView;
|
||||
if (view == null) {
|
||||
view = new SquaredImageView(context);
|
||||
}
|
||||
|
||||
string url = this[position];
|
||||
Picasso.With(context).Load(url).Into(view);
|
||||
}
|
||||
|
||||
### Image Transformations
|
||||
|
||||
Transform images to better fit into layouts and to reduce memory size:
|
||||
|
||||
Picasso.With(context)
|
||||
.Load(url)
|
||||
.Resize(50, 50)
|
||||
.CenterCrop()
|
||||
.Into(imageView);
|
||||
|
||||
You can also specify custom transformations for more advanced effects:
|
||||
|
||||
public class CropSquareTransformation : Java.Lang.Object, ITransformation
|
||||
{
|
||||
public Bitmap Transform(Bitmap source)
|
||||
{
|
||||
int size = Math.Min(source.Width, source.Height);
|
||||
int x = (source.Width() - size) / 2;
|
||||
int y = (source.Height() - size) / 2;
|
||||
Bitmap result = Bitmap.CreateBitmap(source, x, y, size, size);
|
||||
if (result != source) {
|
||||
source.Recycle();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public string Key
|
||||
{
|
||||
get { return "square()"; }
|
||||
}
|
||||
}
|
||||
|
||||
Pass an instance of this class to the `Transform` method:
|
||||
|
||||
Picasso.With(context)
|
||||
.Load("http://i.imgur.com/DvpvklR.png")
|
||||
.Transform(new CropSquareTransformation())
|
||||
.Into(imageView);
|
||||
|
||||
### Place Holders
|
||||
|
||||
Picasso supports both download and error placeholders as optional features:
|
||||
|
||||
Picasso.With(context)
|
||||
.Load(url)
|
||||
.Placeholder(Resource.Drawable.placeholder)
|
||||
.Error(Resource.Drawable.error)
|
||||
.Into(imageView);
|
||||
|
||||
A request will be retried three times before the error placeholder is shown.
|
||||
|
||||
### Resource Loading
|
||||
|
||||
Resources, assets, files, content providers are all supported as image
|
||||
sources:
|
||||
|
||||
// resources
|
||||
Picasso.With(context)
|
||||
.Load(Resource.Drawable.landing_screen)
|
||||
.Into(imageView1);
|
||||
// assets
|
||||
Picasso.With(context)
|
||||
.Load("file:///android_asset/DvpvklR.png")
|
||||
.Into(imageView2);
|
||||
// files
|
||||
Picasso.With(context)
|
||||
.Load(new File("..."))
|
||||
.Into(imageView3);
|
||||
107
Components/square.picasso-2.5.2.2/component/GettingStarted.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# Getting Started with Picasso
|
||||
|
||||
<iframe src="https://appetize.io/embed/5w3cj57pegnx0av5kkacytd80r?device=nexus5&scale=75&autoplay=true&orientation=portrait&deviceColor=black"
|
||||
width="300px" height="597px" frameborder="0" scrolling="no"
|
||||
style="float: right;margin-left:24px;"> </iframe>
|
||||
|
||||
> A powerful **image downloading** and **caching** library for Android.
|
||||
|
||||
Images add much-needed context and visual flair to Android applications.
|
||||
Picasso allows for hassle-free image loading in your application -- often in one
|
||||
line of code!
|
||||
|
||||
Picasso.With(context)
|
||||
.Load("http://i.imgur.com/DvpvklR.png")
|
||||
.Into(imageView);
|
||||
|
||||
Many common pitfalls of image loading on Android are handled automatically by
|
||||
Picasso:
|
||||
|
||||
* Handling `ImageView` recycling and download cancelation in an adapter.
|
||||
* Complex image transformations with minimal memory use.
|
||||
* Automatic memory and disk caching.
|
||||
|
||||
## Features
|
||||
|
||||
### Adapter Downloads
|
||||
|
||||
Adapter re-use is automatically detected and the previous download canceled:
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent) {
|
||||
SquaredImageView view = (SquaredImageView) convertView;
|
||||
if (view == null) {
|
||||
view = new SquaredImageView(context);
|
||||
}
|
||||
|
||||
string url = this[position];
|
||||
Picasso.With(context).Load(url).Into(view);
|
||||
}
|
||||
|
||||
### Image Transformations
|
||||
|
||||
Transform images to better fit into layouts and to reduce memory size:
|
||||
|
||||
Picasso.With(context)
|
||||
.Load(url)
|
||||
.Resize(50, 50)
|
||||
.CenterCrop()
|
||||
.Into(imageView);
|
||||
|
||||
You can also specify custom transformations for more advanced effects:
|
||||
|
||||
public class CropSquareTransformation : Java.Lang.Object, ITransformation
|
||||
{
|
||||
public Bitmap Transform(Bitmap source)
|
||||
{
|
||||
int size = Math.Min(source.Width, source.Height);
|
||||
int x = (source.Width() - size) / 2;
|
||||
int y = (source.Height() - size) / 2;
|
||||
Bitmap result = Bitmap.CreateBitmap(source, x, y, size, size);
|
||||
if (result != source) {
|
||||
source.Recycle();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public string Key
|
||||
{
|
||||
get { return "square()"; }
|
||||
}
|
||||
}
|
||||
|
||||
Pass an instance of this class to the `Transform` method:
|
||||
|
||||
Picasso.With(context)
|
||||
.Load("http://i.imgur.com/DvpvklR.png")
|
||||
.Transform(new CropSquareTransformation())
|
||||
.Into(imageView);
|
||||
|
||||
### Place Holders
|
||||
|
||||
Picasso supports both download and error placeholders as optional features:
|
||||
|
||||
Picasso.With(context)
|
||||
.Load(url)
|
||||
.Placeholder(Resource.Drawable.placeholder)
|
||||
.Error(Resource.Drawable.error)
|
||||
.Into(imageView);
|
||||
|
||||
A request will be retried three times before the error placeholder is shown.
|
||||
|
||||
### Resource Loading
|
||||
|
||||
Resources, assets, files, content providers are all supported as image
|
||||
sources:
|
||||
|
||||
// resources
|
||||
Picasso.With(context)
|
||||
.Load(Resource.Drawable.landing_screen)
|
||||
.Into(imageView1);
|
||||
// assets
|
||||
Picasso.With(context)
|
||||
.Load("file:///android_asset/DvpvklR.png")
|
||||
.Into(imageView2);
|
||||
// files
|
||||
Picasso.With(context)
|
||||
.Load(new File("..."))
|
||||
.Into(imageView3);
|
||||
15
Components/square.picasso-2.5.2.2/component/License.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Picasso License
|
||||
|
||||
Copyright 2015 Square, Inc.
|
||||
|
||||
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.
|
||||
20
Components/square.picasso-2.5.2.2/component/Manifest.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<component format="1" id="square.picasso" is-shell="true">
|
||||
<name>Picasso</name>
|
||||
<publisher>Xamarin Inc</publisher>
|
||||
<publisher-url>http://xamarin.com</publisher-url>
|
||||
<src-url>https://github.com/mattleibow/square-bindings</src-url>
|
||||
<version>2.5.2.2</version>
|
||||
<summary>A powerful image downloading and caching library for Android.</summary>
|
||||
<packages>
|
||||
<package id="Square.OkIO" version="1.5.0.0" framework="android" />
|
||||
<package id="Square.OkHttp" version="2.4.0.1" framework="android" />
|
||||
<package id="Square.Picasso" version="2.5.2.1" framework="android" />
|
||||
</packages>
|
||||
<samples>
|
||||
<sample id="PicassoSample">
|
||||
<name>Android Sample</name>
|
||||
<summary>Android Sample</summary>
|
||||
</sample>
|
||||
</samples>
|
||||
</component>
|
||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 168 KiB |
BIN
Components/square.picasso-2.5.2.2/lib/android/Square.Picasso.dll
Normal file
@@ -0,0 +1,42 @@
|
||||
namespace PicassoSample
|
||||
{
|
||||
public static class Data
|
||||
{
|
||||
public static readonly string[] Urls = new string[] {
|
||||
"http://i.imgur.com/CqmBjo5.jpg",
|
||||
"http://i.imgur.com/zkaAooq.jpg",
|
||||
"http://i.imgur.com/0gqnEaY.jpg",
|
||||
"http://i.imgur.com/9gbQ7YR.jpg",
|
||||
"http://i.imgur.com/aFhEEby.jpg",
|
||||
"http://i.imgur.com/0E2tgV7.jpg",
|
||||
"http://i.imgur.com/P5JLfjk.jpg",
|
||||
"http://i.imgur.com/nz67a4F.jpg",
|
||||
"http://i.imgur.com/dFH34N5.jpg",
|
||||
"http://i.imgur.com/FI49ftb.jpg",
|
||||
"http://i.imgur.com/DvpvklR.jpg",
|
||||
"http://i.imgur.com/DNKnbG8.jpg",
|
||||
"http://i.imgur.com/yAdbrLp.jpg",
|
||||
"http://i.imgur.com/55w5Km7.jpg",
|
||||
"http://i.imgur.com/NIwNTMR.jpg",
|
||||
"http://i.imgur.com/DAl0KB8.jpg",
|
||||
"http://i.imgur.com/xZLIYFV.jpg",
|
||||
"http://i.imgur.com/HvTyeh3.jpg",
|
||||
"http://i.imgur.com/Ig9oHCM.jpg",
|
||||
"http://i.imgur.com/7GUv9qa.jpg",
|
||||
"http://i.imgur.com/i5vXmXp.jpg",
|
||||
"http://i.imgur.com/glyvuXg.jpg",
|
||||
"http://i.imgur.com/u6JF6JZ.jpg",
|
||||
"http://i.imgur.com/ExwR7ap.jpg",
|
||||
"http://i.imgur.com/Q54zMKT.jpg",
|
||||
"http://i.imgur.com/9t6hLbm.jpg",
|
||||
"http://i.imgur.com/F8n3Ic6.jpg",
|
||||
"http://i.imgur.com/P5ZRSvT.jpg",
|
||||
"http://i.imgur.com/jbemFzr.jpg",
|
||||
"http://i.imgur.com/8B7haIK.jpg",
|
||||
"http://i.imgur.com/aSeTYQr.jpg",
|
||||
"http://i.imgur.com/OKvWoTh.jpg",
|
||||
"http://i.imgur.com/zD3gT4Z.jpg",
|
||||
"http://i.imgur.com/z77CaIt.jpg"
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using Android.Graphics;
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
public class GrayscaleTransformation : Java.Lang.Object, ITransformation
|
||||
{
|
||||
private readonly Picasso picasso;
|
||||
|
||||
public GrayscaleTransformation(Picasso picasso)
|
||||
{
|
||||
this.picasso = picasso;
|
||||
}
|
||||
|
||||
public Bitmap Transform(Bitmap source)
|
||||
{
|
||||
Bitmap result = Bitmap.CreateBitmap(source.Width, source.Height, source.GetConfig());
|
||||
Bitmap noise;
|
||||
try
|
||||
{
|
||||
noise = picasso.Load(Resource.Drawable.noise).Get();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new Exception("Failed to apply transformation! Missing resource.");
|
||||
}
|
||||
|
||||
BitmapShader shader = new BitmapShader(noise, Shader.TileMode.Repeat, Shader.TileMode.Repeat);
|
||||
|
||||
ColorMatrix colorMatrix = new ColorMatrix();
|
||||
colorMatrix.SetSaturation(0);
|
||||
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
|
||||
|
||||
Paint paint = new Paint(PaintFlags.AntiAlias);
|
||||
paint.SetColorFilter(filter);
|
||||
|
||||
Canvas canvas = new Canvas(result);
|
||||
canvas.DrawBitmap(source, 0, 0, paint);
|
||||
|
||||
paint.SetColorFilter(null);
|
||||
paint.SetShader(shader);
|
||||
paint.SetXfermode(new PorterDuffXfermode(PorterDuff.Mode.Multiply));
|
||||
|
||||
canvas.DrawRect(0, 0, canvas.Width, canvas.Height, paint);
|
||||
|
||||
source.Recycle();
|
||||
noise.Recycle();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public string Key
|
||||
{
|
||||
get { return "grayscaleTransformation()"; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,270 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{44383013-1CBC-48AC-982B-B73ACED887C3}</ProjectGuid>
|
||||
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>PicassoSample</RootNamespace>
|
||||
<AssemblyName>PicassoSample</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AndroidApplication>true</AndroidApplication>
|
||||
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
|
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
||||
<AndroidUseLatestPlatformSdk>False</AndroidUseLatestPlatformSdk>
|
||||
<TargetFrameworkVersion>v5.1</TargetFrameworkVersion>
|
||||
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AndroidLinkMode>None</AndroidLinkMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
|
||||
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
|
||||
<AndroidSupportedAbis>armeabi;armeabi-v7a;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
|
||||
<Debugger>Xamarin</Debugger>
|
||||
<DevInstrumentationEnabled>False</DevInstrumentationEnabled>
|
||||
<AndroidLinkMode>Full</AndroidLinkMode>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Mono.Android" />
|
||||
<Reference Include="mscorlib" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Xamarin.Android.Support.v4">
|
||||
<HintPath>packages\Xamarin.Android.Support.v4.23.0.1.1\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.v7.AppCompat">
|
||||
<HintPath>packages\Xamarin.Android.Support.v7.AppCompat.23.0.1.1\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Square.Picasso">
|
||||
<HintPath>packages\Square.Picasso.2.5.2.1\lib\MonoAndroid\Square.Picasso.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Square.OkHttp">
|
||||
<HintPath>packages\Square.OkHttp.2.7.5.0\lib\MonoAndroid\Square.OkHttp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Square.OkIO">
|
||||
<HintPath>packages\Square.OkIO.1.6.0.0\lib\MonoAndroid\Square.OkIO.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Data.cs" />
|
||||
<Compile Include="GrayscaleTransformation.cs" />
|
||||
<Compile Include="PicassoSampleActivity.cs" />
|
||||
<Compile Include="PicassoSampleAdapter.cs" />
|
||||
<Compile Include="Resources\Resource.Designer.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="SampleGalleryActivity.cs" />
|
||||
<Compile Include="SampleGridViewActivity.cs" />
|
||||
<Compile Include="SampleGridViewAdapter.cs" />
|
||||
<Compile Include="SampleListDetailActivity.cs" />
|
||||
<Compile Include="SampleListDetailAdapter.cs" />
|
||||
<Compile Include="SampleWidgetProvider.cs" />
|
||||
<Compile Include="SquaredImageView.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\AndroidManifest.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\button_selector.xml" />
|
||||
<AndroidResource Include="Resources\values\Strings.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\error.jpg" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\list_selector.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\overlay_selector.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\placeholder.jpg" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\button_disabled.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\button_disabled_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\button_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\button_normal.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\button_pressed.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\contact_picture_placeholder.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\icon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\list_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\list_pressed.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\list_selector_disabled.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\button_disabled.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\button_disabled_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\button_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\button_normal.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\button_pressed.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\contact_picture_placeholder.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\icon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\list_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\list_pressed.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-mdpi\list_selector_disabled.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-nodpi\noise.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\button_disabled.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\button_disabled_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\button_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\button_normal.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\button_pressed.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\contact_picture_placeholder.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\icon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\list_focused.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\list_pressed.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xhdpi\list_selector_disabled.9.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xxhdpi\icon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-xxxhdpi\icon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\notification_view.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\picasso_sample_activity.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\picasso_sample_activity_item.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\sample_gallery_activity.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\sample_gridview_activity.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\sample_list_detail_detail.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\sample_list_detail_item.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\sample_list_detail_list.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\sample_widget.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\colors.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\dimens.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\integers.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\styles.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\themes.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values-land\dimens.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values-w500dp\integers.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values-w600dp\dimens.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values-w600dp\integers.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values-w700dp\integers.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\xml\sample_widget_info.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup></ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.31101.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PicassoSample", "PicassoSample.csproj", "{44383013-1CBC-48AC-982B-B73ACED887C3}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{BC45EFFF-5CEE-4C2D-BBE8-542DBE8E7940}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BC45EFFF-5CEE-4C2D-BBE8-542DBE8E7940}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BC45EFFF-5CEE-4C2D-BBE8-542DBE8E7940}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BC45EFFF-5CEE-4C2D-BBE8-542DBE8E7940}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{44383013-1CBC-48AC-982B-B73ACED887C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{44383013-1CBC-48AC-982B-B73ACED887C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{44383013-1CBC-48AC-982B-B73ACED887C3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{44383013-1CBC-48AC-982B-B73ACED887C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{44383013-1CBC-48AC-982B-B73ACED887C3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{44383013-1CBC-48AC-982B-B73ACED887C3}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{0ADBD990-1A61-4D2A-B1CD-E46AC63348BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0ADBD990-1A61-4D2A-B1CD-E46AC63348BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0ADBD990-1A61-4D2A-B1CD-E46AC63348BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0ADBD990-1A61-4D2A-B1CD-E46AC63348BE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3877E12A-004D-47B8-A978-D58ADFDB5B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3877E12A-004D-47B8-A978-D58ADFDB5B60}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3877E12A-004D-47B8-A978-D58ADFDB5B60}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3877E12A-004D-47B8-A978-D58ADFDB5B60}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,71 @@
|
||||
using Android.OS;
|
||||
using Android.Support.V7.App;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
public abstract class PicassoSampleActivity : AppCompatActivity
|
||||
{
|
||||
private ToggleButton showHide;
|
||||
private FrameLayout sampleContent;
|
||||
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
|
||||
base.SetContentView(Resource.Layout.picasso_sample_activity);
|
||||
sampleContent = FindViewById<FrameLayout>(Resource.Id.sample_content);
|
||||
|
||||
ListView activityList = FindViewById<ListView>(Resource.Id.activity_list);
|
||||
PicassoSampleAdapter adapter = new PicassoSampleAdapter(this);
|
||||
activityList.Adapter = adapter;
|
||||
activityList.ItemClick += (sender, e) =>
|
||||
{
|
||||
adapter[e.Position].Launch(this);
|
||||
};
|
||||
|
||||
showHide = FindViewById<ToggleButton>(Resource.Id.faux_action_bar_control);
|
||||
showHide.CheckedChange += (sender, e) =>
|
||||
{
|
||||
activityList.Visibility = e.IsChecked ? ViewStates.Visible : ViewStates.Gone;
|
||||
};
|
||||
}
|
||||
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
base.OnDestroy();
|
||||
|
||||
Picasso.With(this).CancelTag(this);
|
||||
}
|
||||
|
||||
public override void OnBackPressed()
|
||||
{
|
||||
if (showHide.Checked)
|
||||
{
|
||||
showHide.Checked = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
base.OnBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
public override void SetContentView(int layoutResID)
|
||||
{
|
||||
LayoutInflater.Inflate(layoutResID, sampleContent);
|
||||
}
|
||||
|
||||
public override void SetContentView(View view)
|
||||
{
|
||||
sampleContent.AddView(view);
|
||||
}
|
||||
|
||||
public override void SetContentView(View view, ViewGroup.LayoutParams @params)
|
||||
{
|
||||
sampleContent.AddView(view, @params);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Support.V4.App;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
public class PicassoSampleAdapter : BaseAdapter<PicassoSampleAdapter.Sample>
|
||||
{
|
||||
private const int NotificationId = 666;
|
||||
|
||||
private readonly LayoutInflater inflater;
|
||||
|
||||
public PicassoSampleAdapter(Context context)
|
||||
{
|
||||
inflater = LayoutInflater.From(context);
|
||||
}
|
||||
|
||||
public override int Count
|
||||
{
|
||||
get { return Sample.Values.Length; }
|
||||
}
|
||||
|
||||
public override Sample this[int position]
|
||||
{
|
||||
get { return Sample.Values[position]; }
|
||||
}
|
||||
|
||||
public override long GetItemId(int position)
|
||||
{
|
||||
return position;
|
||||
}
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent)
|
||||
{
|
||||
TextView view = (TextView)convertView;
|
||||
if (view == null)
|
||||
{
|
||||
view = (TextView)inflater.Inflate(Resource.Layout.picasso_sample_activity_item, parent, false);
|
||||
}
|
||||
|
||||
view.Text = this[position].Name;
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
public class Sample
|
||||
{
|
||||
static Sample()
|
||||
{
|
||||
Values = new[]
|
||||
{
|
||||
new Sample("Image Grid View", typeof(SampleGridViewActivity)),
|
||||
new Sample("Load from Gallery", typeof(SampleGalleryActivity)),
|
||||
new Sample("List / Detail View", typeof(SampleListDetailActivity)),
|
||||
new Sample("Sample Notification", activity =>
|
||||
{
|
||||
RemoteViews remoteViews = new RemoteViews(activity.PackageName, Resource.Layout.notification_view);
|
||||
Intent intent = new Intent(activity, typeof(SampleGridViewActivity));
|
||||
Notification notification = new NotificationCompat.Builder(activity)
|
||||
.SetSmallIcon(Resource.Drawable.icon)
|
||||
.SetContentIntent(PendingIntent.GetActivity(activity, -1, intent, 0))
|
||||
.SetContent(remoteViews)
|
||||
.Build();
|
||||
|
||||
// Bug in NotificationCompat that does not set the content.
|
||||
if ((int)Build.VERSION.SdkInt <= (int)BuildVersionCodes.GingerbreadMr1)
|
||||
{
|
||||
notification.ContentView = remoteViews;
|
||||
}
|
||||
|
||||
NotificationManager notificationManager = NotificationManager.FromContext(activity);
|
||||
notificationManager.Notify(NotificationId, notification);
|
||||
|
||||
// Now load an image for this notification.
|
||||
Picasso.With(activity)
|
||||
.Load(Data.Urls[(new Random()).Next(Data.Urls.Length)])
|
||||
.ResizeDimen(
|
||||
Resource.Dimension.notification_icon_width_height,
|
||||
Resource.Dimension.notification_icon_width_height)
|
||||
.Into(remoteViews, Resource.Id.photo, NotificationId, notification);
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
public static readonly Sample[] Values;
|
||||
|
||||
private readonly Type activityClass;
|
||||
private readonly Action<Activity> onLaunch;
|
||||
|
||||
private Sample(string name, Type activityClass)
|
||||
{
|
||||
this.Name = name;
|
||||
this.activityClass = activityClass;
|
||||
}
|
||||
|
||||
private Sample(string name, Action<Activity> onLaunch)
|
||||
{
|
||||
this.Name = name;
|
||||
this.onLaunch = onLaunch;
|
||||
}
|
||||
public string Name { get; private set; }
|
||||
|
||||
public void Launch(Activity activity)
|
||||
{
|
||||
if (onLaunch == null)
|
||||
{
|
||||
activity.StartActivity(new Intent(activity, activityClass));
|
||||
activity.Finish();
|
||||
}
|
||||
else
|
||||
{
|
||||
onLaunch(activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yourcompany.picassosample" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
|
||||
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="22" />
|
||||
<application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@style/Theme.PicassoSample">
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -0,0 +1,39 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using Android.App;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("PicassoSample")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("PicassoSample")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
|
||||
// This is required for Picasso to work
|
||||
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
|
||||
|
||||
// The following permissions are OPTIONAL
|
||||
// Used to adjust the work load depending on the type of network the device is using
|
||||
[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]
|
||||
// Used to load images from the gallery content provider
|
||||
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]
|
||||
4217
Components/square.picasso-2.5.2.2/samples/PicassoSample/Resources/Resource.Designer.cs
generated
Normal file
|
After Width: | Height: | Size: 393 B |
|
After Width: | Height: | Size: 294 B |
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 385 B |
|
After Width: | Height: | Size: 539 B |
|
After Width: | Height: | Size: 944 B |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 139 B |
|
After Width: | Height: | Size: 115 B |
|
After Width: | Height: | Size: 189 B |
|
After Width: | Height: | Size: 289 B |
|
After Width: | Height: | Size: 202 B |
|
After Width: | Height: | Size: 229 B |
|
After Width: | Height: | Size: 257 B |
|
After Width: | Height: | Size: 391 B |
|
After Width: | Height: | Size: 686 B |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 117 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 171 B |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 499 B |
|
After Width: | Height: | Size: 353 B |
|
After Width: | Height: | Size: 398 B |
|
After Width: | Height: | Size: 491 B |
|
After Width: | Height: | Size: 720 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 154 B |
|
After Width: | Height: | Size: 121 B |
|
After Width: | Height: | Size: 188 B |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 37 KiB |
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_window_focused="false" android:state_enabled="true"
|
||||
android:drawable="@drawable/button_normal"/>
|
||||
<item android:state_window_focused="false" android:state_enabled="false"
|
||||
android:drawable="@drawable/button_disabled"/>
|
||||
<item android:state_pressed="true"
|
||||
android:drawable="@drawable/button_pressed"/>
|
||||
<item android:state_focused="true" android:state_enabled="true"
|
||||
android:drawable="@drawable/button_focused"/>
|
||||
<item android:state_enabled="true"
|
||||
android:drawable="@drawable/button_normal"/>
|
||||
<item android:state_focused="true"
|
||||
android:drawable="@drawable/button_disabled_focused"/>
|
||||
<item
|
||||
android:drawable="@drawable/button_disabled"/>
|
||||
</selector>
|
||||
|
After Width: | Height: | Size: 32 KiB |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_window_focused="false" android:drawable="@android:color/transparent"/>
|
||||
|
||||
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
|
||||
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true"
|
||||
android:drawable="@drawable/list_selector_disabled"/>
|
||||
<item android:state_focused="true" android:state_enabled="false"
|
||||
android:drawable="@drawable/list_selector_disabled"/>
|
||||
<item android:state_focused="true" android:state_pressed="true"
|
||||
android:drawable="@drawable/list_pressed"/>
|
||||
<item android:state_focused="false" android:state_pressed="true"
|
||||
android:drawable="@drawable/list_pressed"/>
|
||||
<item android:state_focused="true" android:drawable="@drawable/list_focused"/>
|
||||
</selector>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true" android:drawable="@color/overlay_selector_pressed"/>
|
||||
<item android:drawable="@android:color/transparent"/>
|
||||
</selector>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/photo"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/sample_notification"
|
||||
/>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
<FrameLayout
|
||||
android:id="@+id/sample_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
/>
|
||||
<ListView
|
||||
android:id="@+id/activity_list"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/faux_action_bar_size"
|
||||
android:listSelector="@drawable/overlay_selector"
|
||||
android:divider="@null"
|
||||
android:visibility="gone"
|
||||
style="@style/Widget.PicassoSample.Overlay"
|
||||
/>
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/faux_action_bar_size"
|
||||
android:orientation="horizontal"
|
||||
style="@style/Widget.PicassoSample.Overlay">
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/app_name"
|
||||
style="@style/Widget.PicassoSample.ActionBarTitle"
|
||||
/>
|
||||
<ToggleButton
|
||||
android:id="@+id/faux_action_bar_control"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:textOff="@string/more"
|
||||
android:textOn="@string/hide"
|
||||
style="@style/Widget.PicassoSample.ActionBarButton"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
style="@style/Widget.PicassoSample.ListItem"/>
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ViewAnimator
|
||||
android:id="@+id/animator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffc0c0c0"
|
||||
android:animateFirstView="false"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
/>
|
||||
<ProgressBar
|
||||
android:id="@+id/progress"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
/>
|
||||
</ViewAnimator>
|
||||
|
||||
<Button
|
||||
android:id="@+id/go"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:text="@string/select_picture"
|
||||
/>
|
||||
</FrameLayout>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/grid_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:numColumns="@integer/column_count"
|
||||
android:scrollbarStyle="insideOverlay"
|
||||
android:scrollbars="none"
|
||||
android:listSelector="@null"
|
||||
/>
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/faux_action_bar_size">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp"
|
||||
>
|
||||
<TextView
|
||||
android:id="@+id/url"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:gravity="center"
|
||||
style="@style/Widget.PicassoSample.DescriptionUrl"
|
||||
/>
|
||||
<PicassoSample.SquaredImageView
|
||||
android:id="@+id/photo"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/disk_cache_description"
|
||||
style="@style/Widget.PicassoSample.DescriptionText"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:padding="8dp">
|
||||
<ImageView
|
||||
android:id="@+id/photo"
|
||||
android:layout_width="@dimen/list_detail_image_size"
|
||||
android:layout_height="@dimen/list_detail_image_size"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/url"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
/>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/faux_action_bar_size"
|
||||
android:clipToPadding="false"/>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:contentDescription="@string/sample_widget"
|
||||
/>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="faux_action_bar_size">40dp</dimen>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<integer name="column_count">3</integer>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="faux_action_bar_size">56dp</dimen>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<integer name="column_count">4</integer>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<integer name="column_count">5</integer>
|
||||
</resources>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="overlay_selector_pressed">#40000000</color>
|
||||
<color name="window_background">#ff202020</color>
|
||||
<color name="list_divider">#ff555555</color>
|
||||
</resources>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="faux_action_bar_size">48dp</dimen>
|
||||
<dimen name="list_detail_image_size">60dp</dimen>
|
||||
<dimen name="widget_min_width">110dp</dimen>
|
||||
<dimen name="widget_min_height">110dp</dimen>
|
||||
<dimen name="notification_icon_width_height">64dp</dimen>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<integer name="column_count">2</integer>
|
||||
</resources>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Picasso Samples</string>
|
||||
<string name="hide">HIDE</string>
|
||||
<string name="more">MORE</string>
|
||||
<string name="sample_widget">Picasso Sample Widget</string>
|
||||
<string name="sample_notification">Picasso Sample Notification</string>
|
||||
<string name="select_picture">Select Picture</string>
|
||||
<string name="disk_cache_description">On Ice Cream Sandwich and above, a disk cache is
|
||||
automatically used so that subsequent requests for the same URL do not re-download the
|
||||
image.\n\nTo enable this functionality on pre-ICS use a standalone HTTP client with caching such
|
||||
as OkHttp.
|
||||
</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="Widget.PicassoSample.Button" parent="android:Widget.Button">
|
||||
<item name="android:background">@drawable/button_selector</item>
|
||||
<item name="android:minHeight">48dip</item>
|
||||
<item name="android:minWidth">64dip</item>
|
||||
<item name="android:textColor">#000000</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.Overlay" parent="android:Widget">
|
||||
<item name="android:background">#90000000</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.ActionBarTitle" parent="android:Widget.TextView">
|
||||
<item name="android:paddingLeft">8dp</item>
|
||||
<item name="android:paddingRight">8dp</item>
|
||||
<!-- Use 'dp' so that the user's font preference doesn't affect the action bar. -->
|
||||
<item name="android:textSize">19dp</item>
|
||||
<item name="android:textColor">#ffffffff</item>
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="android:ellipsize">end</item>
|
||||
<item name="android:fontFamily">sans-serif-light</item>
|
||||
<item name="android:textStyle">italic</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.ActionBarButton" parent="android:Widget.Button">
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="android:paddingLeft">16dp</item>
|
||||
<item name="android:paddingRight">16dp</item>
|
||||
<item name="android:textColor">#ffffffff</item>
|
||||
<!-- Use 'dp' so that the user's font preference doesn't affect the action bar. -->
|
||||
<item name="android:textSize">13dp</item>
|
||||
<item name="android:background">@drawable/overlay_selector</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.ListView" parent="android:Widget.ListView">
|
||||
<item name="android:listSelector">@drawable/list_selector</item>
|
||||
<item name="android:divider">@color/list_divider</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.ListItem" parent="android:Widget.TextView">
|
||||
<item name="android:minHeight">50dp</item>
|
||||
<item name="android:padding">12dp</item>
|
||||
<item name="android:gravity">left|center_vertical</item>
|
||||
<item name="android:textSize">16sp</item>
|
||||
<item name="android:textColor">#ffffffff</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.DescriptionUrl" parent="android:Widget.TextView">
|
||||
<item name="android:textSize">15sp</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.PicassoSample.DescriptionText" parent="android:Widget.TextView">
|
||||
<item name="android:textSize">12sp</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<resources>
|
||||
<style name="Theme.PicassoSample" parent="android:Theme.NoTitleBar">
|
||||
<item name="android:windowBackground">@color/window_background</item>
|
||||
<item name="android:buttonStyle">@style/Widget.PicassoSample.Button</item>
|
||||
<item name="android:listViewStyle">@style/Widget.PicassoSample.ListView</item>
|
||||
<item name="android:textColor">#ffe0e0e0</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:minWidth="@dimen/widget_min_width"
|
||||
android:minHeight="@dimen/widget_min_height"
|
||||
android:updatePeriodMillis="86400000"
|
||||
android:initialLayout="@layout/sample_widget"
|
||||
android:widgetCategory="home_screen"
|
||||
/>
|
||||
@@ -0,0 +1,89 @@
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Provider;
|
||||
using Android.Widget;
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
[Activity(Theme = "@style/Theme.AppCompat")]
|
||||
public class SampleGalleryActivity : PicassoSampleActivity
|
||||
{
|
||||
private const int GalleryRequest = 9391;
|
||||
private const string ImageKey = "PicassoSample:image";
|
||||
|
||||
private ImageView imageView;
|
||||
private ViewAnimator animator;
|
||||
private string image;
|
||||
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
|
||||
SetContentView(Resource.Layout.sample_gallery_activity);
|
||||
|
||||
animator = FindViewById<ViewAnimator>(Resource.Id.animator);
|
||||
imageView = FindViewById<ImageView>(Resource.Id.image);
|
||||
|
||||
FindViewById(Resource.Id.go).Click += delegate
|
||||
{
|
||||
Intent gallery = new Intent(Intent.ActionPick, MediaStore.Images.Media.ExternalContentUri);
|
||||
StartActivityForResult(gallery, GalleryRequest);
|
||||
};
|
||||
|
||||
if (savedInstanceState != null)
|
||||
{
|
||||
image = savedInstanceState.GetString(ImageKey);
|
||||
if (image != null)
|
||||
{
|
||||
LoadImage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnPause()
|
||||
{
|
||||
base.OnPause();
|
||||
|
||||
if (IsFinishing)
|
||||
{
|
||||
// Always cancel the request here, this is safe to call even if the image has been loaded.
|
||||
// This ensures that the anonymous callback we have does not prevent the activity from
|
||||
// being garbage collected. It also prevents our callback from getting invoked even after the
|
||||
// activity has finished.
|
||||
Picasso.With(this).CancelRequest(imageView);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnSaveInstanceState(Bundle outState)
|
||||
{
|
||||
base.OnSaveInstanceState(outState);
|
||||
|
||||
outState.PutString(ImageKey, image);
|
||||
}
|
||||
|
||||
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
|
||||
{
|
||||
if (requestCode == GalleryRequest && resultCode == Result.Ok && data != null)
|
||||
{
|
||||
image = data.Data.ToString();
|
||||
LoadImage();
|
||||
}
|
||||
else
|
||||
{
|
||||
base.OnActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadImage()
|
||||
{
|
||||
// Index 1 is the progress bar. Show it while we're loading the image.
|
||||
animator.DisplayedChild = 1;
|
||||
|
||||
Picasso.With(this)
|
||||
.Load(image)
|
||||
.Into(imageView, delegate { animator.DisplayedChild = 0; }, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using Android.App;
|
||||
using Android.OS;
|
||||
using Android.Widget;
|
||||
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
[Activity(Label = "@string/app_name", MainLauncher = true, Theme = "@style/Theme.AppCompat")]
|
||||
public class SampleGridViewActivity : PicassoSampleActivity
|
||||
{
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
|
||||
SetContentView(Resource.Layout.sample_gridview_activity);
|
||||
|
||||
GridView gv = FindViewById<GridView>(Resource.Id.grid_view);
|
||||
gv.Adapter = new SampleGridViewAdapter(this);
|
||||
gv.ScrollStateChanged += (sender, e) =>
|
||||
{
|
||||
Picasso picasso = Picasso.With(this);
|
||||
if (e.ScrollState == ScrollState.Idle || e.ScrollState == ScrollState.TouchScroll)
|
||||
{
|
||||
picasso.ResumeTag(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
picasso.PauseTag(this);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Android.Content;
|
||||
using Android.Widget;
|
||||
|
||||
using Square.Picasso;
|
||||
using Android.Views;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
public class SampleGridViewAdapter : BaseAdapter<string>
|
||||
{
|
||||
private readonly Context context;
|
||||
private readonly List<string> urls = new List<string>();
|
||||
|
||||
public SampleGridViewAdapter(Context context)
|
||||
{
|
||||
this.context = context;
|
||||
|
||||
// Ensure we get a different ordering of images on each run.
|
||||
var copy = Data.Urls.ToList();
|
||||
Shuffle(copy);
|
||||
|
||||
// Triple up the list.
|
||||
urls.AddRange(copy);
|
||||
urls.AddRange(copy);
|
||||
urls.AddRange(copy);
|
||||
}
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent)
|
||||
{
|
||||
SquaredImageView view = convertView as SquaredImageView;
|
||||
if (view == null)
|
||||
{
|
||||
view = new SquaredImageView(context);
|
||||
view.SetScaleType(ImageView.ScaleType.CenterCrop);
|
||||
}
|
||||
|
||||
// Get the image URL for the current position.
|
||||
string url = this[position];
|
||||
|
||||
// Trigger the download of the URL asynchronously into the image view.
|
||||
Picasso.With(context)
|
||||
.Load(url)
|
||||
.Placeholder(Resource.Drawable.placeholder)
|
||||
.Error(Resource.Drawable.error)
|
||||
.Fit()
|
||||
.Tag(context)
|
||||
.Into(view);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
public override int Count
|
||||
{
|
||||
get { return urls.Count; }
|
||||
}
|
||||
|
||||
public override string this[int position]
|
||||
{
|
||||
get { return urls[position]; }
|
||||
}
|
||||
|
||||
public override long GetItemId(int position)
|
||||
{
|
||||
return position;
|
||||
}
|
||||
|
||||
private static void Shuffle<T>(IList<T> list)
|
||||
{
|
||||
Random rng = new Random();
|
||||
int n = list.Count;
|
||||
while (n > 1)
|
||||
{
|
||||
n--;
|
||||
int k = rng.Next(n + 1);
|
||||
T value = list[k];
|
||||
list[k] = list[n];
|
||||
list[n] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
using Android.App;
|
||||
using Android.OS;
|
||||
using Android.Support.V4.App;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
|
||||
using Fragment = Android.Support.V4.App.Fragment;
|
||||
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
[Activity(Theme = "@style/Theme.AppCompat")]
|
||||
public class SampleListDetailActivity : PicassoSampleActivity
|
||||
{
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
|
||||
if (savedInstanceState == null)
|
||||
{
|
||||
SupportFragmentManager.BeginTransaction()
|
||||
.Add(Resource.Id.sample_content, ListFragment.NewInstance())
|
||||
.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void ShowDetails(string url)
|
||||
{
|
||||
SupportFragmentManager.BeginTransaction()
|
||||
.Replace(Resource.Id.sample_content, DetailFragment.NewInstance(url))
|
||||
.AddToBackStack(null)
|
||||
.Commit();
|
||||
}
|
||||
|
||||
public class ListFragment : Fragment
|
||||
{
|
||||
public static ListFragment NewInstance()
|
||||
{
|
||||
return new ListFragment();
|
||||
}
|
||||
|
||||
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
SampleListDetailActivity activity = (SampleListDetailActivity)Activity;
|
||||
SampleListDetailAdapter adapter = new SampleListDetailAdapter(activity);
|
||||
|
||||
ListView listView = (ListView)LayoutInflater.From(activity).Inflate(Resource.Layout.sample_list_detail_list, container, false);
|
||||
listView.Adapter = adapter;
|
||||
listView.ScrollStateChanged += (sender, e) =>
|
||||
{
|
||||
Picasso picasso = Picasso.With(activity);
|
||||
if (e.ScrollState == ScrollState.Idle || e.ScrollState == ScrollState.TouchScroll)
|
||||
{
|
||||
picasso.ResumeTag(activity);
|
||||
}
|
||||
else
|
||||
{
|
||||
picasso.PauseTag(activity);
|
||||
}
|
||||
};
|
||||
listView.ItemClick += (sender, e) =>
|
||||
{
|
||||
string url = adapter[e.Position];
|
||||
activity.ShowDetails(url);
|
||||
};
|
||||
return listView;
|
||||
}
|
||||
}
|
||||
|
||||
public class DetailFragment : Fragment
|
||||
{
|
||||
private const string UrlKey = "picasso:url";
|
||||
|
||||
public static DetailFragment NewInstance(string url)
|
||||
{
|
||||
Bundle arguments = new Bundle();
|
||||
arguments.PutString(UrlKey, url);
|
||||
|
||||
DetailFragment fragment = new DetailFragment();
|
||||
fragment.Arguments = arguments;
|
||||
return fragment;
|
||||
}
|
||||
|
||||
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
Activity activity = Activity;
|
||||
|
||||
View view = LayoutInflater.From(activity).Inflate(Resource.Layout.sample_list_detail_detail, container, false);
|
||||
|
||||
TextView urlView = view.FindViewById<TextView>(Resource.Id.url);
|
||||
ImageView imageView = view.FindViewById<ImageView>(Resource.Id.photo);
|
||||
|
||||
string url = Arguments.GetString(UrlKey);
|
||||
|
||||
urlView.Text = url;
|
||||
Picasso.With(activity)
|
||||
.Load(url)
|
||||
.Fit()
|
||||
.Tag(activity)
|
||||
.Into(imageView);
|
||||
|
||||
return view;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
using System.Collections.Generic;
|
||||
using Android.Widget;
|
||||
using Android.Content;
|
||||
using Android.Views;
|
||||
|
||||
using Square.Picasso;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
public class SampleListDetailAdapter : BaseAdapter<string>
|
||||
{
|
||||
private readonly Context context;
|
||||
private readonly List<string> urls = new List<string>();
|
||||
|
||||
public SampleListDetailAdapter(Context context)
|
||||
{
|
||||
this.context = context;
|
||||
|
||||
urls.AddRange(Data.Urls);
|
||||
}
|
||||
|
||||
public override View GetView(int position, View view, ViewGroup parent)
|
||||
{
|
||||
ViewHolder holder;
|
||||
if (view == null)
|
||||
{
|
||||
view = LayoutInflater.From(context).Inflate(Resource.Layout.sample_list_detail_item, parent, false);
|
||||
holder = new ViewHolder
|
||||
{
|
||||
image = view.FindViewById<ImageView>(Resource.Id.photo),
|
||||
text = view.FindViewById<TextView>(Resource.Id.url)
|
||||
};
|
||||
view.Tag = holder;
|
||||
}
|
||||
else
|
||||
{
|
||||
holder = (ViewHolder)view.Tag;
|
||||
}
|
||||
|
||||
// Get the image URL for the current position.
|
||||
string url = this[position];
|
||||
|
||||
holder.text.Text = url;
|
||||
|
||||
// Trigger the download of the URL asynchronously into the image view.
|
||||
Picasso.With(context)
|
||||
.Load(url)
|
||||
.Placeholder(Resource.Drawable.placeholder)
|
||||
.Error(Resource.Drawable.error)
|
||||
.ResizeDimen(Resource.Dimension.list_detail_image_size, Resource.Dimension.list_detail_image_size)
|
||||
.CenterInside()
|
||||
.Tag(context)
|
||||
.Into(holder.image);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
public override int Count
|
||||
{
|
||||
get { return urls.Count; }
|
||||
}
|
||||
|
||||
public override string this[int position]
|
||||
{
|
||||
get { return urls[position]; }
|
||||
}
|
||||
|
||||
public override long GetItemId(int position)
|
||||
{
|
||||
return position;
|
||||
}
|
||||
|
||||
private class ViewHolder : Java.Lang.Object
|
||||
{
|
||||
internal ImageView image;
|
||||
internal TextView text;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using Android.Appwidget;
|
||||
using Android.Content;
|
||||
using Android.Widget;
|
||||
using Square.Picasso;
|
||||
using Android.App;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
[BroadcastReceiver]
|
||||
[IntentFilter(new[] { "android.appwidget.action.APPWIDGET_UPDATE" })]
|
||||
[MetaData("android.appwidget.provider", Resource = "@xml/sample_widget_info")]
|
||||
public class SampleWidgetProvider : AppWidgetProvider
|
||||
{
|
||||
public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
|
||||
{
|
||||
RemoteViews updateViews = new RemoteViews(context.PackageName, Resource.Layout.sample_widget);
|
||||
|
||||
// Load image for all appWidgetIds.
|
||||
Picasso picasso = Picasso.With(context);
|
||||
picasso.Load(Data.Urls[(new Random()).Next(Data.Urls.Length)])
|
||||
.Placeholder(Resource.Drawable.placeholder)
|
||||
.Error(Resource.Drawable.error)
|
||||
.Transform(new GrayscaleTransformation(picasso))
|
||||
.Into(updateViews, Resource.Id.image, appWidgetIds);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using Android.Content;
|
||||
using Android.Util;
|
||||
using Android.Widget;
|
||||
|
||||
namespace PicassoSample
|
||||
{
|
||||
/// <summary>
|
||||
/// An image view which always remains square with respect to its width.
|
||||
/// </summary>
|
||||
public class SquaredImageView : ImageView
|
||||
{
|
||||
public SquaredImageView(Context context)
|
||||
: base(context)
|
||||
{
|
||||
}
|
||||
|
||||
public SquaredImageView(Context context, IAttributeSet attrs)
|
||||
: base(context, attrs)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
|
||||
{
|
||||
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
SetMeasuredDimension(MeasuredWidth, MeasuredWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Xamarin.Android.Support.v4" version="23.0.1.1" targetFramework="MonoAndroid51" />
|
||||
<package id="Xamarin.Android.Support.v7.AppCompat" version="23.0.1.1" targetFramework="MonoAndroid51" />
|
||||
<package id="Square.Picasso" version="2.5.2.1" targetFramework="MonoAndroid51" />
|
||||
<package id="Square.OkHttp" version="2.7.5.0" targetFramework="MonoAndroid51" />
|
||||
<package id="Square.OkIO" version="1.6.0.0" targetFramework="MonoAndroid51" />
|
||||
</packages>
|
||||
27
MusicApp.sln
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26730.12
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MusicApp", "MusicApp\MusicApp.csproj", "{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {A0D96D0D-1697-4D45-A9B5-8D26403A88DE}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
19
MusicApp/Assets/AboutAssets.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
Any raw assets you want to be deployed with your application can be placed in
|
||||
this directory (and child directories) and given a Build Action of "AndroidAsset".
|
||||
|
||||
These files will be deployed with you package and will be accessible using Android's
|
||||
AssetManager, like this:
|
||||
|
||||
public class ReadAsset : Activity
|
||||
{
|
||||
protected override void OnCreate (Bundle bundle)
|
||||
{
|
||||
base.OnCreate (bundle);
|
||||
|
||||
InputStream input = Assets.Open ("my_asset.txt");
|
||||
}
|
||||
}
|
||||
|
||||
Additionally, some Android functions will automatically load asset files:
|
||||
|
||||
Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
|
||||
4
MusicApp/GettingStarted.Xamarin
Normal file
@@ -0,0 +1,4 @@
|
||||
<GettingStarted>
|
||||
<LocalContent>GS\Android\CS\AndroidApp\GettingStarted.html</LocalContent>
|
||||
<EmbeddedNavigation>false</EmbeddedNavigation>
|
||||
</GettingStarted>
|
||||
160
MusicApp/MainActivity.cs
Normal file
@@ -0,0 +1,160 @@
|
||||
using Android.Widget;
|
||||
using Android.App;
|
||||
using Android.OS;
|
||||
using Android.Support.V7.App;
|
||||
using Android.Support.Design.Widget;
|
||||
using MusicApp.Resources.Fragments;
|
||||
using MusicApp.Resources.Portable_Class;
|
||||
using Android.Views;
|
||||
using System;
|
||||
using Android.Util;
|
||||
using Android.Support.V4.View;
|
||||
using Android.Runtime;
|
||||
|
||||
namespace MusicApp
|
||||
{
|
||||
[Activity(Label = "MusicApp", MainLauncher = true, Icon = "@drawable/MusicIcon", Theme = "@style/Theme")]
|
||||
public class MainActivity : AppCompatActivity
|
||||
{
|
||||
public static MainActivity instance;
|
||||
public Android.Support.V7.Widget.Toolbar ToolBar;
|
||||
public IMenu menu;
|
||||
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
|
||||
SetContentView(Resource.Layout.Main);
|
||||
|
||||
instance = this;
|
||||
|
||||
var bottomNavigation = FindViewById<BottomNavigationView>(Resource.Id.bottomView);
|
||||
bottomNavigation.NavigationItemSelected += PreNavigate;
|
||||
|
||||
Navigate(Resource.Id.musicLayout);
|
||||
|
||||
ToolBar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
|
||||
SetSupportActionBar(ToolBar);
|
||||
SupportActionBar.Title = "MusicApp";
|
||||
}
|
||||
|
||||
public override bool OnCreateOptionsMenu(IMenu menu)
|
||||
{
|
||||
MenuInflater.Inflate(Resource.Menu.toolbar_menu, menu);
|
||||
this.menu = menu;
|
||||
var item = menu.FindItem(Resource.Id.search);
|
||||
item.SetVisible(false);
|
||||
return base.OnCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
public override bool OnOptionsItemSelected(IMenuItem item)
|
||||
{
|
||||
if(item.ItemId == Android.Resource.Id.Home)
|
||||
{
|
||||
var item2 = menu.FindItem(Resource.Id.search);
|
||||
item2.SetVisible(false);
|
||||
if (PlaylistTracks.instance != null)
|
||||
{
|
||||
if (PlaylistTracks.instance.isEmpty)
|
||||
{
|
||||
ViewGroup rootView = FindViewById<ViewGroup>(Android.Resource.Id.Content);
|
||||
rootView.RemoveView(PlaylistTracks.instance.emptyView);
|
||||
}
|
||||
}
|
||||
SupportActionBar.SetHomeButtonEnabled(false);
|
||||
SupportActionBar.SetDisplayHomeAsUpEnabled(false);
|
||||
SupportActionBar.Title = "MusicApp";
|
||||
Navigate(Resource.Id.playlistLayout);
|
||||
}
|
||||
else if(item.ItemId == Resource.Id.settings)
|
||||
{
|
||||
Android.Support.V4.App.Fragment fragment = Preferences.NewInstance();
|
||||
SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, fragment).Commit();
|
||||
}
|
||||
|
||||
return base.OnOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
public void CreateSearch(int requestID)
|
||||
{
|
||||
var item = menu.FindItem(Resource.Id.search);
|
||||
item.SetVisible(true);
|
||||
var searchItem = MenuItemCompat.GetActionView(item);
|
||||
var searchView = searchItem.JavaCast<Android.Support.V7.Widget.SearchView>();
|
||||
|
||||
if (requestID == 0)
|
||||
searchView.QueryTextChange += (s, e) =>
|
||||
{
|
||||
if(Browse.instance != null)
|
||||
Browse.instance.Search(e.NewText);
|
||||
};
|
||||
if (requestID == 1)
|
||||
searchView.QueryTextChange += (s, e) =>
|
||||
{
|
||||
if(PlaylistTracks.instance != null)
|
||||
PlaylistTracks.instance.Search(e.NewText);
|
||||
};
|
||||
if (requestID == 2)
|
||||
searchView.QueryTextSubmit += (s, e) =>
|
||||
{
|
||||
if(DownloadList.instance != null)
|
||||
DownloadList.instance.Search(e.Query);
|
||||
};
|
||||
|
||||
searchView.QueryTextSubmit += (s, e) =>
|
||||
{
|
||||
e.Handled = true;
|
||||
};
|
||||
}
|
||||
|
||||
public void RemoveSearchService(int requestID)
|
||||
{
|
||||
var item = menu.FindItem(Resource.Id.search);
|
||||
item.SetVisible(false);
|
||||
var searchItem = MenuItemCompat.GetActionView(item);
|
||||
var searchView = searchItem.JavaCast<Android.Support.V7.Widget.SearchView>();
|
||||
|
||||
searchView.ClearFocus();
|
||||
|
||||
if (requestID == 0)
|
||||
searchView.QueryTextChange -= (s, e) => Browse.instance.Search(e.NewText);
|
||||
if (requestID == 1)
|
||||
searchView.QueryTextChange -= (s, e) => PlaylistTracks.instance.Search(e.NewText);
|
||||
if (requestID == 2)
|
||||
searchView.QueryTextSubmit -= (s, e) => DownloadList.instance.Search(e.Query);
|
||||
}
|
||||
|
||||
private void PreNavigate(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
|
||||
{
|
||||
Navigate(e.Item.ItemId);
|
||||
}
|
||||
|
||||
private void Navigate(int layout)
|
||||
{
|
||||
Android.Support.V4.App.Fragment fragment = null;
|
||||
switch (layout)
|
||||
{
|
||||
case Resource.Id.musicLayout:
|
||||
fragment = Queue.NewInstance();
|
||||
break;
|
||||
|
||||
case Resource.Id.browseLayout:
|
||||
fragment = Browse.NewInstance();
|
||||
break;
|
||||
|
||||
case Resource.Id.downloadLayout:
|
||||
fragment = DownloadList.NewInstance();
|
||||
break;
|
||||
|
||||
case Resource.Id.playlistLayout:
|
||||
fragment = Playlist.NewInstance();
|
||||
break;
|
||||
}
|
||||
|
||||
if (fragment == null)
|
||||
return;
|
||||
|
||||
SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, fragment).Commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
63
MusicApp/MainApplication.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
|
||||
using Android.App;
|
||||
using Android.OS;
|
||||
using Android.Runtime;
|
||||
using Plugin.CurrentActivity;
|
||||
|
||||
namespace MusicApp
|
||||
{
|
||||
//You can specify additional application information in this attribute
|
||||
[Application]
|
||||
public class MainApplication : Application, Application.IActivityLifecycleCallbacks
|
||||
{
|
||||
public MainApplication(IntPtr handle, JniHandleOwnership transer)
|
||||
:base(handle, transer)
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnCreate()
|
||||
{
|
||||
base.OnCreate();
|
||||
RegisterActivityLifecycleCallbacks(this);
|
||||
//A great place to initialize Xamarin.Insights and Dependency Services!
|
||||
}
|
||||
|
||||
public override void OnTerminate()
|
||||
{
|
||||
base.OnTerminate();
|
||||
UnregisterActivityLifecycleCallbacks(this);
|
||||
}
|
||||
|
||||
public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
|
||||
{
|
||||
CrossCurrentActivity.Current.Activity = activity;
|
||||
}
|
||||
|
||||
public void OnActivityDestroyed(Activity activity)
|
||||
{
|
||||
}
|
||||
|
||||
public void OnActivityPaused(Activity activity)
|
||||
{
|
||||
}
|
||||
|
||||
public void OnActivityResumed(Activity activity)
|
||||
{
|
||||
CrossCurrentActivity.Current.Activity = activity;
|
||||
}
|
||||
|
||||
public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
|
||||
{
|
||||
}
|
||||
|
||||
public void OnActivityStarted(Activity activity)
|
||||
{
|
||||
CrossCurrentActivity.Current.Activity = activity;
|
||||
}
|
||||
|
||||
public void OnActivityStopped(Activity activity)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
360
MusicApp/MusicApp.csproj
Normal file
@@ -0,0 +1,360 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{35E54AD4-5E2B-4DCD-9C20-F715D682A22B}</ProjectGuid>
|
||||
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>MusicApp</RootNamespace>
|
||||
<AssemblyName>MusicApp</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AndroidApplication>True</AndroidApplication>
|
||||
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
|
||||
<AndroidResgenClass>Resource</AndroidResgenClass>
|
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
||||
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
|
||||
<TargetFrameworkVersion>v7.0</TargetFrameworkVersion>
|
||||
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
|
||||
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
|
||||
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<Optimize>False</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AndroidUseSharedRuntime>True</AndroidUseSharedRuntime>
|
||||
<AndroidLinkMode>None</AndroidLinkMode>
|
||||
<EmbedAssembliesIntoApk>False</EmbedAssembliesIntoApk>
|
||||
<AotAssemblies>false</AotAssemblies>
|
||||
<EnableLLVM>false</EnableLLVM>
|
||||
<BundleAssemblies>false</BundleAssemblies>
|
||||
<Debugger>Xamarin</Debugger>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>PdbOnly</DebugType>
|
||||
<Optimize>True</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AndroidManagedSymbols>true</AndroidManagedSymbols>
|
||||
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
|
||||
<AndroidLinkMode>SdkOnly</AndroidLinkMode>
|
||||
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Plugin.CurrentActivity, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Plugin.CurrentActivity.1.0.1\lib\MonoAndroid10\Plugin.CurrentActivity.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Plugin.MediaManager, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Plugin.MediaManager.0.4.5\lib\MonoAndroid\Plugin.MediaManager.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Plugin.MediaManager.Abstractions, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Plugin.MediaManager.0.4.5\lib\MonoAndroid\Plugin.MediaManager.Abstractions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Plugin.Permissions, Version=2.1.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Plugin.Permissions.2.1.0\lib\MonoAndroid10\Plugin.Permissions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Plugin.Permissions.Abstractions, Version=2.1.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Plugin.Permissions.2.1.0\lib\MonoAndroid10\Plugin.Permissions.Abstractions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Square.OkHttp, Version=2.7.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Square.OkHttp.2.7.5.0\lib\MonoAndroid\Square.OkHttp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Square.OkIO, Version=1.13.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Square.OkIO.1.13.0\lib\MonoAndroid\Square.OkIO.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Square.Picasso, Version=2.5.2.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Square.Picasso.2.5.2.1\lib\MonoAndroid\Square.Picasso.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="Mono.Android" />
|
||||
<Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Annotations, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Compat, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Core.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Core.Utils, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Design, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Fragment, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Media.Compat, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Transition, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Transition.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Transition.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.v4, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.v7.AppCompat, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.v7.Preference, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.Preference.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.v7.RecyclerView, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Android.Support.Vector.Drawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="YoutubeExplode, Version=3.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\YoutubeExplode.3.2.5\lib\netstandard1.1\YoutubeExplode.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="YoutubeSearch, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\YoutubeSearch.dll.1.1\lib\YoutubeSearch.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="MainActivity.cs" />
|
||||
<Compile Include="MainApplication.cs" />
|
||||
<Compile Include="Resources\Fragments\DownloadFragment.cs" />
|
||||
<Compile Include="Resources\Fragments\playerControl.cs" />
|
||||
<Compile Include="Resources\Portable Class\Adapter.cs" />
|
||||
<Compile Include="Resources\Portable Class\Browse.cs" />
|
||||
<Compile Include="Resources\Portable Class\DownloadList.cs" />
|
||||
<Compile Include="Resources\Portable Class\FolderAdapter.cs" />
|
||||
<Compile Include="Resources\Portable Class\MusicPlayer.cs" />
|
||||
<Compile Include="Resources\Portable Class\Playlist.cs" />
|
||||
<Compile Include="Resources\Portable Class\PlaylistTracks.cs" />
|
||||
<Compile Include="Resources\Portable Class\Preferences.cs" />
|
||||
<Compile Include="Resources\Portable Class\Queue.cs" />
|
||||
<Compile Include="Resources\Portable Class\YTitemToSong.cs" />
|
||||
<Compile Include="Resources\Resource.Designer.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Resources\values\Folder.cs" />
|
||||
<Compile Include="Resources\values\FolderHolder.cs" />
|
||||
<Compile Include="Resources\values\Holder.cs" />
|
||||
<Compile Include="Resources\values\Song.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="GettingStarted.Xamarin" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Resources\AboutResources.txt" />
|
||||
<None Include="Properties\AndroidManifest.xml" />
|
||||
<None Include="Assets\AboutAssets.txt" />
|
||||
<AndroidResource Include="Resources\layout\MusicLayout.axml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
<AndroidResource Include="Resources\layout\TimerLayout.axml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
<AndroidResource Include="Resources\layout\BrowseLayout.axml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
<AndroidResource Include="Resources\layout\DownloadLayout.axml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\Main.axml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
<AndroidResource Include="Resources\values\Strings.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Resources\mipmap-hdpi\" />
|
||||
<Folder Include="Resources\mipmap-mdpi\" />
|
||||
<Folder Include="Resources\mipmap-xhdpi\" />
|
||||
<Folder Include="Resources\mipmap-xxhdpi\" />
|
||||
<Folder Include="Resources\mipmap-xxxhdpi\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\PlaylistPlayIcon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\DownloadIcon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\MusicIcon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\menu\bottom_items.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\folderIcon.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\SongList.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<XamarinComponentReference Include="square.picasso">
|
||||
<Visible>False</Visible>
|
||||
<Version>2.5.2.2</Version>
|
||||
</XamarinComponentReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\styles.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\toolbar.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\menu\toolbar_menu.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\settings.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\search.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\search_layout.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_pause_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_skip_next_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_skip_previous_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_play_arrow_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\PlaylistPlay.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\NoPlaylist.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\NoQueue.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\NoSong.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\CreatePlaylistDialog.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\PlaylistList.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\player.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\playerControl.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\playerInfo.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_timer_white_24dp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\Preferences.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\folderList.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_expand_less_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_expand_more_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.1\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.1\build\netstandard2.0\NETStandard.Library.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Transition.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Transition.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Transition.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Transition.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v4.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v4.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v4.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v4.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Design.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Design.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Design.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Design.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.Preference.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.Preference.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\packages\NETStandard.Library.2.0.1\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.1\build\netstandard2.0\NETStandard.Library.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Transition.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Transition.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Transition.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Transition.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.v4.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v4.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v4.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v4.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.Design.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Design.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Design.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Design.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.Preference.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.Preference.targets')" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
8
MusicApp/Properties/AndroidManifest.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="MusicApp.MusicApp" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal">
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="24" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<application android:allowBackup="true" android:label="@string/app_name" android:icon="@drawable/MusicIcon"></application>
|
||||
</manifest>
|
||||
30
MusicApp/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using Android.App;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("MusicApp")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("MusicApp")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
44
MusicApp/Resources/AboutResources.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
Images, layout descriptions, binary blobs and string dictionaries can be included
|
||||
in your application as resource files. Various Android APIs are designed to
|
||||
operate on the resource IDs instead of dealing with images, strings or binary blobs
|
||||
directly.
|
||||
|
||||
For example, a sample Android app that contains a user interface layout (main.axml),
|
||||
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
|
||||
would keep its resources in the "Resources" directory of the application:
|
||||
|
||||
Resources/
|
||||
drawable/
|
||||
icon.png
|
||||
|
||||
layout/
|
||||
main.axml
|
||||
|
||||
values/
|
||||
strings.xml
|
||||
|
||||
In order to get the build system to recognize Android resources, set the build action to
|
||||
"AndroidResource". The native Android APIs do not operate directly with filenames, but
|
||||
instead operate on resource IDs. When you compile an Android application that uses resources,
|
||||
the build system will package the resources for distribution and generate a class called "R"
|
||||
(this is an Android convention) that contains the tokens for each one of the resources
|
||||
included. For example, for the above Resources layout, this is what the R class would expose:
|
||||
|
||||
public class R {
|
||||
public class drawable {
|
||||
public const int icon = 0x123;
|
||||
}
|
||||
|
||||
public class layout {
|
||||
public const int main = 0x456;
|
||||
}
|
||||
|
||||
public class strings {
|
||||
public const int first_string = 0xabc;
|
||||
public const int second_string = 0xbcd;
|
||||
}
|
||||
}
|
||||
|
||||
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
|
||||
to reference the layout/main.axml file, or R.strings.first_string to reference the first
|
||||
string in the dictionary file values/strings.xml.
|
||||
25
MusicApp/Resources/Fragments/DownloadFragment.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using Android.OS;
|
||||
using Android.Views;
|
||||
using Android.Support.V4.App;
|
||||
|
||||
namespace MusicApp.Resources.Fragments
|
||||
{
|
||||
public class DownloadFragment : Fragment
|
||||
{
|
||||
public override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
public static Fragment NewInstance()
|
||||
{
|
||||
return new DownloadFragment { Arguments = new Bundle() };
|
||||
}
|
||||
|
||||
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
var useless = base.OnCreateView(inflater, container, savedInstanceState);
|
||||
return inflater.Inflate(Resource.Layout.DownloadLayout, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
25
MusicApp/Resources/Fragments/playerControl.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using Android.OS;
|
||||
using Android.Views;
|
||||
using Android.Support.V4.App;
|
||||
|
||||
namespace MusicApp.Resources.Fragments
|
||||
{
|
||||
public class playerControl : Fragment
|
||||
{
|
||||
public override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
public static Fragment NewInstance()
|
||||
{
|
||||
return new playerControl { Arguments = new Bundle() };
|
||||
}
|
||||
|
||||
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
var useless = base.OnCreateView(inflater, container, savedInstanceState);
|
||||
return inflater.Inflate(Resource.Layout.playerControl, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
66
MusicApp/Resources/Portable Class/Adapter.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Android.Content;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using MusicApp.Resources.values;
|
||||
using Android.Graphics;
|
||||
using Android.Util;
|
||||
using System.IO;
|
||||
using Android.OS;
|
||||
using Android.App;
|
||||
using Square.Picasso;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
public class Adapter : ArrayAdapter
|
||||
{
|
||||
private Context context;
|
||||
private List<Song> songList;
|
||||
private LayoutInflater inflater;
|
||||
private int resource;
|
||||
|
||||
public Adapter(Context context, int resource, List<Song> songList) : base(context, resource, songList)
|
||||
{
|
||||
this.context = context;
|
||||
this.resource = resource;
|
||||
this.songList = songList;
|
||||
}
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent)
|
||||
{
|
||||
if (inflater == null)
|
||||
{
|
||||
inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
|
||||
}
|
||||
if (convertView == null)
|
||||
{
|
||||
convertView = inflater.Inflate(resource, parent, false);
|
||||
}
|
||||
Holder holder = new Holder(convertView)
|
||||
{
|
||||
Title = { Text = songList[position].GetName() },
|
||||
Artist = { Text = songList[position].GetArtist() },
|
||||
};
|
||||
if(songList[position].GetAlbumArt() == -1)
|
||||
{
|
||||
var songAlbumArtUri = Android.Net.Uri.Parse(songList[position].GetAlbum());
|
||||
Picasso.With(Application.Context).Load(songAlbumArtUri).Placeholder(Resource.Drawable.MusicIcon).Resize(400, 400).CenterCrop().Into(holder.AlbumArt);
|
||||
}
|
||||
else
|
||||
{
|
||||
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
|
||||
var songAlbumArtUri = ContentUris.WithAppendedId(songCover, songList[position].GetAlbumArt());
|
||||
|
||||
Picasso.With(Application.Context).Load(songAlbumArtUri).Placeholder(Resource.Drawable.MusicIcon).Resize(400, 400).CenterCrop().Into(holder.AlbumArt);
|
||||
}
|
||||
|
||||
convertView.SetBackgroundColor(Color.White);
|
||||
//if (position % 2 == 0)
|
||||
//{
|
||||
// convertView.SetBackgroundColor(Color.LightGreen);
|
||||
//}
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
}
|
||||
332
MusicApp/Resources/Portable Class/Browse.cs
Normal file
@@ -0,0 +1,332 @@
|
||||
using Android.OS;
|
||||
using System.Collections.Generic;
|
||||
using Android.Widget;
|
||||
using Android.Net;
|
||||
using Android.Database;
|
||||
using Android.Provider;
|
||||
using MusicApp.Resources.values;
|
||||
using Android.Content;
|
||||
using Android;
|
||||
using Android.Support.Design.Widget;
|
||||
using Android.Views;
|
||||
using Android.Content.PM;
|
||||
using Android.Support.V4.App;
|
||||
using Android.Support.V7.App;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
public class Browse : ListFragment//, ActionBar.ITabListener
|
||||
{
|
||||
public static Browse instance;
|
||||
public static Context act;
|
||||
public static LayoutInflater inflater;
|
||||
public List<Song> musicList = new List<Song>();
|
||||
public Adapter adapter;
|
||||
public View emptyView;
|
||||
|
||||
private View view;
|
||||
private string[] actions = new string[] { "Play", "Play Next", "Play Last", "Add To Playlist" };
|
||||
private bool isEmpty = false;
|
||||
|
||||
|
||||
public override void OnActivityCreated(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnActivityCreated(savedInstanceState);
|
||||
act = Activity;
|
||||
inflater = LayoutInflater;
|
||||
emptyView = LayoutInflater.Inflate(Resource.Layout.NoSong, null);
|
||||
ListView.EmptyView = emptyView;
|
||||
|
||||
//ActionBar.Tab tab = MainActivity.instance.SupportActionBar.NewTab();
|
||||
//tab.SetText("Songs");
|
||||
//tab.SetTabListener(this);
|
||||
//MainActivity.instance.SupportActionBar.AddTab(tab);
|
||||
|
||||
//tab = MainActivity.instance.SupportActionBar.NewTab();
|
||||
//tab.SetText("Folders");
|
||||
//tab.SetTabListener(this);
|
||||
//MainActivity.instance.SupportActionBar.AddTab(tab);
|
||||
|
||||
//tab = MainActivity.instance.SupportActionBar.NewTab();
|
||||
//tab.SetText("Albums");
|
||||
//tab.SetTabListener(this);
|
||||
//MainActivity.instance.SupportActionBar.AddTab(tab);
|
||||
|
||||
GetStoragePermission();
|
||||
InitialiseSearchService();
|
||||
}
|
||||
|
||||
//public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
|
||||
//{
|
||||
// throw new System.NotImplementedException();
|
||||
//}
|
||||
|
||||
//public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
|
||||
//{
|
||||
// throw new System.NotImplementedException();
|
||||
//}
|
||||
|
||||
//public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
|
||||
//{
|
||||
// throw new System.NotImplementedException();
|
||||
//}
|
||||
|
||||
public override void OnDestroy()
|
||||
{
|
||||
MainActivity.instance.RemoveSearchService(0);
|
||||
if (isEmpty)
|
||||
{
|
||||
ViewGroup rootView = Activity.FindViewById<ViewGroup>(Android.Resource.Id.Content);
|
||||
rootView.RemoveView(emptyView);
|
||||
}
|
||||
base.OnDestroy();
|
||||
instance = null;
|
||||
act = null;
|
||||
inflater = null;
|
||||
}
|
||||
|
||||
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
View view = base.OnCreateView(inflater, container, savedInstanceState);
|
||||
this.view = view;
|
||||
return view;
|
||||
}
|
||||
|
||||
public static Fragment NewInstance()
|
||||
{
|
||||
instance = new Browse { Arguments = new Bundle() };
|
||||
return instance;
|
||||
}
|
||||
|
||||
private void InitialiseSearchService()
|
||||
{
|
||||
MainActivity.instance.CreateSearch(0);
|
||||
}
|
||||
|
||||
void GetStoragePermission()
|
||||
{
|
||||
const string permission = Manifest.Permission.ReadExternalStorage;
|
||||
if (Android.Support.V4.Content.ContextCompat.CheckSelfPermission(Android.App.Application.Context, permission) == (int)Permission.Granted)
|
||||
{
|
||||
PopulateList();
|
||||
return;
|
||||
}
|
||||
string[] permissions = new string[] { permission };
|
||||
RequestPermissions(permissions, 0);
|
||||
}
|
||||
|
||||
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
|
||||
{
|
||||
switch (requestCode)
|
||||
{
|
||||
case 0:
|
||||
if (grantResults[0] == Permission.Granted)
|
||||
PopulateList();
|
||||
|
||||
else
|
||||
Snackbar.Make(View , "Permission denied, can't list musics.", Snackbar.LengthShort).Show();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PopulateList()
|
||||
{
|
||||
Uri musicUri = MediaStore.Audio.Media.ExternalContentUri;
|
||||
|
||||
CursorLoader cursorLoader = new CursorLoader(Android.App.Application.Context, musicUri, null, null, null, null);
|
||||
ICursor musicCursor = (ICursor)cursorLoader.LoadInBackground();
|
||||
|
||||
|
||||
if (musicCursor != null && musicCursor.MoveToFirst())
|
||||
{
|
||||
int titleID = musicCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Title);
|
||||
int artistID = musicCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Artist);
|
||||
int albumID = musicCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Album);
|
||||
int thisID = musicCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Id);
|
||||
int pathID = musicCursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Data);
|
||||
do
|
||||
{
|
||||
string Artist = musicCursor.GetString(artistID);
|
||||
string Title = musicCursor.GetString(titleID);
|
||||
string Album = musicCursor.GetString(albumID);
|
||||
long AlbumArt = musicCursor.GetLong(musicCursor.GetColumnIndex(MediaStore.Audio.Albums.InterfaceConsts.AlbumId));
|
||||
long id = musicCursor.GetLong(thisID);
|
||||
string path = musicCursor.GetString(pathID);
|
||||
|
||||
if (Title == null)
|
||||
Title = "Unknown Title";
|
||||
if (Artist == null)
|
||||
Artist = "Unknow Artist";
|
||||
if (Album == null)
|
||||
Album = "Unknow Album";
|
||||
|
||||
musicList.Add(new Song(Title, Artist, Album, AlbumArt, id, path));
|
||||
}
|
||||
while (musicCursor.MoveToNext());
|
||||
musicCursor.Close();
|
||||
}
|
||||
|
||||
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, musicList);
|
||||
ListAdapter = adapter;
|
||||
ListView.TextFilterEnabled = true;
|
||||
ListView.ItemClick += ListView_ItemClick;
|
||||
ListView.ItemLongClick += ListView_ItemLongClick;
|
||||
|
||||
view.SetPadding(0, 100, 0, 0);
|
||||
|
||||
if (adapter == null || adapter.Count == 0)
|
||||
{
|
||||
isEmpty = true;
|
||||
Activity.AddContentView(emptyView, View.LayoutParameters);
|
||||
}
|
||||
}
|
||||
|
||||
public void Search(string search)
|
||||
{
|
||||
List<Song> result = new List<Song>();
|
||||
foreach(Song item in musicList)
|
||||
{
|
||||
if(item.GetName().ToLower().Contains(search.ToLower()) || item.GetArtist().ToLower().Contains(search.ToLower()))
|
||||
{
|
||||
result.Add(item);
|
||||
}
|
||||
}
|
||||
ListAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, result);
|
||||
}
|
||||
|
||||
public void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
||||
{
|
||||
Song item = musicList[e.Position];
|
||||
Play(item);
|
||||
}
|
||||
|
||||
public void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
|
||||
{
|
||||
Song item = musicList[e.Position];
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.AppCompatAlertDialogStyle);
|
||||
builder.SetTitle("Pick an action");
|
||||
builder.SetItems(actions, (senderAlert, args) =>
|
||||
{
|
||||
switch (args.Which)
|
||||
{
|
||||
case 0:
|
||||
Play(item);
|
||||
break;
|
||||
case 1:
|
||||
PlayNext(item);
|
||||
break;
|
||||
case 2:
|
||||
PlayLast(item);
|
||||
break;
|
||||
case 3:
|
||||
GetPlaylist(item);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
builder.Show();
|
||||
}
|
||||
|
||||
public static void Play(Song item)
|
||||
{
|
||||
Context context = Android.App.Application.Context;
|
||||
Intent intent = new Intent(context, typeof(MusicPlayer));
|
||||
intent.PutExtra("file", item.GetPath());
|
||||
context.StartService(intent);
|
||||
}
|
||||
|
||||
public static void PlayNext(Song item)
|
||||
{
|
||||
Context context = Android.App.Application.Context;
|
||||
Intent intent = new Intent(context, typeof(MusicPlayer));
|
||||
intent.PutExtra("file", item.GetPath());
|
||||
intent.SetAction("PlayNext");
|
||||
context.StartService(intent);
|
||||
}
|
||||
|
||||
public static void PlayLast(Song item)
|
||||
{
|
||||
Context context = Android.App.Application.Context;
|
||||
Intent intent = new Intent(context, typeof(MusicPlayer));
|
||||
intent.PutExtra("file", item.GetPath());
|
||||
intent.SetAction("PlayLast");
|
||||
context.StartService(intent);
|
||||
}
|
||||
|
||||
public void GetPlaylist(Song item)
|
||||
{
|
||||
List<string> playList = new List<string>();
|
||||
List<long> playListId = new List<long>();
|
||||
playList.Add("Create a playlist");
|
||||
playListId.Add(0);
|
||||
|
||||
Uri uri = MediaStore.Audio.Playlists.ExternalContentUri;
|
||||
CursorLoader loader = new CursorLoader(Android.App.Application.Context, uri, null, null, null, null);
|
||||
ICursor cursor = (ICursor)loader.LoadInBackground();
|
||||
|
||||
if (cursor != null && cursor.MoveToFirst())
|
||||
{
|
||||
int nameID = cursor.GetColumnIndex(MediaStore.Audio.Playlists.InterfaceConsts.Name);
|
||||
int playlistID = cursor.GetColumnIndex(MediaStore.Audio.Playlists.InterfaceConsts.Id);
|
||||
do
|
||||
{
|
||||
string name = cursor.GetString(nameID);
|
||||
long id = cursor.GetLong(playlistID);
|
||||
playList.Add(name);
|
||||
playListId.Add(id);
|
||||
}
|
||||
while (cursor.MoveToNext());
|
||||
cursor.Close();
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(act, Resource.Style.AppCompatAlertDialogStyle);
|
||||
builder.SetTitle("Add to a playlist");
|
||||
builder.SetItems(playList.ToArray(), (senderAlert, args) =>
|
||||
{
|
||||
AddToPlaylist(item, playList[args.Which], playListId[args.Which]);
|
||||
});
|
||||
builder.Show();
|
||||
}
|
||||
|
||||
public void AddToPlaylist(Song item, string playList, long playlistID)
|
||||
{
|
||||
if (playList == "Create a playlist")
|
||||
CreatePlalistDialog();
|
||||
|
||||
else
|
||||
{
|
||||
ContentResolver resolver = Activity.ContentResolver;
|
||||
ContentValues value = new ContentValues();
|
||||
value.Put(MediaStore.Audio.Playlists.Members.AudioId, item.GetID());
|
||||
value.Put(MediaStore.Audio.Playlists.InterfaceConsts.Id, playlistID);
|
||||
value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, 0);
|
||||
resolver.Insert(MediaStore.Audio.Playlists.Members.GetContentUri("external", playlistID), value);
|
||||
}
|
||||
}
|
||||
|
||||
public void CreatePlalistDialog()
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.AppCompatAlertDialogStyle);
|
||||
builder.SetTitle("Playlist name");
|
||||
View view = inflater.Inflate(Resource.Layout.CreatePlaylistDialog, null);
|
||||
builder.SetView(view);
|
||||
builder.SetNegativeButton("Cancel", (senderAlert, args) => { });
|
||||
builder.SetPositiveButton("Create", (senderAlert, args) =>
|
||||
{
|
||||
CreatePlaylist(view.FindViewById<EditText>(Resource.Id.playlistName).Text);
|
||||
});
|
||||
builder.Show();
|
||||
}
|
||||
|
||||
public void CreatePlaylist(string name)
|
||||
{
|
||||
ContentResolver resolver = Activity.ContentResolver;
|
||||
Uri uri = MediaStore.Audio.Playlists.ExternalContentUri;
|
||||
ContentValues value = new ContentValues();
|
||||
value.Put(MediaStore.Audio.Playlists.InterfaceConsts.Name, name);
|
||||
resolver.Insert(uri, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
178
MusicApp/Resources/Portable Class/DownloadList.cs
Normal file
@@ -0,0 +1,178 @@
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using Android.Support.V7.App;
|
||||
using Android.Support.V4.App;
|
||||
using System.Collections.Generic;
|
||||
using Android.Provider;
|
||||
using Android.Database;
|
||||
using Android.Content.PM;
|
||||
using Android.Support.Design.Widget;
|
||||
using Android;
|
||||
using Android.Net;
|
||||
using YoutubeSearch;
|
||||
using MusicApp.Resources.values;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Android.Media;
|
||||
using YoutubeExplode;
|
||||
using YoutubeExplode.Models;
|
||||
using Android.Support.V7.Preferences;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
public class DownloadList : ListFragment
|
||||
{
|
||||
public static DownloadList instance;
|
||||
|
||||
private View emptyView;
|
||||
private bool isEmpty = true;
|
||||
private List<Song> list = new List<Song>();
|
||||
|
||||
|
||||
public override void OnActivityCreated(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnActivityCreated(savedInstanceState);
|
||||
emptyView = LayoutInflater.Inflate(Resource.Layout.DownloadLayout, null);
|
||||
ListView.EmptyView = emptyView;
|
||||
ListView.ItemClick += ListView_ItemClick;
|
||||
ListView.ItemLongClick += ListView_ItemLongClick; ;
|
||||
ListAdapter = null;
|
||||
Activity.AddContentView(emptyView, View.LayoutParameters);
|
||||
|
||||
InitialiseSearchService();
|
||||
}
|
||||
|
||||
public override void OnDestroy()
|
||||
{
|
||||
if (isEmpty)
|
||||
{
|
||||
ViewGroup rootView = Activity.FindViewById<ViewGroup>(Android.Resource.Id.Content);
|
||||
rootView.RemoveView(emptyView);
|
||||
}
|
||||
base.OnDestroy();
|
||||
instance = null;
|
||||
MainActivity.instance.RemoveSearchService(2);
|
||||
}
|
||||
|
||||
private void InitialiseSearchService()
|
||||
{
|
||||
MainActivity.instance.CreateSearch(2);
|
||||
}
|
||||
|
||||
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
View view = base.OnCreateView(inflater, container, savedInstanceState);
|
||||
view.SetPadding(0, 100, 0, 0);
|
||||
return view;
|
||||
}
|
||||
|
||||
public static Fragment NewInstance()
|
||||
{
|
||||
instance = new DownloadList { Arguments = new Bundle() };
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void Search(string search)
|
||||
{
|
||||
if(search == null || search == "")
|
||||
{
|
||||
if(!isEmpty)
|
||||
Activity.AddContentView(emptyView, View.LayoutParameters);
|
||||
return;
|
||||
}
|
||||
if (!isEmpty)
|
||||
{
|
||||
ViewGroup rootView = Activity.FindViewById<ViewGroup>(Android.Resource.Id.Content);
|
||||
rootView.RemoveView(emptyView);
|
||||
isEmpty = false;
|
||||
}
|
||||
|
||||
list.Clear();
|
||||
var items = new VideoSearch();
|
||||
|
||||
foreach(var item in items.SearchQuery(search, 1))
|
||||
{
|
||||
new YTitemToSong(item, out Song song);
|
||||
list.Add(song);
|
||||
}
|
||||
|
||||
ListAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, list);
|
||||
}
|
||||
|
||||
private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
||||
{
|
||||
Toast.MakeText(Android.App.Application.Context, "Play: comming soon", ToastLength.Short).Show();
|
||||
|
||||
}
|
||||
|
||||
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
|
||||
{
|
||||
ISharedPreferences prefManager = PreferenceManager.GetDefaultSharedPreferences(Android.App.Application.Context);
|
||||
if(prefManager.GetString("downloadPath", null) != null)
|
||||
{
|
||||
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
||||
DownloadAudio(list[e.Position], prefManager.GetString("downloadPath", null));
|
||||
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
||||
}
|
||||
else
|
||||
{
|
||||
Toast.MakeText(Android.App.Application.Context, "Download path not set", ToastLength.Short).Show();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//ContentResolver resolver = Activity.ContentResolver;
|
||||
//ContentValues value = new ContentValues();
|
||||
//value.Put(MediaStore.Audio.Media.InterfaceConsts.Title, title);
|
||||
//value.Put(MediaStore.Audio.Media.InterfaceConsts.Artist, artist);
|
||||
//value.Put(MediaStore.Audio.Media.InterfaceConsts.Album, album);
|
||||
//value.Put(MediaStore.Audio.Media.InterfaceConsts.Data, path);
|
||||
//resolver.Insert(MediaStore.Audio.Media.ExternalContentUri, value);
|
||||
}
|
||||
|
||||
private async Task DownloadAudio(Song song, string path)
|
||||
{
|
||||
Console.WriteLine("Download Started");
|
||||
string videoID = song.GetPath().Remove(0, song.GetPath().IndexOf("=") + 1);
|
||||
|
||||
var client = new YoutubeClient();
|
||||
var videoInfo = await client.GetVideoInfoAsync(videoID);
|
||||
|
||||
Toast.MakeText(Android.App.Application.Context, "Dowloading: " + videoInfo.Title, ToastLength.Short).Show();
|
||||
|
||||
|
||||
// Select the highest quality mixed stream
|
||||
// (can also use VideoStreams or AudioStreams, if needed)
|
||||
var streamInfo = videoInfo.AudioStreams.OrderBy(s => s.Bitrate).Last();
|
||||
|
||||
Console.WriteLine("Document: " + path);
|
||||
|
||||
// Download it to file
|
||||
string fileExtension = streamInfo.Container.GetFileExtension();
|
||||
string fileName = $"{videoInfo.Title}.{fileExtension}";
|
||||
|
||||
string filePath = Path.Combine(path, fileName);
|
||||
Console.WriteLine("Path: " + filePath);
|
||||
|
||||
var input = await client.GetMediaStreamAsync(streamInfo);
|
||||
Console.WriteLine("Input done");
|
||||
|
||||
var output = File.Create(filePath);
|
||||
Console.WriteLine("File created");
|
||||
await input.CopyToAsync(output);
|
||||
output.Dispose();
|
||||
|
||||
Toast.MakeText(Android.App.Application.Context, "Download finish: " + videoInfo.Title, ToastLength.Long).Show();
|
||||
|
||||
/*It's working, actualy download .webm file to the good path but .webm is a video file. Downloading only audio but do not convert to a mp3 file
|
||||
*Check for a converter add on or check if this downloader can convert to a mp3 file
|
||||
*Add a progress bar
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
72
MusicApp/Resources/Portable Class/FolderAdapter.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Runtime;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using MusicApp.Resources.values;
|
||||
using Android.Graphics;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
public class FolderAdapter : ArrayAdapter
|
||||
{
|
||||
public int selectedPosition;
|
||||
|
||||
private Context context;
|
||||
private List<Folder> folders;
|
||||
private LayoutInflater inflater;
|
||||
private int resource;
|
||||
|
||||
|
||||
public FolderAdapter(Context context, int resource, List<Folder> folders) : base(context, resource, folders)
|
||||
{
|
||||
this.context = context;
|
||||
this.resource = resource;
|
||||
this.folders = folders;
|
||||
}
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent)
|
||||
{
|
||||
if (inflater == null)
|
||||
{
|
||||
inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
|
||||
}
|
||||
if (convertView == null)
|
||||
{
|
||||
convertView = inflater.Inflate(resource, parent, false);
|
||||
}
|
||||
FolderHolder holder = new FolderHolder(convertView)
|
||||
{
|
||||
Name = { Text = folders[position].name },
|
||||
};
|
||||
|
||||
holder.expandChild.Visibility = ViewStates.Visible;
|
||||
|
||||
if (!folders[position].asChild)
|
||||
holder.expandChild.Visibility = ViewStates.Invisible;
|
||||
|
||||
if(folders[position].isExtended)
|
||||
holder.expandChild.SetImageResource(Resource.Drawable.ic_expand_less_black_24dp);
|
||||
else
|
||||
holder.expandChild.SetImageResource(Resource.Drawable.ic_expand_more_black_24dp);
|
||||
|
||||
convertView.FindViewById<RelativeLayout>(Resource.Id.folderList).SetPadding(folders[position].Padding, 0, 0, 0);
|
||||
|
||||
holder.used.SetTag(Resource.Id.folderUsed, folders[position].uri);
|
||||
holder.used.Click += Preferences.instance.Used_Click;
|
||||
|
||||
holder.used.Checked = position == selectedPosition;
|
||||
holder.used.SetTag(Resource.Id.folderName, position);
|
||||
|
||||
convertView.SetBackgroundColor(Color.White);
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
}
|
||||