chromecustomtab xamarin android MainActivity has leaked ServiceConnection...












0















I used chromecustomtab in my xamarin android project, i can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class.



and as i am not unbinding, it always throws me error of memory leak.



I am using Nuget - xamarin.Android.Support.CustomTabs version 26.1.0.1



code is as below



namespace Android.Support.CustomTabs
{
public class CustomTabsActivityManager
{
public CustomTabsActivityManager(Activity parentActivity);

public CustomTabsSession Session { get; }
public Activity ParentActivity { get; }
public CustomTabsClient Client { get; }

public event CustomTabsServiceDisconnectedDelegate CustomTabsServiceDisconnected;
public event CustomTabsServiceConnectedDelegate CustomTabsServiceConnected;
public event ExtraCallbackDelegate ExtraCallback;
public event NavigationEventDelegate NavigationEvent;

public static CustomTabsActivityManager From(Activity parentActivity, string servicePackageName = null);
public bool BindService(string servicePackageName = null);
public void LaunchUrl(string url, CustomTabsIntent customTabsIntent = null);
public bool MayLaunchUrl(string url, Bundle extras, List<string> otherLikelyUrls);
public bool Warmup(long flags = 0);

public class ExtraCallbackEventArgs
{
public ExtraCallbackEventArgs();

public string CallbackName { get; set; }
public Bundle Args { get; set; }
}

public delegate void NavigationEventDelegate(int navigationEvent, Bundle extras);
public delegate void ExtraCallbackDelegate(object sender, ExtraCallbackEventArgs e);
public delegate void CustomTabsServiceConnectedDelegate(ComponentName name, CustomTabsClient client);
public delegate void CustomTabsServiceDisconnectedDelegate(ComponentName name);
}









share|improve this question

























  • Could you please post more detailed codes?

    – York Shen
    Nov 26 '18 at 2:51
















0















I used chromecustomtab in my xamarin android project, i can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class.



and as i am not unbinding, it always throws me error of memory leak.



I am using Nuget - xamarin.Android.Support.CustomTabs version 26.1.0.1



code is as below



namespace Android.Support.CustomTabs
{
public class CustomTabsActivityManager
{
public CustomTabsActivityManager(Activity parentActivity);

public CustomTabsSession Session { get; }
public Activity ParentActivity { get; }
public CustomTabsClient Client { get; }

public event CustomTabsServiceDisconnectedDelegate CustomTabsServiceDisconnected;
public event CustomTabsServiceConnectedDelegate CustomTabsServiceConnected;
public event ExtraCallbackDelegate ExtraCallback;
public event NavigationEventDelegate NavigationEvent;

public static CustomTabsActivityManager From(Activity parentActivity, string servicePackageName = null);
public bool BindService(string servicePackageName = null);
public void LaunchUrl(string url, CustomTabsIntent customTabsIntent = null);
public bool MayLaunchUrl(string url, Bundle extras, List<string> otherLikelyUrls);
public bool Warmup(long flags = 0);

public class ExtraCallbackEventArgs
{
public ExtraCallbackEventArgs();

public string CallbackName { get; set; }
public Bundle Args { get; set; }
}

public delegate void NavigationEventDelegate(int navigationEvent, Bundle extras);
public delegate void ExtraCallbackDelegate(object sender, ExtraCallbackEventArgs e);
public delegate void CustomTabsServiceConnectedDelegate(ComponentName name, CustomTabsClient client);
public delegate void CustomTabsServiceDisconnectedDelegate(ComponentName name);
}









share|improve this question

























  • Could you please post more detailed codes?

    – York Shen
    Nov 26 '18 at 2:51














0












0








0








I used chromecustomtab in my xamarin android project, i can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class.



and as i am not unbinding, it always throws me error of memory leak.



I am using Nuget - xamarin.Android.Support.CustomTabs version 26.1.0.1



code is as below



namespace Android.Support.CustomTabs
{
public class CustomTabsActivityManager
{
public CustomTabsActivityManager(Activity parentActivity);

public CustomTabsSession Session { get; }
public Activity ParentActivity { get; }
public CustomTabsClient Client { get; }

public event CustomTabsServiceDisconnectedDelegate CustomTabsServiceDisconnected;
public event CustomTabsServiceConnectedDelegate CustomTabsServiceConnected;
public event ExtraCallbackDelegate ExtraCallback;
public event NavigationEventDelegate NavigationEvent;

public static CustomTabsActivityManager From(Activity parentActivity, string servicePackageName = null);
public bool BindService(string servicePackageName = null);
public void LaunchUrl(string url, CustomTabsIntent customTabsIntent = null);
public bool MayLaunchUrl(string url, Bundle extras, List<string> otherLikelyUrls);
public bool Warmup(long flags = 0);

public class ExtraCallbackEventArgs
{
public ExtraCallbackEventArgs();

public string CallbackName { get; set; }
public Bundle Args { get; set; }
}

public delegate void NavigationEventDelegate(int navigationEvent, Bundle extras);
public delegate void ExtraCallbackDelegate(object sender, ExtraCallbackEventArgs e);
public delegate void CustomTabsServiceConnectedDelegate(ComponentName name, CustomTabsClient client);
public delegate void CustomTabsServiceDisconnectedDelegate(ComponentName name);
}









share|improve this question
















I used chromecustomtab in my xamarin android project, i can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class.



and as i am not unbinding, it always throws me error of memory leak.



I am using Nuget - xamarin.Android.Support.CustomTabs version 26.1.0.1



code is as below



namespace Android.Support.CustomTabs
{
public class CustomTabsActivityManager
{
public CustomTabsActivityManager(Activity parentActivity);

public CustomTabsSession Session { get; }
public Activity ParentActivity { get; }
public CustomTabsClient Client { get; }

public event CustomTabsServiceDisconnectedDelegate CustomTabsServiceDisconnected;
public event CustomTabsServiceConnectedDelegate CustomTabsServiceConnected;
public event ExtraCallbackDelegate ExtraCallback;
public event NavigationEventDelegate NavigationEvent;

public static CustomTabsActivityManager From(Activity parentActivity, string servicePackageName = null);
public bool BindService(string servicePackageName = null);
public void LaunchUrl(string url, CustomTabsIntent customTabsIntent = null);
public bool MayLaunchUrl(string url, Bundle extras, List<string> otherLikelyUrls);
public bool Warmup(long flags = 0);

public class ExtraCallbackEventArgs
{
public ExtraCallbackEventArgs();

public string CallbackName { get; set; }
public Bundle Args { get; set; }
}

public delegate void NavigationEventDelegate(int navigationEvent, Bundle extras);
public delegate void ExtraCallbackDelegate(object sender, ExtraCallbackEventArgs e);
public delegate void CustomTabsServiceConnectedDelegate(ComponentName name, CustomTabsClient client);
public delegate void CustomTabsServiceDisconnectedDelegate(ComponentName name);
}






xamarin.android chrome-custom-tabs






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 28 '18 at 1:31









York Shen

7,0061528




7,0061528










asked Nov 22 '18 at 17:15









QueryQuery

1941114




1941114













  • Could you please post more detailed codes?

    – York Shen
    Nov 26 '18 at 2:51



















  • Could you please post more detailed codes?

