diff --git a/.gitignore b/.gitignore index b06e864..99a0670 100644 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,6 @@ FakesAssemblies/ GeneratedArtifacts/ _Pvt_Extensions/ ModelManifest.xml +/AnimateRaw/BundleArtifacts +/AnimateRaw/_language-zh-hans.appx +/AnimateRaw.Shared/XamarinInsights.cs diff --git a/AnimateRaw.Android/Activity/AboutActivity.cs b/AnimateRaw.Android/Activity/AboutActivity.cs index ea1205b..fbcc0e2 100644 --- a/AnimateRaw.Android/Activity/AboutActivity.cs +++ b/AnimateRaw.Android/Activity/AboutActivity.cs @@ -10,10 +10,11 @@ using Android.Views; using Android.Widget; using Android.Support.V7.App; +using AnimateRaw.Android.Common.Helpers; namespace AnimateRaw.Android.Activity { - [Activity(Label = "About")] + [Activity(Label = "About", Theme = "@style/AppTheme.NoActionBar")] public class AboutActivity : AppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) @@ -21,6 +22,7 @@ protected override void OnCreate(Bundle savedInstanceState) base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.AboutPage); var toolbar = FindViewById(Resource.Id.AboutToolbar); + ((LinearLayout.LayoutParams)toolbar.LayoutParameters).SetMargins(0, StatusBarHelper.GetStatusBarHeight(this), 0, 0); SetSupportActionBar(toolbar); SupportActionBar.Title = "About"; } diff --git a/AnimateRaw.Android/Activity/DetailActivity.cs b/AnimateRaw.Android/Activity/DetailActivity.cs index 0e51ae2..8c325b5 100644 --- a/AnimateRaw.Android/Activity/DetailActivity.cs +++ b/AnimateRaw.Android/Activity/DetailActivity.cs @@ -14,10 +14,12 @@ using Android.Support.V7.Widget; using Android.Support.V7.App; using Android.Util; +using AnimateRaw.Shared; +using AnimateRaw.Android.Common.Helpers; namespace AnimateRaw.Android { - [Activity(Label = "Detail")] + [Activity(Label = "Detail", Theme = "@style/AppTheme.NoActionBar")] public class DetailActivity : AppCompatActivity { private double _id; @@ -32,6 +34,7 @@ protected override async void OnCreate(Bundle savedInstanceState) _id = Intent.Extras.GetDouble("id"); SetContentView(Resource.Layout.MainPage); var toolbar = FindViewById(Resource.Id.toolbar); + ((LinearLayout.LayoutParams)toolbar.LayoutParameters).SetMargins(0, StatusBarHelper.GetStatusBarHeight(this), 0, 0); SetSupportActionBar(toolbar); SupportActionBar.Title = _name; _exRecyclerView = FindViewById(Resource.Id.MainPageRecyclerView); @@ -43,23 +46,18 @@ protected override async void OnCreate(Bundle savedInstanceState) _exRecyclerView.ViewLayoutManager = new GridLayoutManager(this, heightm > widthm ? 2 : 3); _refresher = FindViewById(Resource.Id.MainPageRefresher); _refresher.SetColorSchemeResources(Resource.Color.MediumVioletRed); - _refresher.Refresh += refresher_Refresh; + _refresher.Refresh += async delegate { await Refresh(); }; _refresher.Post(() => _refresher.Refreshing = true); await Refresh(); } - - private async void refresher_Refresh(object sender, EventArgs e) - { - await Refresh(); - } - + private async Task Refresh() { try { using (var client = new HttpClient()) { - var jsstr = await client.GetStringAsync($"http://oneechan.moe/api/detail?id={_id}"); + var jsstr = await client.GetStringAsync($"http://oneechan.moe/api/detail?id={_id}&prefLang={LanguageHelper.PrefLang}"); var list = (from item in (JArray)((JObject)JsonConvert.DeserializeObject(jsstr))["SetList"] select new AnimateSetModel { @@ -87,7 +85,7 @@ private void Ada_ItemClick(object sender, int e) try { using (var client = new HttpClient()) - client.GetStringAsync($"http://oneechan.moe/api/detail?id={_id}&filename={item.FileName}"); + client.GetStringAsync($"http://oneechan.moe/api/detail?id={_id}&filename={item.FileName}&prefLang={LanguageHelper.PrefLang}"); } catch { diff --git a/AnimateRaw.Android/Activity/MainActivity.cs b/AnimateRaw.Android/Activity/MainActivity.cs index fafd094..21eea14 100644 --- a/AnimateRaw.Android/Activity/MainActivity.cs +++ b/AnimateRaw.Android/Activity/MainActivity.cs @@ -19,10 +19,13 @@ using Android.Support.V7.Widget; using Android.Support.V7.App; using AnimateRaw.Android.Activity; +using Java.Util; +using AnimateRaw.Shared; +using AnimateRaw.Android.Common.Helpers; namespace AnimateRaw.Android { - [Activity(Label = "Animate Raw", MainLauncher = true, Icon = "@drawable/icon")] + [Activity(Label = "Animate Raw", MainLauncher = true, Icon = "@drawable/icon", Theme = "@style/AppTheme.NoActionBar")] public class MainActivity : AppCompatActivity { private ExRecyclerView _recyclerView; @@ -31,6 +34,7 @@ public class MainActivity : AppCompatActivity private int _page = 0; private bool _hasMore = true; private LinearLayoutManager _layoutManager; + private string _serverLink => $"http://oneechan.moe/api/list?page={_page++}&prefLang={LanguageHelper.PrefLang}"; protected override async void OnCreate(Bundle bundle) { @@ -40,19 +44,19 @@ protected override async void OnCreate(Bundle bundle) base.OnCreate(bundle); SetContentView(Resource.Layout.MainPage); var toolbar = FindViewById(Resource.Id.toolbar); + ((LinearLayout.LayoutParams)toolbar.LayoutParameters).SetMargins(0, StatusBarHelper.GetStatusBarHeight(this), 0, 0); SetSupportActionBar(toolbar); SupportActionBar.Title = "Animate Raw"; _recyclerView = FindViewById(Resource.Id.MainPageRecyclerView); - _recyclerView.OnScroll += recyclerView_OnScroll; _layoutManager = new LinearLayoutManager(this); _recyclerView.ViewLayoutManager = _layoutManager; + _recyclerView.LoadMore += (sender, e) => LoadMore(); _refresher = FindViewById(Resource.Id.MainPageRefresher); _refresher.SetColorSchemeResources(Resource.Color.MediumVioletRed); - _refresher.Refresh += refresher_Refresh; + _refresher.Refresh += async delegate { await Refresh(); }; _refresher.Post(() => _refresher.Refreshing = true); await Refresh(); } - public override bool OnOptionsItemSelected(IMenuItem item) { switch (item.ItemId) @@ -63,27 +67,8 @@ public override bool OnOptionsItemSelected(IMenuItem item) default: break; } - return base.OnOptionsItemSelected(item); } - private void recyclerView_OnScroll(object sender, OnScrollEventArgs e) - { - if (e.dy > 0) - { - var visibleItemCount = _layoutManager.ChildCount; - var totalItemCount = _layoutManager.ItemCount; - var pastVisiblesItems = _layoutManager.FindFirstVisibleItemPosition(); - - if (!_isLoading) - { - if ((visibleItemCount + pastVisiblesItems) >= totalItemCount - 3) - { - _isLoading = true; - LoadMore(); - } - } - } - } public override bool OnCreateOptionsMenu(IMenu menu) { @@ -93,9 +78,12 @@ public override bool OnCreateOptionsMenu(IMenu menu) private async void LoadMore() { + if (_isLoading) + return; + _isLoading = true; using (var client = new HttpClient()) { - var jsstr = await client.GetStringAsync($"http://oneechan.moe/api/list?page={_page++}"); + var jsstr = await client.GetStringAsync(_serverLink); var obj = (JObject)JsonConvert.DeserializeObject(jsstr); _hasMore = (bool)obj["HasMore"]; var list = (from item in (JArray)obj["List"] @@ -109,12 +97,6 @@ private async void LoadMore() _isLoading = false; } } - - - private async void refresher_Refresh(object sender, EventArgs e) - { - await Refresh(); - } private async System.Threading.Tasks.Task Refresh() { @@ -123,7 +105,7 @@ private async System.Threading.Tasks.Task Refresh() using (var client = new HttpClient()) { _page = 0; - var jsstr = await client.GetStringAsync($"http://oneechan.moe/api/list?page={_page++}"); + var jsstr = await client.GetStringAsync(_serverLink); var obj = (JObject)JsonConvert.DeserializeObject(jsstr); _hasMore = (bool)obj["HasMore"]; var list = (from item in (JArray)obj["List"] diff --git a/AnimateRaw.Android/Adapter/DetailListAdapter.cs b/AnimateRaw.Android/Adapter/DetailListAdapter.cs index b5af10b..223e736 100644 --- a/AnimateRaw.Android/Adapter/DetailListAdapter.cs +++ b/AnimateRaw.Android/Adapter/DetailListAdapter.cs @@ -21,32 +21,26 @@ namespace AnimateRaw.Android.Adapter public class DetailListAdapter : RecyclerView.Adapter { public event EventHandler ItemClick; - public List Items { get; private set; } + public List Items { get; } public DetailListAdapter(List items) : base() { Items = items; } - public override long GetItemId(int position) - { - return position; - } + public override long GetItemId(int position) => position; public override int ItemCount => Items.Count; public override async void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { - DetailViewHolder vh = holder as DetailViewHolder; - vh.Name.Text = Items[position].FileName; - vh.ClickCount.Text = $"Click Count:{Items[position].ClickCount}"; + var vh = holder as ViewHolderBase; + vh.SetText(Resource.Id.DetailListLayoutName,Items[position].FileName).SetText(Resource.Id.DetailListLayoutClickCount, $"Click Count:{Items[position].ClickCount}"); if (string.IsNullOrEmpty(Items[position].FileThumb)) { - vh.Image.SetBackgroundColor(Color.MediumVioletRed); - vh.Image.SetImageResource(Resource.Drawable.SplashScreen); + vh.SetBackgroundColor(Resource.Id.DetailListImage, Color.MediumVioletRed).SetImageResource(Resource.Id.DetailListImage, Resource.Drawable.SplashScreen); } else { - - vh.Image.SetImageBitmap(await GetImageBitmapFromUrl(Items[position].FileThumb)); + vh.SetImageBitmap(Resource.Id.DetailListImage, await GetImageBitmapFromUrl(Items[position].FileThumb)); } } private async System.Threading.Tasks.Task GetImageBitmapFromUrl(string url) @@ -74,7 +68,7 @@ public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int { View itemView = LayoutInflater.From(parent.Context). Inflate(Resource.Layout.DetailListLayout, parent, false); - DetailViewHolder vh = new DetailViewHolder(itemView); + var vh = new ViewHolderBase(itemView, Resource.Id.DetailListLayoutName, Resource.Id.DetailListLayoutClickCount, Resource.Id.DetailListImage); itemView.Click += (s, e) => ItemClick?.Invoke(s, vh.LayoutPosition); return vh; } diff --git a/AnimateRaw.Android/Adapter/MainListAdapter.cs b/AnimateRaw.Android/Adapter/MainListAdapter.cs index 459d8a9..11d4e15 100644 --- a/AnimateRaw.Android/Adapter/MainListAdapter.cs +++ b/AnimateRaw.Android/Adapter/MainListAdapter.cs @@ -12,6 +12,7 @@ using AnimateRaw.Shared.Model; using System.Collections.ObjectModel; using Android.Support.V7.Widget; +using AnimateRaw.Android.ViewHolder; namespace AnimateRaw.Android.Adapter { @@ -52,16 +53,14 @@ private string GetUpdate(TimeSpan time) public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { - MainViewHolder vh = holder as MainViewHolder; - vh.Name.Text = Items[position].Name; - vh.UpdateTime.Text = GetUpdate(Items[position].LastUpdate); + (holder as ViewHolderBase).SetText(Resource.Id.MainListLayoutName, Items[position].Name).SetText(Resource.Id.MainListLayoutUpdateTime, GetUpdate(Items[position].LastUpdate)); } public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.From(parent.Context). Inflate(Resource.Layout.MainListLayout, parent, false); - MainViewHolder vh = new MainViewHolder(itemView); + var vh = new ViewHolderBase(itemView, Resource.Id.MainListLayoutName, Resource.Id.MainListLayoutUpdateTime); itemView.Click += (s, e) => ItemClick?.Invoke(s, vh.LayoutPosition); return vh; } diff --git a/AnimateRaw.Android/AnimateRaw.Android.csproj b/AnimateRaw.Android/AnimateRaw.Android.csproj index 4254f0b..6df16e0 100644 --- a/AnimateRaw.Android/AnimateRaw.Android.csproj +++ b/AnimateRaw.Android/AnimateRaw.Android.csproj @@ -17,6 +17,8 @@ v6.0 Properties\AndroidManifest.xml 482c5e28d8c914da1e468a8e58a6b12f5d6c45f8 + + true @@ -41,6 +43,10 @@ + + ..\packages\Newtonsoft.Json.8.0.3\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll + True + @@ -48,21 +54,21 @@ - - ..\packages\Xamarin.Android.Support.v4.23.1.1.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll + + ..\packages\Xamarin.Android.Support.v4.23.1.1.1\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll + True - ..\packages\Xamarin.Android.Support.v7.AppCompat.23.1.1.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll + ..\packages\Xamarin.Android.Support.v7.AppCompat.23.1.1.1\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll True - - ..\packages\Xamarin.Android.Support.v7.RecyclerView.23.1.1.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll - - - ..\packages\Xamarin.Insights.1.11.3\lib\MonoAndroid10\Xamarin.Insights.dll + + ..\packages\Xamarin.Android.Support.v7.RecyclerView.23.1.1.1\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll + True - - ..\packages\Newtonsoft.Json.8.0.2\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll + + ..\packages\Xamarin.Insights.1.12.2\lib\MonoAndroid10\Xamarin.Insights.dll + True @@ -70,18 +76,18 @@ - + + - + - AndroidResource @@ -105,7 +111,9 @@ - + + Designer + @@ -118,9 +126,18 @@ + + + - + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + @color/colorPrimary + @color/colorPrimaryDark + @color/colorAccent + true + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -