first sync

This commit is contained in:
Gboy9155
2017-10-13 22:23:53 +02:00
parent dea9d91f74
commit b260a96406
150 changed files with 16668 additions and 0 deletions

File diff suppressed because one or more lines are too long

View 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 &amp; 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>&copy; <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>

View 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);

View 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;">&nbsp;</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);

View 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.

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

View 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"
};
}
}

View File

@@ -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()"; }
}
}
}

View File

@@ -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>

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}
}
}

View File

@@ -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>

View File

@@ -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)]

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -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>

View File

@@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"/>

View File

@@ -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>

View File

@@ -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"
/>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"/>

View File

@@ -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"
/>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="faux_action_bar_size">40dp</dimen>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="column_count">3</integer>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="faux_action_bar_size">56dp</dimen>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="column_count">4</integer>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="column_count">5</integer>
</resources>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="column_count">2</integer>
</resources>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"
/>

View File

@@ -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);
}
}
}

View File

@@ -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);
}
};
}
}
}

View File

@@ -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;
}
}
}
}

View File

@@ -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;
}
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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
View 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

View 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");

View File

@@ -0,0 +1,4 @@
<GettingStarted>
<LocalContent>GS\Android\CS\AndroidApp\GettingStarted.html</LocalContent>
<EmbeddedNavigation>false</EmbeddedNavigation>
</GettingStarted>

160
MusicApp/MainActivity.cs Normal file
View 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();
}
}
}

View 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
View 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>

View 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>

View 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")]

View 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.

View 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);
}
}
}

View 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);
}
}
}

View 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;
}
}
}

View 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);
}
}
}

View 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
*/
}
}
}

View 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;
}
}
}

Some files were not shown because too many files have changed in this diff Show More