    – York Shen
    Nov 26 '18 at 2:51

















Could you please post more detailed codes?

– York Shen
Nov 26 '18 at 2:51





Could you please post more detailed codes?

– York Shen
Nov 26 '18 at 2:51












1 Answer
1






active

oldest

votes


















1















I can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class




Analyze:



Usually we could directly use unbindService to unbind the Service. But in the CustomTabActivityManger source code we could found there no UnBindService() method. And you can't get the CustomTabsServiceConnection instance from outside so that it's hard to unbind the service in your Activity:



public class CustomTabsActivityManager
{
...
CustomTabsServiceConnectionImpl connection;
...

public bool BindService (string servicePackageName = null)
{
...

connection = new CustomTabsServiceConnectionImpl {
CustomTabsServiceConnectedHandler = (name, client) => {
Client = client;
var evt = CustomTabsServiceConnected;
if (evt != null)
evt (name, client);
},
OnServiceDisconnectedHandler = (name) => {
var evt = CustomTabsServiceDisconnected;
if (evt != null)
evt (name);
}
};

return CustomTabsClient.BindCustomTabsService (ParentActivity, servicePackageName, connection);
}
}

class CustomTabsServiceConnectionImpl : CustomTabsServiceConnection
{
...
}


Solution:



You could create a custom CustomTabsActivityManager class and add the UnBindService() method:



public class MyCustomTabsActivityManager
{
CustomTabsServiceConnectionImpl connection;

public Activity ParentActivity { get; private set; }
public CustomTabsClient Client { get; private set; }

CustomTabsSession session = null;

...

public void UnBindService()
{
if (connection != null)
{
ParentActivity.UnbindService(connection);
Client = null;
session = null;
}
}
}


Then, you could use this UnBindService() in your Activity:



protected override void OnDestroy()
{
myCustomTabsActivityManager.UnBindService();
base.OnDestroy();
}





share|improve this answer


























  • Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

    – Query
    Nov 27 '18 at 16:48













  • @Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

    – York Shen
    Nov 28 '18 at 1:34











  • @Query, I have wrote it in the Solution part of my answer.

    – York Shen
    Nov 28 '18 at 1:35











  • I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

    – Query
    Dec 6 '18 at 20:02






  • 1





    @Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

    – York Shen
    Dec 14 '18 at 4:48











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435692%2fchromecustomtab-xamarin-android-mainactivity-has-leaked-serviceconnection-custom%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1















I can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class




Analyze:



Usually we could directly use unbindService to unbind the Service. But in the CustomTabActivityManger source code we could found there no UnBindService() method. And you can't get the CustomTabsServiceConnection instance from outside so that it's hard to unbind the service in your Activity:



public class CustomTabsActivityManager
{
...
CustomTabsServiceConnectionImpl connection;
...

public bool BindService (string servicePackageName = null)
{
...

connection = new CustomTabsServiceConnectionImpl {
CustomTabsServiceConnectedHandler = (name, client) => {
Client = client;
var evt = CustomTabsServiceConnected;
if (evt != null)
evt (name, client);
},
OnServiceDisconnectedHandler = (name) => {
var evt = CustomTabsServiceDisconnected;
if (evt != null)
evt (name);
}
};

return CustomTabsClient.BindCustomTabsService (ParentActivity, servicePackageName, connection);
}
}

class CustomTabsServiceConnectionImpl : CustomTabsServiceConnection
{
...
}


Solution:



You could create a custom CustomTabsActivityManager class and add the UnBindService() method:



public class MyCustomTabsActivityManager
{
CustomTabsServiceConnectionImpl connection;

public Activity ParentActivity { get; private set; }
public CustomTabsClient Client { get; private set; }

CustomTabsSession session = null;

...

public void UnBindService()
{
if (connection != null)
{
ParentActivity.UnbindService(connection);
Client = null;
session = null;
}
}
}


Then, you could use this UnBindService() in your Activity:



protected override void OnDestroy()
{
myCustomTabsActivityManager.UnBindService();
base.OnDestroy();
}





share|improve this answer


























  • Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

    – Query
    Nov 27 '18 at 16:48













  • @Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

    – York Shen
    Nov 28 '18 at 1:34











  • @Query, I have wrote it in the Solution part of my answer.

    – York Shen
    Nov 28 '18 at 1:35











  • I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

    – Query
    Dec 6 '18 at 20:02






  • 1





    @Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

