feature: option page - set proxy
This commit is contained in:
parent
f42705d1d2
commit
bdee786f3a
@ -81,6 +81,7 @@
|
|||||||
<Compile Include="Renderers\AppShellSection\AppShellSectionRootHeader.cs" />
|
<Compile Include="Renderers\AppShellSection\AppShellSectionRootHeader.cs" />
|
||||||
<Compile Include="Renderers\SegmentedControlRenderer.cs" />
|
<Compile Include="Renderers\SegmentedControlRenderer.cs" />
|
||||||
<Compile Include="Effects\LongPressEffectImplement.cs" />
|
<Compile Include="Effects\LongPressEffectImplement.cs" />
|
||||||
|
<Compile Include="Renderers\OptionEntryRenderer.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<InterfaceDefinition Include="Resources\LaunchScreen.storyboard" />
|
<InterfaceDefinition Include="Resources\LaunchScreen.storyboard" />
|
||||||
|
23
Pixiview.iOS/Renderers/OptionEntryRenderer.cs
Normal file
23
Pixiview.iOS/Renderers/OptionEntryRenderer.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using Pixiview.iOS.Renderers;
|
||||||
|
using Pixiview.UI;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
using Xamarin.Forms.Platform.iOS;
|
||||||
|
|
||||||
|
[assembly: ExportRenderer(typeof(OptionEntry), typeof(OptionEntryRenderer))]
|
||||||
|
namespace Pixiview.iOS.Renderers
|
||||||
|
{
|
||||||
|
public class OptionEntryRenderer : EntryRenderer
|
||||||
|
{
|
||||||
|
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
|
||||||
|
{
|
||||||
|
base.OnElementChanged(e);
|
||||||
|
|
||||||
|
var control = Control;
|
||||||
|
if (control != null)
|
||||||
|
{
|
||||||
|
control.BorderStyle = UIKit.UITextBorderStyle.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -36,6 +36,29 @@ namespace Pixiview
|
|||||||
SetTheme(theme, true);
|
SetTheme(theme, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InitPreferences()
|
||||||
|
{
|
||||||
|
var isProxied = Preferences.Get(Configs.IsProxiedKey, false);
|
||||||
|
if (isProxied)
|
||||||
|
{
|
||||||
|
var host = Preferences.Get(Configs.HostKey, string.Empty);
|
||||||
|
int port = Preferences.Get(Configs.PortKey, 0);
|
||||||
|
if (!string.IsNullOrEmpty(host) && port > 0)
|
||||||
|
{
|
||||||
|
Configs.Proxy = new System.Net.WebProxy(host, port);
|
||||||
|
DebugPrint($"load proxy: {host}:{port}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Configs.Proxy = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Configs.Proxy = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void InitLanguage(IEnvironmentService service)
|
private void InitLanguage(IEnvironmentService service)
|
||||||
{
|
{
|
||||||
var ci = service.GetCurrentCultureInfo();
|
var ci = service.GetCurrentCultureInfo();
|
||||||
@ -76,6 +99,7 @@ namespace Pixiview
|
|||||||
MainPage = new AppShell();
|
MainPage = new AppShell();
|
||||||
|
|
||||||
InitResources(service);
|
InitResources(service);
|
||||||
|
InitPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnSleep()
|
protected override void OnSleep()
|
||||||
|
@ -4,9 +4,22 @@
|
|||||||
xmlns:u="clr-namespace:Pixiview.UI"
|
xmlns:u="clr-namespace:Pixiview.UI"
|
||||||
xmlns:r="clr-namespace:Pixiview.Resources"
|
xmlns:r="clr-namespace:Pixiview.Resources"
|
||||||
x:Class="Pixiview.OptionPage"
|
x:Class="Pixiview.OptionPage"
|
||||||
BackgroundColor="{DynamicResource WindowColor}"
|
|
||||||
Title="{r:Text Option}">
|
Title="{r:Text Option}">
|
||||||
<ContentPage.Content>
|
<TableView Intent="Settings" VerticalOptions="Start"
|
||||||
<Label Text="Option" Margin="20"/>
|
BackgroundColor="{DynamicResource NavColor}">
|
||||||
</ContentPage.Content>
|
<TableRoot>
|
||||||
|
<TableSection Title="{r:Text Proxy}">
|
||||||
|
<u:OptionSwitchCell Title="{r:Text Enabled}"
|
||||||
|
IsToggled="{Binding IsProxied, Mode=TwoWay}"/>
|
||||||
|
</TableSection>
|
||||||
|
<TableSection Title="{r:Text Detail}">
|
||||||
|
<u:OptionEntryCell Title="{r:Text Host}"
|
||||||
|
Text="{Binding Host, Mode=TwoWay}"
|
||||||
|
Keyboard="Url" Placeholder="www.example.com"/>
|
||||||
|
<u:OptionEntryCell Title="{r:Text Port}"
|
||||||
|
Text="{Binding Port, Mode=TwoWay}"
|
||||||
|
Keyboard="Numeric" Placeholder="8080"/>
|
||||||
|
</TableSection>
|
||||||
|
</TableRoot>
|
||||||
|
</TableView>
|
||||||
</u:AdaptedPage>
|
</u:AdaptedPage>
|
||||||
|
@ -1,12 +1,79 @@
|
|||||||
using Pixiview.UI;
|
using Pixiview.UI;
|
||||||
|
using Pixiview.Utils;
|
||||||
|
using Xamarin.Essentials;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Pixiview
|
namespace Pixiview
|
||||||
{
|
{
|
||||||
public partial class OptionPage : AdaptedPage
|
public partial class OptionPage : AdaptedPage
|
||||||
{
|
{
|
||||||
|
public static readonly BindableProperty IsProxiedProperty = BindableProperty.Create(
|
||||||
|
nameof(IsProxied), typeof(bool), typeof(OptionPage));
|
||||||
|
public static readonly BindableProperty HostProperty = BindableProperty.Create(
|
||||||
|
nameof(Host), typeof(string), typeof(OptionPage));
|
||||||
|
public static readonly BindableProperty PortProperty = BindableProperty.Create(
|
||||||
|
nameof(Port), typeof(string), typeof(OptionPage));
|
||||||
|
|
||||||
|
public bool IsProxied
|
||||||
|
{
|
||||||
|
get => (bool)GetValue(IsProxiedProperty);
|
||||||
|
set => SetValue(IsProxiedProperty, value);
|
||||||
|
}
|
||||||
|
public string Host
|
||||||
|
{
|
||||||
|
get => (string)GetValue(HostProperty);
|
||||||
|
set => SetValue(HostProperty, value);
|
||||||
|
}
|
||||||
|
public string Port
|
||||||
|
{
|
||||||
|
get => (string)GetValue(PortProperty);
|
||||||
|
set => SetValue(PortProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
public OptionPage()
|
public OptionPage()
|
||||||
{
|
{
|
||||||
|
BindingContext = this;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnAppearing()
|
||||||
|
{
|
||||||
|
base.OnAppearing();
|
||||||
|
|
||||||
|
IsProxied = Preferences.Get(Configs.IsProxiedKey, false);
|
||||||
|
Host = Preferences.Get(Configs.HostKey, string.Empty);
|
||||||
|
int pt = Preferences.Get(Configs.PortKey, 0);
|
||||||
|
if (pt > 0)
|
||||||
|
{
|
||||||
|
Port = pt.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDisappearing()
|
||||||
|
{
|
||||||
|
base.OnDisappearing();
|
||||||
|
|
||||||
|
var proxied = IsProxied;
|
||||||
|
var h = Host?.Trim();
|
||||||
|
|
||||||
|
Preferences.Set(Configs.IsProxiedKey, proxied);
|
||||||
|
Preferences.Set(Configs.HostKey, h);
|
||||||
|
var p = Port;
|
||||||
|
if (int.TryParse(p, out int pt) && pt > 0)
|
||||||
|
{
|
||||||
|
Preferences.Set(Configs.PortKey, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (proxied && !string.IsNullOrEmpty(h) && pt > 0)
|
||||||
|
{
|
||||||
|
Configs.Proxy = new System.Net.WebProxy(h, pt);
|
||||||
|
App.DebugPrint($"set proxy to: {h}:{pt}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Configs.Proxy = null;
|
||||||
|
App.DebugPrint($"clear proxy");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,11 @@
|
|||||||
<Cancel>取消</Cancel>
|
<Cancel>取消</Cancel>
|
||||||
<Yes>是</Yes>
|
<Yes>是</Yes>
|
||||||
<No>否</No>
|
<No>否</No>
|
||||||
|
<Proxy>代理</Proxy>
|
||||||
|
<Detail>详细</Detail>
|
||||||
|
<Enabled>启用</Enabled>
|
||||||
|
<Host>主机</Host>
|
||||||
|
<Port>端口</Port>
|
||||||
<R18>R-18</R18>
|
<R18>R-18</R18>
|
||||||
<Follow>已关注</Follow>
|
<Follow>已关注</Follow>
|
||||||
<Recommends>推荐</Recommends>
|
<Recommends>推荐</Recommends>
|
||||||
|
106
Pixiview/UI/OptionCell.cs
Normal file
106
Pixiview/UI/OptionCell.cs
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
using Pixiview.UI.Theme;
|
||||||
|
using Pixiview.Utils;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Pixiview.UI
|
||||||
|
{
|
||||||
|
public class OptionEntry : Entry { }
|
||||||
|
|
||||||
|
public abstract class OptionCell : ViewCell
|
||||||
|
{
|
||||||
|
public static readonly BindableProperty TitleProperty = BindableProperty.Create(
|
||||||
|
nameof(Title), typeof(string), typeof(OptionCell));
|
||||||
|
|
||||||
|
public string Title
|
||||||
|
{
|
||||||
|
get => (string)GetValue(TitleProperty);
|
||||||
|
set => SetValue(TitleProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract View Content { get; }
|
||||||
|
|
||||||
|
public OptionCell()
|
||||||
|
{
|
||||||
|
View = new Grid
|
||||||
|
{
|
||||||
|
BindingContext = this,
|
||||||
|
Padding = new Thickness(20, 0),
|
||||||
|
ColumnDefinitions =
|
||||||
|
{
|
||||||
|
new ColumnDefinition { Width = new GridLength(.2, GridUnitType.Star) },
|
||||||
|
new ColumnDefinition { Width = new GridLength(.8, GridUnitType.Star) }
|
||||||
|
},
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
new Label
|
||||||
|
{
|
||||||
|
LineBreakMode = LineBreakMode.TailTruncation,
|
||||||
|
VerticalOptions = LayoutOptions.Center
|
||||||
|
}
|
||||||
|
.Binding(Label.TextProperty, nameof(Title))
|
||||||
|
.DynamicResource(Label.TextColorProperty, ThemeBase.TextColor),
|
||||||
|
|
||||||
|
Content.GridColumn(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.DynamicResource(VisualElement.BackgroundColorProperty, ThemeBase.OptionTintColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionSwitchCell : OptionCell
|
||||||
|
{
|
||||||
|
public static readonly BindableProperty IsToggledProperty = BindableProperty.Create(
|
||||||
|
nameof(IsToggled), typeof(bool), typeof(OptionSwitchCell));
|
||||||
|
|
||||||
|
public bool IsToggled
|
||||||
|
{
|
||||||
|
get => (bool)GetValue(IsToggledProperty);
|
||||||
|
set => SetValue(IsToggledProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override View Content => new Switch
|
||||||
|
{
|
||||||
|
HorizontalOptions = LayoutOptions.End,
|
||||||
|
VerticalOptions = LayoutOptions.Center
|
||||||
|
}.Binding(Switch.IsToggledProperty, nameof(IsToggled), BindingMode.TwoWay);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionEntryCell : OptionCell
|
||||||
|
{
|
||||||
|
public static readonly BindableProperty TextProperty = BindableProperty.Create(
|
||||||
|
nameof(Text), typeof(string), typeof(OptionSwitchCell));
|
||||||
|
public static readonly BindableProperty KeyboardProperty = BindableProperty.Create(
|
||||||
|
nameof(Keyboard), typeof(Keyboard), typeof(OptionSwitchCell));
|
||||||
|
public static readonly BindableProperty PlaceholderProperty = BindableProperty.Create(
|
||||||
|
nameof(Placeholder), typeof(string), typeof(OptionSwitchCell));
|
||||||
|
|
||||||
|
public string Text
|
||||||
|
{
|
||||||
|
get => (string)GetValue(TextProperty);
|
||||||
|
set => SetValue(TextProperty, value);
|
||||||
|
}
|
||||||
|
public Keyboard Keyboard
|
||||||
|
{
|
||||||
|
get => (Keyboard)GetValue(KeyboardProperty);
|
||||||
|
set => SetValue(KeyboardProperty, value);
|
||||||
|
}
|
||||||
|
public string Placeholder
|
||||||
|
{
|
||||||
|
get => (string)GetValue(PlaceholderProperty);
|
||||||
|
set => SetValue(PlaceholderProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override View Content => new OptionEntry
|
||||||
|
{
|
||||||
|
HorizontalOptions = LayoutOptions.Fill,
|
||||||
|
HorizontalTextAlignment = TextAlignment.End,
|
||||||
|
VerticalOptions = LayoutOptions.Center,
|
||||||
|
ReturnType = ReturnType.Next
|
||||||
|
}
|
||||||
|
.Binding(Entry.TextProperty, nameof(Text), BindingMode.TwoWay)
|
||||||
|
.Binding(InputView.KeyboardProperty, nameof(Keyboard))
|
||||||
|
.Binding(Entry.PlaceholderProperty, nameof(Placeholder))
|
||||||
|
.DynamicResource(Entry.TextColorProperty, ThemeBase.TextColor)
|
||||||
|
.DynamicResource(VisualElement.BackgroundColorProperty, ThemeBase.OptionTintColor);
|
||||||
|
}
|
||||||
|
}
|
@ -36,6 +36,7 @@ namespace Pixiview.UI.Theme
|
|||||||
Add(MaskColor, Color.FromRgba(0xff, 0xff, 0xff, 0x50));
|
Add(MaskColor, Color.FromRgba(0xff, 0xff, 0xff, 0x50));
|
||||||
Add(NavColor, Color.Black);
|
Add(NavColor, Color.Black);
|
||||||
Add(NavSelectedColor, Color.FromRgb(0x22, 0x22, 0x22));
|
Add(NavSelectedColor, Color.FromRgb(0x22, 0x22, 0x22));
|
||||||
|
Add(OptionTintColor, Color.FromRgb(0x11, 0x11, 0x11));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ namespace Pixiview.UI.Theme
|
|||||||
Add(MaskColor, Color.FromRgba(0, 0, 0, 0x50));
|
Add(MaskColor, Color.FromRgba(0, 0, 0, 0x50));
|
||||||
Add(NavColor, Color.FromRgb(0xf0, 0xf0, 0xf0));
|
Add(NavColor, Color.FromRgb(0xf0, 0xf0, 0xf0));
|
||||||
Add(NavSelectedColor, Color.LightGray);
|
Add(NavSelectedColor, Color.LightGray);
|
||||||
|
Add(OptionTintColor, Color.White);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ namespace Pixiview.UI.Theme
|
|||||||
public const string MaskColor = nameof(MaskColor);
|
public const string MaskColor = nameof(MaskColor);
|
||||||
public const string NavColor = nameof(NavColor);
|
public const string NavColor = nameof(NavColor);
|
||||||
public const string NavSelectedColor = nameof(NavSelectedColor);
|
public const string NavSelectedColor = nameof(NavSelectedColor);
|
||||||
|
public const string OptionTintColor = nameof(OptionTintColor);
|
||||||
|
|
||||||
public const string IconLightFontFamily = nameof(IconLightFontFamily);
|
public const string IconLightFontFamily = nameof(IconLightFontFamily);
|
||||||
public const string IconRegularFontFamily = nameof(IconRegularFontFamily);
|
public const string IconRegularFontFamily = nameof(IconRegularFontFamily);
|
||||||
|
@ -4,15 +4,15 @@ namespace Pixiview.Utils
|
|||||||
{
|
{
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
public static T Binding<T>(this T view, BindableProperty property, string name) where T : BindableObject
|
public static T Binding<T>(this T view, BindableProperty property, string name, BindingMode mode = BindingMode.Default) where T : BindableObject
|
||||||
{
|
{
|
||||||
if (name == null)
|
if (name == null)
|
||||||
{
|
{
|
||||||
view.SetValue(property, default(T));
|
view.SetValue(property, property.DefaultValue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
view.SetBinding(property, name);
|
view.SetBinding(property, name, mode);
|
||||||
}
|
}
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@ -28,6 +28,12 @@ namespace Pixiview.Utils
|
|||||||
Grid.SetRow(view, row);
|
Grid.SetRow(view, row);
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static T GridColumn<T>(this T view, int column) where T : BindableObject
|
||||||
|
{
|
||||||
|
Grid.SetColumn(view, column);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Screen
|
public static class Screen
|
||||||
|
@ -439,12 +439,16 @@ namespace Pixiview.Utils
|
|||||||
{
|
{
|
||||||
App.DebugPrint($"GET: {url}");
|
App.DebugPrint($"GET: {url}");
|
||||||
var uri = new Uri(url);
|
var uri = new Uri(url);
|
||||||
|
var proxy = Configs.Proxy;
|
||||||
var handler = new HttpClientHandler
|
var handler = new HttpClientHandler
|
||||||
{
|
{
|
||||||
Proxy = Configs.Proxy,
|
|
||||||
UseProxy = true,
|
|
||||||
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
||||||
};
|
};
|
||||||
|
if (proxy != null)
|
||||||
|
{
|
||||||
|
handler.Proxy = proxy;
|
||||||
|
handler.UseProxy = true;
|
||||||
|
}
|
||||||
var client = new HttpClient(handler)
|
var client = new HttpClient(handler)
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri($"{uri.Scheme}://{uri.Host}")
|
BaseAddress = new Uri($"{uri.Scheme}://{uri.Host}")
|
||||||
@ -468,7 +472,11 @@ namespace Pixiview.Utils
|
|||||||
|
|
||||||
public static class Configs
|
public static class Configs
|
||||||
{
|
{
|
||||||
public static readonly WebProxy Proxy = new WebProxy("router.tsanie.us", 8088);
|
public const string IsProxiedKey = "isProxied";
|
||||||
|
public const string HostKey = "host";
|
||||||
|
public const string PortKey = "port";
|
||||||
|
|
||||||
|
public static WebProxy Proxy;
|
||||||
|
|
||||||
public const int MaxThreads = 3;
|
public const int MaxThreads = 3;
|
||||||
public const string Referer = "https://www.pixiv.net/";
|
public const string Referer = "https://www.pixiv.net/";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user