    – York Shen
    Dec 14 '18 at 4:48
















1















I can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class




Analyze:



Usually we could directly use unbindService to unbind the Service. But in the CustomTabActivityManger source code we could found there no UnBindService() method. And you can't get the CustomTabsServiceConnection instance from outside so that it's hard to unbind the service in your Activity:



public class CustomTabsActivityManager
{
...
CustomTabsServiceConnectionImpl connection;
...

public bool BindService (string servicePackageName = null)
{
...

connection = new CustomTabsServiceConnectionImpl {
CustomTabsServiceConnectedHandler = (name, client) => {
Client = client;
var evt = CustomTabsServiceConnected;
if (evt != null)
evt (name, client);
},
OnServiceDisconnectedHandler = (name) => {
var evt = CustomTabsServiceDisconnected;
if (evt != null)
evt (name);
}
};

return CustomTabsClient.BindCustomTabsService (ParentActivity, servicePackageName, connection);
}
}

class CustomTabsServiceConnectionImpl : CustomTabsServiceConnection
{
...
}


Solution:



You could create a custom CustomTabsActivityManager class and add the UnBindService() method:



public class MyCustomTabsActivityManager
{
CustomTabsServiceConnectionImpl connection;

public Activity ParentActivity { get; private set; }
public CustomTabsClient Client { get; private set; }

CustomTabsSession session = null;

...

public void UnBindService()
{
if (connection != null)
{
ParentActivity.UnbindService(connection);
Client = null;
session = null;
}
}
}


Then, you could use this UnBindService() in your Activity:



protected override void OnDestroy()
{
myCustomTabsActivityManager.UnBindService();
base.OnDestroy();
}





share|improve this answer


























  • Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

    – Query
    Nov 27 '18 at 16:48













  • @Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

    – York Shen
    Nov 28 '18 at 1:34











  • @Query, I have wrote it in the Solution part of my answer.

    – York Shen
    Nov 28 '18 at 1:35











  • I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

    – Query
    Dec 6 '18 at 20:02






  • 1





    @Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

    – York Shen
    Dec 14 '18 at 4:48














1












1








1








I can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class




Analyze:



Usually we could directly use unbindService to unbind the Service. But in the CustomTabActivityManger source code we could found there no UnBindService() method. And you can't get the CustomTabsServiceConnection instance from outside so that it's hard to unbind the service in your Activity:



public class CustomTabsActivityManager
{
...
CustomTabsServiceConnectionImpl connection;
...

public bool BindService (string servicePackageName = null)
{
...

connection = new CustomTabsServiceConnectionImpl {
CustomTabsServiceConnectedHandler = (name, client) => {
Client = client;
var evt = CustomTabsServiceConnected;
if (evt != null)
evt (name, client);
},
OnServiceDisconnectedHandler = (name) => {
var evt = CustomTabsServiceDisconnected;
if (evt != null)
evt (name);
}
};

return CustomTabsClient.BindCustomTabsService (ParentActivity, servicePackageName, connection);
}
}

class CustomTabsServiceConnectionImpl : CustomTabsServiceConnection
{
...
}


Solution:



You could create a custom CustomTabsActivityManager class and add the UnBindService() method:



public class MyCustomTabsActivityManager
{
CustomTabsServiceConnectionImpl connection;

public Activity ParentActivity { get; private set; }
public CustomTabsClient Client { get; private set; }

CustomTabsSession session = null;

...

public void UnBindService()
{
if (connection != null)
{
ParentActivity.UnbindService(connection);
Client = null;
session = null;
}
}
}


Then, you could use this UnBindService() in your Activity:



protected override void OnDestroy()
{
myCustomTabsActivityManager.UnBindService();
base.OnDestroy();
}





share|improve this answer
















I can bind service using CustomTabActivityManger class, but there is no option for unbind the service in that class




Analyze:



Usually we could directly use unbindService to unbind the Service. But in the CustomTabActivityManger source code we could found there no UnBindService() method. And you can't get the CustomTabsServiceConnection instance from outside so that it's hard to unbind the service in your Activity:



public class CustomTabsActivityManager
{
...
CustomTabsServiceConnectionImpl connection;
...

public bool BindService (string servicePackageName = null)
{
...

connection = new CustomTabsServiceConnectionImpl {
CustomTabsServiceConnectedHandler = (name, client) => {
Client = client;
var evt = CustomTabsServiceConnected;
if (evt != null)
evt (name, client);
},
OnServiceDisconnectedHandler = (name) => {
var evt = CustomTabsServiceDisconnected;
if (evt != null)
evt (name);
}
};

return CustomTabsClient.BindCustomTabsService (ParentActivity, servicePackageName, connection);
}
}

class CustomTabsServiceConnectionImpl : CustomTabsServiceConnection
{
...
}


Solution:



You could create a custom CustomTabsActivityManager class and add the UnBindService() method:



public class MyCustomTabsActivityManager
{
CustomTabsServiceConnectionImpl connection;

public Activity ParentActivity { get; private set; }
public CustomTabsClient Client { get; private set; }

CustomTabsSession session = null;

...

public void UnBindService()
{
if (connection != null)
{
ParentActivity.UnbindService(connection);
Client = null;
session = null;
}
}
}


Then, you could use this UnBindService() in your Activity:



protected override void OnDestroy()
{
myCustomTabsActivityManager.UnBindService();
base.OnDestroy();
}






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 26 '18 at 6:11

























answered Nov 26 '18 at 5:44









York ShenYork Shen

7,0061528




7,0061528













  • Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

    – Query
    Nov 27 '18 at 16:48













  • @Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

    – York Shen
    Nov 28 '18 at 1:34











  • @Query, I have wrote it in the Solution part of my answer.

    – York Shen
    Nov 28 '18 at 1:35











  • I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

    – Query
    Dec 6 '18 at 20:02






  • 1





    @Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

    – York Shen
    Dec 14 '18 at 4:48



















  • Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

    – Query
    Nov 27 '18 at 16:48













  • @Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

    – York Shen
    Nov 28 '18 at 1:34











  • @Query, I have wrote it in the Solution part of my answer.

    – York Shen
    Nov 28 '18 at 1:35











  • I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

    – Query
    Dec 6 '18 at 20:02






  • 1





    @Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

    – York Shen
    Dec 14 '18 at 4:48

















Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

– Query
Nov 27 '18 at 16:48







Thanks for your answer ,but my CustomTabsActivityManager class just have public bool BindService(string servicePackageName = null); to bind the service so i got confused what to pass as connection at the time of UnbindService. i added my code snapped in question.

– Query
Nov 27 '18 at 16:48















@Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

– York Shen
Nov 28 '18 at 1:34





@Query, create a your own MyCustomTabsActivityManager class which extends from CustomTabsActivityManager , then create the UnbindService() method and pass the connection parameter.

– York Shen
Nov 28 '18 at 1:34













@Query, I have wrote it in the Solution part of my answer.

– York Shen
Nov 28 '18 at 1:35





@Query, I have wrote it in the Solution part of my answer.

– York Shen
Nov 28 '18 at 1:35













I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

– Query
Dec 6 '18 at 20:02





I tried it but there is some issue with extends, as i am using visual studio and i am not able to extend class , did you ever try with visual studio with c# ?

– Query
Dec 6 '18 at 20:02




1




1





@Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

– York Shen
Dec 14 '18 at 4:48





@Query, link here: github.com/aixiaozi/Xamarin_CustomTabsIssue

– York Shen
Dec 14 '18 at 4:48




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435692%2fchromecustomtab-xamarin-android-mainactivity-has-leaked-serviceconnection-custom%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Tangent Lines Diagram Along Smooth Curve

Yusuf al-Mu'taman ibn Hud

Zucchini