[
  {
    "path": ".gitattributes.txt",
    "content": "*.java linguist-language=kotlin"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n*.apk\n/local.properties\n/.idea\n/.idea/caches/build_file_checksums.ser\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README.md",
    "content": "# BiliBili\n\n转行了各位，所以这个项目大概率不会更新了。B站的有些接口更新了，B站官方之前的版本也不能用了，大家可以自己根据最新的版本抓包得到接口。\n\n\n\n\n\n使用ijkplayer，实现一个仿B站的Android客户端。使用组件化的思想对项目进行拆分，目前分出两个组件，一个是网络请求组件，一个是视频播放组件。\n\n扫码体验：\n\n![](https://blog-1252348761.cos.ap-chengdu.myqcloud.com/bilibili/1577761537.png)\n\n\n\n\n\n### 组件化实现方案\n\n组件化使用的方案出自张华洋的文章：[Android组件化方案](https://blog.csdn.net/guiying712/article/details/55213884)\n\n在gradle.properties中，有一个isModule值，为true时是组件化模式，为false为library。在业务组件的build.gradle中读取 isModule，代码如下：\n\n```java\nif (isModule.toBoolean()) {\n    apply plugin: 'com.android.application'\n} else {\n    apply plugin: 'com.android.library'\n}\n```\n\n在 AndroidStudio 中每一个组件都会有对应的 AndroidManifest.xml，application和library使用的AndroidManifest.xml不同，所以要为组件开发模式下的业务组件再创建一个 AndroidManifest.xml，然后根据isModule指定AndroidManifest.xml的文件路径，让业务组件在集成模式和组件模式下使用不同的AndroidManifest.xml：\n\n```java\nsourceSets {\n        main {\n            if (isModule.toBoolean()) {\n                manifest.srcFile 'src/main/module/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/AndroidManifest.xml'\n            }\n        }\n    }\n```\n\n### 组件功能介绍\n\n#### ijkplayer组件（功能组件）\n\n该组件是一个视频播放组件，在ubuntu16.04上集成编译了ijkplayer，支持rtsp和rtmp的视频直播推流。提供了一个自定义view，可以使用该view实现本地/网络视频的播放、暂停、快进、视频亮度、音量的调节。[ijkplayer0.8.8下载地址](!https://blog-1252348761.cos.ap-chengdu.myqcloud.com/camera/ijkplayer0.8.8-2019-02-20.zip )\n\n使用方式如下：\n\n声明所需权限，用于播放网络视频和本地视频：\n\n```xml\n<uses-permission android:name=\"android.permission.INTERNET\" />  \n<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n```\n\n注意，如果横竖屏切换不想重新走一遍生命周期，还需要在表单中设置Activity的configChanges属性：\n\n```xml\n<activity android:name=\".PlayActivity\"\n                  android:configChanges=\"orientation|keyboardHidden|screenSize\" >\n</activity\n```\n\n\n\n在布局中添加如下view：\n\n```xml\n<com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView\n            android:id=\"@+id/simple_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"180dp\">\n    </com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView>\n```\n\n在Activity/Fragment中的oncreate方法里：\n\n```kotlin\noverride fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_play)\n    //屏幕常亮\n\tgetWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n\t/** 普通播放 start **/\n\tvar url = getIntent().getStringExtra(\"url\");\n\tsimple_view\n            .setVideoUrl(url)\n            .setVideoTitle(\"这是标题\")\n            .startPlay()\n}\noverride fun onConfigurationChanged(newConfig: Configuration?) {\n        super.onConfigurationChanged(newConfig)\n        //横竖屏切换 显示/隐藏actionbar\n        var isPortrait = simple_view.onConfigurationChang(newConfig)\n        if (isPortrait) {\n            supportActionBar?.show()\n        } else {\n            supportActionBar?.hide()\n        }\n    }\n\n    override fun onBackPressed() {\n        simple_view.onBackPressed()\n        if (!simple_view.isPortrait){\n            supportActionBar?.show()\n        }else{\n            super.onBackPressed()\n        }\n    }\n\n    override fun onPause() {\n        super.onPause()\n        simple_view.onPause()\n    }\n\n    override fun onResume() {\n        super.onResume()\n        simple_view.onResume()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        simple_view.onDestory()\n    }\n```\n\n\n\n#### common组件（功能组件）\n\n1. common组件是基础库，添加一些公用的类；\n2. 网络请求、图片加载、工具类、base类等；\n3. 声明APP需要的uses-permission；\n4. 定义mvp架构实现网络请求\n\n\n\n### 目前完成的功能\n\n- 整体架构搭建\n- 对b站客户端抓包，分析接口\n- 主界面布局完成\n- 完成直播播放页面\n- 完成推荐视频的播放\n- 视频弹幕获取\n\n\n\n项目截图：\n\n\n<table>\n\t<tr>\n\t\t<th>直播界面</th>\n\t\t<th>聊天界面</th>\n\t\t<th>个人信息popwindow</th>\n\t\t<th>主播信息界面</th>\n\t\t<th>粉丝榜</th>\n\t\t<th>大航海</th>\n\t</tr>\n\t<tr>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-23-55-347_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-24-08-833_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-24-17-260_com.bilibili.lingxiao.png\"/>\n      </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-24-27-253_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-24-35-335_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-24-46-649_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t</tr>\n</table>\n\n\n\n\n\n<table>\n\t<tr>\n\t\t<th>视频播放</th>\n\t\t<th>视频评论</th>\n\t\t<th>侧滑</th>\n\t\t<th>分区</th>\n\t\t<th>追番</th>\n\t\t<th>webview</th>\n\t</tr>\n\t<tr>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-25-12-073_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-25-16-370_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-25-29-487_com.bilibili.lingxiao.png\"/>\n      </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-32-27-197_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-32-34-114_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t\t  <td>\n\t\t\t  <img src=\"https://blog-1252348761.cos.ap-chengdu.myqcloud.com/http/bilibili/Screenshot_2019-04-28-17-33-13-842_com.bilibili.lingxiao.png\"/>\n\t\t  </td>\n\t</tr>\n</table>\n\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nadd_library( # Sets the name of the library.\n        native-lib\n\n        # Sets the library as a shared library.\n        SHARED\n\n        # Provides a relative path to your source file(s).\n        src/main/cpp/native-lib.cpp)\n\n# Searches for a specified prebuilt library and stores the path as a\n# variable. Because CMake includes system libraries in the search path by\n# default, you only need to specify the name of the public NDK library\n# you want to add. CMake verifies that the library exists before\n# completing its build.\n\nfind_library( # Sets the name of the path variable.\n        log-lib\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        log)\n\n# Specifies libraries CMake should link to your target library. You\n# can link multiple libraries, such as libraries you define in this\n# build script, prebuilt third-party libraries, or system libraries.\n\ntarget_link_libraries( # Specifies the target library.\n        native-lib\n\n        # Links the target library to the log library\n        # included in the NDK.\n        ${log-lib})"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\napply plugin: 'kotlin-android'\n\napply plugin: 'kotlin-android-extensions'\napply plugin: 'kotlin-kapt'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n    defaultConfig {\n        applicationId \"com.bilibili.lingxiao\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode rootProject.ext.versionCode\n        versionName rootProject.ext.versionName\n        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'\n        externalNativeBuild {\n            cmake {\n                cppFlags \"\"\n            }\n        }\n        vectorDrawables.useSupportLibrary = true\n\n        ndk {\n            // 设置支持的SO库架构\n            abiFilters 'armeabi-v7a', 'x86', 'x86_64'\n        }\n    }\n    compileOptions {\n        sourceCompatibility = '1.8'\n        targetCompatibility = '1.8'\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    externalNativeBuild {\n        cmake {\n            path \"CMakeLists.txt\"\n        }\n    }\n    packagingOptions {\n        exclude 'META-INF/proguard/androidx-annotations.pro'\n        exclude 'META-INF/kotlinx-io.kotlin_module'\n        exclude 'META-INF/atomicfu.kotlin_module'\n        exclude 'META-INF/kotlinx-coroutines-io.kotlin_module'\n    }\n}\n\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.2.0'\n    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.1'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'\n    implementation \"com.trello.rxlifecycle2:rxlifecycle:$rootProject.ext.rxlifescyleVersion\"\n\n    // If you want to use Android Lifecycle for providers\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:$rootProject.ext.rxlifescyleVersion\"\n\n    // If you want pre-written Activities and Fragments you can subclass as providers\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-components:$rootProject.ext.rxlifescyleVersion\"\n\n    // If you want to use Kotlin syntax\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-kotlin:$rootProject.ext.rxlifescyleVersion\"\n\n    // If you want to use Kotlin syntax with Android Lifecycle\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:$rootProject.ext.rxlifescyleVersion\"\n    implementation \"pub.devrel:easypermissions:$rootProject.ext.easypermissionsVersion\"\n    implementation \"com.facebook.fresco:fresco:$rootProject.ext.frescoVersion\"\n\n    // 支持 GIF 动图，需要添加\n    implementation \"com.facebook.fresco:animated-gif:$rootProject.ext.frescoVersion\"\n    implementation project(':common')\n    implementation project(':ijkplayer')\n    implementation 'com.squareup.okhttp3:okhttp:3.13.1'\n    implementation 'com.google.code.gson:gson:2.8.5'\n    implementation \"com.google.dagger:dagger:$rootProject.ext.daggerVersion\"\n    kapt \"com.google.dagger:dagger-compiler:$rootProject.ext.daggerVersion\"\n    annotationProcessor \"com.google.dagger:dagger-compiler:$rootProject.ext.daggerVersion\"\n    implementation \"com.youth.banner:banner:$rootProject.ext.bannerVersion\"\n    implementation \"com.github.zackratos.ultimatebar:ultimatebar2:$rootProject.ext.ultimatebarVersion\"\n    implementation \"org.greenrobot:eventbus:$rootProject.ext.eventBusVersion\"\n\n    //其中latest.release指代最新版本号，也可以指定明确的版本号，例如2.2.0\n\n    //烈焰弹幕\n    implementation \"com.github.ctiao:DanmakuFlameMaster:$rootProject.ext.danmakuVersion\"\n    implementation \"com.github.ctiao:ndkbitmap-armv7a:$rootProject.ext.danmakuNdk\"\n\n    // Other ABIs: optional\n    implementation \"com.github.ctiao:ndkbitmap-armv5:$rootProject.ext.danmakuNdk\"\n    implementation \"com.github.ctiao:ndkbitmap-x86:$rootProject.ext.danmakuNdk\"\n    implementation project(':skinLibrary')\n    implementation 'androidx.recyclerview:recyclerview:1.0.0'\n    implementation \"com.flyco.tablayout:FlycoTabLayout_Lib:$rootProject.ext.FlycoTabLayout\"\n    implementation files('libs/tbs_sdk_thirdapp_v4.3.0.1020_43633_sharewithdownload_withoutGame_obfs_20190111_105200.jar')\n    //骨架屏\n    implementation 'com.github.sharish:ShimmerRecyclerView:v1.3'\n    // Use if Kotlin user.\n    //kapt \"com.github.agrosner.dbflow:processor:$rootProject.ext.dbFlowVersion\"\n    // core set of libraries\n    //implementation \"com.github.agrosner.dbflow:core:$rootProject.ext.dbFlowVersion\"\n    //implementation \"com.github.agrosner.dbflow:lib:$rootProject.ext.dbFlowVersion\"\n\n    annotationProcessor \"com.github.Raizlabs.DBFlow:dbflow-processor:$rootProject.ext.dbFlowVersion\"\n    implementation \"com.github.Raizlabs.DBFlow:dbflow-core:$rootProject.ext.dbFlowVersion\"\n    implementation \"com.github.Raizlabs.DBFlow:dbflow:$rootProject.ext.dbFlowVersion\"\n    implementation group: 'com.hiczp', name: 'bilibili-api', version: '0.1.0'\n\n    implementation \"androidx.room:room-runtime:$rootProject.room_version\"\n    annotationProcessor \"androidx.room:room-compiler:$rootProject.room_version\" // For Kotlin use kapt instead of annotationProcessor\n\n\n    //implementation \"com.ashokvarma.android:bottom-navigation-bar:$rootProject.ext.bottomNavigationBar\"\n    //implementation files('libs/Java-WebSocket-1.3.8.jar')\n    //implementation 'com.github.paulyung541:LaybelLayout:v1.2.0'\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n# banner 的混淆代码\n-keep class com.youth.banner.** {\n    *;\n }\n\n -dontwarn com.tencent.bugly.**\n -keep public class com.tencent.bugly.**{*;}\n -keep class android.support.**{*;}\n\n\n #fresco混淆\n # Keep our interfaces so they can be used by other ProGuard rules.\n # See http://sourceforge.net/p/proguard/bugs/466/\n -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip\n -keep,allowobfuscation @interface com.facebook.soloader.DoNotOptimize\n\n # Do not strip any method/class that is annotated with @DoNotStrip\n -keep @com.facebook.common.internal.DoNotStrip class *\n -keepclassmembers class * {\n     @com.facebook.common.internal.DoNotStrip *;\n }\n\n # Do not strip any method/class that is annotated with @DoNotOptimize\n -keep @com.facebook.soloader.DoNotOptimize class *\n -keepclassmembers class * {\n     @com.facebook.soloader.DoNotOptimize *;\n }\n\n # Keep native methods\n -keepclassmembers class * {\n     native <methods>;\n }\n\n -dontwarn okio.**\n -dontwarn com.squareup.okhttp.**\n -dontwarn okhttp3.**\n -dontwarn javax.annotation.**\n -dontwarn com.android.volley.toolbox.**\n -dontwarn com.facebook.infer.**\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n #-optimizationpasses 7\n #-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*\n -dontoptimize\n -dontusemixedcaseclassnames\n -verbose\n -dontskipnonpubliclibraryclasses\n -dontskipnonpubliclibraryclassmembers\n -dontwarn dalvik.**\n -dontwarn com.tencent.smtt.**\n #-overloadaggressively\n\n # ------------------ Keep LineNumbers and properties ---------------- #\n -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod\n # --------------------------------------------------------------------------\n\n # Addidional for x5.sdk classes for apps\n\n -keep class com.tencent.smtt.export.external.**{\n     *;\n }\n\n -keep class com.tencent.tbs.video.interfaces.IUserStateChangedListener {\n \t*;\n }\n\n -keep class com.tencent.smtt.sdk.CacheManager {\n \tpublic *;\n }\n\n -keep class com.tencent.smtt.sdk.CookieManager {\n \tpublic *;\n }\n\n -keep class com.tencent.smtt.sdk.WebHistoryItem {\n \tpublic *;\n }\n\n -keep class com.tencent.smtt.sdk.WebViewDatabase {\n \tpublic *;\n }\n\n -keep class com.tencent.smtt.sdk.WebBackForwardList {\n \tpublic *;\n }\n\n -keep public class com.tencent.smtt.sdk.WebView {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebView$HitTestResult {\n \tpublic static final <fields>;\n \tpublic java.lang.String getExtra();\n \tpublic int getType();\n }\n\n -keep public class com.tencent.smtt.sdk.WebView$WebViewTransport {\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebView$PictureListener {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n\n -keepattributes InnerClasses\n\n -keep public enum com.tencent.smtt.sdk.WebSettings$** {\n     *;\n }\n\n -keep public enum com.tencent.smtt.sdk.QbSdk$** {\n     *;\n }\n\n -keep public class com.tencent.smtt.sdk.WebSettings {\n     public *;\n }\n\n\n -keepattributes Signature\n -keep public class com.tencent.smtt.sdk.ValueCallback {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebViewClient {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.DownloadListener {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebChromeClient {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebChromeClient$FileChooserParams {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep class com.tencent.smtt.sdk.SystemWebChromeClient{\n \tpublic *;\n }\n # 1. extension interfaces should be apparent\n -keep public class com.tencent.smtt.export.external.extension.interfaces.* {\n \tpublic protected *;\n }\n\n # 2. interfaces should be apparent\n -keep public class com.tencent.smtt.export.external.interfaces.* {\n \tpublic protected *;\n }\n\n -keep public class com.tencent.smtt.sdk.WebViewCallbackClient {\n \tpublic protected *;\n }\n\n -keep public class com.tencent.smtt.sdk.WebStorage$QuotaUpdater {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebIconDatabase {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.WebStorage {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.DownloadListener {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.QbSdk {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.QbSdk$PreInitCallback {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n -keep public class com.tencent.smtt.sdk.CookieSyncManager {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.Tbs* {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.utils.LogFileUtils {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.utils.TbsLog {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.utils.TbsLogClient {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.CookieSyncManager {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n # Added for game demos\n -keep public class com.tencent.smtt.sdk.TBSGamePlayer {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.TBSGamePlayerClient* {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.TBSGamePlayerClientExtension {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.TBSGamePlayerService* {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep public class com.tencent.smtt.utils.Apn {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n -keep class com.tencent.smtt.** {\n \t*;\n }\n # end\n\n\n -keep public class com.tencent.smtt.export.external.extension.proxy.ProxyWebViewClientExtension {\n \tpublic <fields>;\n \tpublic <methods>;\n }\n\n -keep class MTT.ThirdAppInfoNew {\n \t*;\n }\n\n -keep class com.tencent.mtt.MttTraceEvent {\n \t*;\n }\n\n # Game related\n -keep public class com.tencent.smtt.gamesdk.* {\n \tpublic protected *;\n }\n\n -keep public class com.tencent.smtt.sdk.TBSGameBooter {\n         public <fields>;\n         public <methods>;\n }\n\n -keep public class com.tencent.smtt.sdk.TBSGameBaseActivity {\n \tpublic protected *;\n }\n\n -keep public class com.tencent.smtt.sdk.TBSGameBaseActivityProxy {\n \tpublic protected *;\n }\n\n -keep public class com.tencent.smtt.gamesdk.internal.TBSGameServiceClient {\n \tpublic *;\n }\n #---------------------------------------------------------------------------\n\n\n #------------------  下方是android平台自带的排除项，这里不要动         ----------------\n\n -keep public class * extends android.app.Activity{\n \tpublic <fields>;\n \tpublic <methods>;\n }\n -keep public class * extends android.app.Application{\n \tpublic <fields>;\n \tpublic <methods>;\n }\n -keep public class * extends android.app.Service\n -keep public class * extends android.content.BroadcastReceiver\n -keep public class * extends android.content.ContentProvider\n -keep public class * extends android.app.backup.BackupAgentHelper\n -keep public class * extends android.preference.Preference\n\n -keepclassmembers enum * {\n     public static **[] values();\n     public static ** valueOf(java.lang.String);\n }\n\n -keepclasseswithmembers class * {\n \tpublic <init>(android.content.Context, android.util.AttributeSet);\n }\n\n -keepclasseswithmembers class * {\n \tpublic <init>(android.content.Context, android.util.AttributeSet, int);\n }\n\n -keepattributes *Annotation*\n\n -keepclasseswithmembernames class *{\n \tnative <methods>;\n }\n\n -keep class * implements android.os.Parcelable {\n   public static final android.os.Parcelable$Creator *;\n }\n\n #------------------  下方是共性的排除项目         ----------------\n # 方法名中含有“JNI”字符的，认定是Java Native Interface方法，自动排除\n # 方法名中含有“JRI”字符的，认定是Java Reflection Interface方法，自动排除\n\n -keepclasseswithmembers class * {\n     ... *JNI*(...);\n }\n\n -keepclasseswithmembernames class * {\n \t... *JRI*(...);\n }\n\n -keep class **JNI* {*;}\n\n#dbflow\n-keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; }\n"
  },
  {
    "path": "app/src/androidTest/java/com/bilibili/lingxiao/ExampleInstrumentedTest.kt",
    "content": "package com.bilibili.lingxiao\n\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.ext.junit.runners.AndroidJUnit4\n\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\nimport org.junit.Assert.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getTargetContext()\n        assertEquals(\"com.bilibili.lingxiao\", appContext.packageName)\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\"\n          package=\"com.bilibili.lingxiao\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>\n\n    <application\n            android:name=\".App\"\n            android:allowBackup=\"true\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:label=\"@string/app_name\"\n            android:networkSecurityConfig=\"@xml/network_security_config\"\n            tools:replace=\"android:appComponentFactory\"\n            android:appComponentFactory=\"android\"\n            android:roundIcon=\"@mipmap/ic_launcher_round\"\n            android:supportsRtl=\"true\"\n            android:theme=\"@style/MainTheme\">\n        <activity android:name=\".home.live.ui.StreamHomeActivity\">\n        </activity>\n        <activity android:name=\".home.find.ui.RankListActivity\">\n        </activity>\n        <activity android:name=\".home.find.ui.TopicCenterActivity\">\n        </activity>\n        <activity android:name=\".home.find.ui.SearchDetailActivity\">\n        </activity>\n        <activity android:name=\".web.WebActivity\">\n        </activity>\n\n        <uses-library\n                android:name=\"org.apache.http.legacy\"\n                android:required=\"false\"/>\n\n        <provider\n                android:name=\"androidx.core.content.FileProvider\"\n                android:authorities=\"${applicationId}.fileProvider\"\n                android:exported=\"false\"\n                android:grantUriPermissions=\"true\">\n            <meta-data\n                    android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                    android:resource=\"@xml/provider_paths\"/>\n        </provider>\n\n        <activity android:name=\".home.MainActivity\">\n        </activity>\n        <activity\n                android:name=\".SplashActivity\"\n                android:theme=\"@style/FullScreen\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <activity android:name=\".user.LoginActivity\">\n        </activity>\n        <activity\n                android:name=\".home.live.ui.LivePlayActivity\"\n                android:configChanges=\"orientation|keyboardHidden|screenSize\">\n        </activity>\n        <activity\n                android:name=\".play.ui.PlayActivity\"\n                android:configChanges=\"orientation|keyboardHidden|screenSize\"\n                android:label=\"@string/app_name\">\n\n            <!-- 要想在别的App上能成功调起App，必须添加intent过滤器 -->\n            <!-- 协议部分，随便设置 -->\n            <intent-filter>\n\n                <!-- 协议部分，随便设置 -->\n                <data\n                        android:host=\"video\"\n                        android:scheme=\"bilibili\"/>\n                <!-- 下面这几行也必须得设置 -->\n                <category android:name=\"android.intent.category.DEFAULT\"/>\n\n                <action android:name=\"android.intent.action.VIEW\"/>\n\n                <category android:name=\"android.intent.category.BROWSABLE\"/>\n            </intent-filter>\n        </activity>\n        <activity\n                android:name=\"com.tencent.bugly.beta.ui.BetaActivity\"\n                android:configChanges=\"keyboardHidden|orientation|screenSize|locale\"\n                android:theme=\"@android:style/Theme.Translucent\"/>\n        <activity android:name=\".home.navigation.ThemeActivity\">\n        </activity>\n        <activity android:name=\".home.live.ui.LiveAllActivity\">\n        </activity>\n        <activity android:name=\".home.live.ui.LiveMoreActivity\"/>\n        <activity android:name=\".home.region.ui.RegionTabActivity\">\n        </activity>\n\n        <service android:name=\".InitIalizeService\"/>\n\n        <activity android:name=\".home.region.ui.BangumiDetailActivity\">\n        </activity>\n        <activity android:name=\".home.navigation.SettingActivity\">\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/cpp/native-lib.cpp",
    "content": "#include <jni.h>\n#include <string>\n\nextern \"C\" JNIEXPORT jstring JNICALL\nJava_com_bilibili_lingxiao_MainActivity_stringFromJNI(\n        JNIEnv *env,\n        jobject /* this */) {\n    std::string hello = \"Hello from C++\";\n    return env->NewStringUTF(hello.c_str());\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/App.kt",
    "content": "package com.bilibili.lingxiao\n\nimport android.app.Application\nimport androidx.room.Room\nimport com.bilibili.lingxiao.database.db.AppDatabase\nimport com.bilibili.lingxiao.utils.UIUtil\n\nimport com.facebook.drawee.backends.pipeline.Fresco\n\n\nclass App : Application() {\n    private val TAG = App::class.java.simpleName\n    override fun onCreate() {\n        super.onCreate()\n        Fresco.initialize(this)\n        UIUtil.init(this)\n        InitIalizeService.initialize(this);\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/GlobalProperties.kt",
    "content": "package com.bilibili.lingxiao\n\nimport android.util.Log\nimport com.bilibili.lingxiao.utils.MD5Util\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.oss.StringUtils\nimport okhttp3.HttpUrl\nimport java.net.URLEncoder\nimport java.security.NoSuchAlgorithmException\nimport java.text.SimpleDateFormat\nimport java.util.*\n\nobject GlobalProperties {\n    const val LIVE_HOST = \"http://live.bilibili.com/AppIndex/home/?\"   //直播api\n    const val LIVE_HOST_NEW = \"https://api.live.bilibili.com/xlive/app-interface/v2/index/feed?\"   //直播api\n    const val COMMEND_HOST = \"http://app.bilibili.com/x/feed/index?\"   //推荐api\n    const val DETAIL_HOST = \"http://api.bilibili.cn/view?\"  //视频详情\n    const val COMMEND_VIDEO_HOST = \"http://api.bilibili.cn/recommend?\"  //视频详情下面的推荐\n    const val COMMENT_HOST = \"http://api.bilibili.com/x/v2/reply/main?\"  //评论\n    const val COMMENT_DOUBLE_HOST = \"http://api.bilibili.com/x/v2/reply/reply/cursor?\" //楼中楼评论\n    const val BANGUMI_CN_AND_JP_HOST = \"http://bangumi.bilibili.com/appindex/follow_index_page?\" //国内外推荐番剧\n    const val BANGUMI_FALL_HOST = \"http://bangumi.bilibili.com/appindex/follow_index_fall?\" //编辑推荐番剧\n    const val BANGUMI_DETAIL = \"https://bangumi.bilibili.com/api/season_v5?\"  //番剧详情\n    const val BANGUMI_RECOMMEND = \"https://bangumi.bilibili.com/api/season/recommend/rnd/\"  //番剧详情下面的推荐\n\n    const val CATEGORY_HOST = \"http://app.bilibili.com/x/v2/region?\" //分区\n    const val CATEGORY_RECOMMEND_HOST = \"http://app.bilibili.com/x/v2/show/index?\" //分区推荐\n    const val REGION_DETAIL_URL = \"https://app.bilibili.com/x/v2/region/dynamic?\"  //分区详情\n    const val REGION_DETAIL_LOADMORE_URL = \"https://app.bilibili.com/x/v2/region/dynamic/list?\"  //分区加载更多\n    const val REGION_LOCALITY_URL = \"http://app.bilibili.com/x/v2/show/change/\" //分区局部更新\n\n    const val USER_AGENT = \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Mobile Safari/537.36\"\n\n    //var LIVE_UP_INFO = \"https://api.live.bilibili.com/room/v1/Room/get_info\" //获取up主的信息\n    const val LIVE_UP_INFO = \"http://api.live.bilibili.com/xlive/app-room/v1/index/getInfoByRoom?\"\n    const val LIVE_USER_INFO = \"http://api.live.bilibili.com/live_user/v1/card/card_user?\" //获取直播间用户的信息\n    const val LIVE_DANMAKU_URL = \"wss://broadcastlv.chat.bilibili.com:2245/sub\"  //直播弹幕 websocket\n    const val LIVE_UP_GOLD_LIST = \"http://api.live.bilibili.com/rankdb/v1/RoomRank/tabRanks?\"  //金瓜子榜  礼物榜\n    const val LIVE_FANS_LIST = \"http://api.live.bilibili.com/rankdb/v2/RoomRank/mobileMedalRank?\"  //粉丝榜\n    const val LIVE_FLEET_LIST = \"http://api.live.bilibili.com/live_user/v1/Guard/topList?\"  //大航海\n    const val LIVE_UP_VIDEO_LIST = \"http://api.live.bilibili.com/bili-api/x/internal/v2/archive/up/passed?\" //直播up主的视频投稿\n    const val LIVE_UP_CHAT_HISTORY = \"http://api.live.bilibili.com/xlive/app-room/v1/dM/gethistory?\" //直播评论\n    const val LIVE_ALL_URL = \"http://api.live.bilibili.com/room/v3/Area/getRoomList\"  //获取全部直播列表\n    const val LIVE_TAB_LIST_URL = \"http://api.live.bilibili.com/room/v1/Area/getList\"  //直播分类所有tab\n\n    const val SEARCH_HOT = \"http://app.bilibili.com/x/v2/search/hot?\" //大家都在搜\n    const val SEARCH_KEYWORD = \"http://app.bilibili.com/x/v2/search?\"\n\n    const val TOPIC_CENTER = \"http://api.bilibili.com/topic/getlist?\"\n    const val ACTIVITY_CENTER = \"http://api.bilibili.com/event/getlist?\"\n\n    const val ORIGIN_RANKING_LIST = \"http://app.bilibili.com/x/v2/rank?\"  //原创排行榜\n    const val ALL_REGION_RANKING_LIST = \"http://app.bilibili.com/x/v2/rank/region?\"  //全区排行榜\n\n    const val BLACK_DOOR = \"https://www.bilibili.com/blackroom/ban\" //小黑屋\n    const val ROUND_SHOP = \"http://bmall.bilibili.com/\"  //周边商城\n    const val MY_SERVICE_HELP = \"https://www.bilibili.com/h5/faq\"\n\n\n\n    const val IMAGE_RULE_480_300 = \"@480w_300h_1e_1c.webp\"  //图片尺寸\n    const val IMAGE_RULE_240_150 = \"@240w_150h_1e_1c.webp\"\n    const val IMAGE_RULE_160_100 = \"@160w_100h_1e_1c.webp\"\n    const val IMAGE_RULE_90_90 = \"@90w_90h_1e_1c.webp\"\n    const val IMAGE_RULE_60_60 = \"@60w_60h_1e_1c.webp\"\n\n    const val IMAGE_RULE_200_266 = \"@200w_266h_1e_1c.webp\"  //4:3\n    private val SECRET_KEY = \"ea85624dfcf12d7cc7b2b3a94fac1f2c\"\n    const val PARAM_SIGN = \"sign\"\n    const val APP_KEY = \"c1b107428d337928\"\n    const val BUILD = \"5400000\"\n    const val MOBI_APP = \"android\"\n    const val PLATFORM = \"android\"\n    const val DEVICE = \"android\"\n    const val NETWORK_WIFI = \"wifi\"\n    val SCALE = UIUtil.getDensityString()\n    const val SRC = \"bili\"\n    const val VERSION = \"5.19.0.519000\"\n\n    const val HOME_COLUMNS = \"home_columns\"  //首页列数\n    const val LOGIN_RESPONSE = \"login_response\" //登录成功之后保存，用于恢复登录的状态\n    //TODO: 暂时将用户信息存在xml里\n    const val USER_INFO = \"user_info\"\n    val TAG = GlobalProperties::class.java.simpleName\n\n\n    /**\n     * 将所有参数（包括变量名和值及=&符号）排序后加上appsecret（只有值）之后做md5，md5 按照32位小写加密\n     * 得到返回结果即为所求sign值\n     */\n    fun getSign(map: Map<String, Any>): String {\n        //拼接参数(按顺序) + SecretKey\n        val orignSign = getUrlParamsByMap(map) + SECRET_KEY\n        //进行MD5加密\n        var sign = \"\"\n        try {\n            sign = MD5Util.getMD5(orignSign).trim()\n            Log.i(TAG, \"加密后的sign: $sign\")\n        } catch (e: NoSuchAlgorithmException) {\n            Log.e(TAG, \"sign encryption failed: ${e.printStackTrace()}\")\n        }\n        return sign\n    }\n\n    fun getTraceId(): String {\n        val df = SimpleDateFormat(\"yyyyMMddHHmm\", Locale.getDefault())\n        val df2 = SimpleDateFormat(\"s\", Locale.getDefault())\n        val s = StringBuilder()\n        s.append(df.format(Date()))\n        s.append(\"000\")\n        s.append(df2.format(Date()))\n        return s.toString()\n    }\n\n    /**\n     * 获取当前Unix时间戳\n     * @return\n     */\n    fun getSystemTime(): String {\n        val ts = System.currentTimeMillis() / 1000\n        return ts.toString()\n    }\n\n    /**\n     * 将map转换成url参数\n     * @param map\n     * @return\n     */\n    fun getUrlParamsByMap(map: Map<String, Any>): String {\n        var params =  StringBuffer()\n        val it = map.iterator()\n        while (it.hasNext()) {\n            val str = it.next()\n            params.append(str.key)\n            params.append(\"=\")\n            params.append(str.value)\n            if (it.hasNext()) {\n                params.append(\"&\")\n            }\n        }\n        return params.toString()\n    }\n\n    /**\n     * 判断用户是否登录\n     * 根据token判断\n     */\n    fun userLogined() :Boolean{\n        return false\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/HttpTrans.kt",
    "content": "package com.bilibili.lingxiao\n\nimport android.util.Log\nimport com.bilibili.lingxiao.home.find.model.HotWordsData\nimport com.bilibili.lingxiao.home.find.model.RankListData\nimport com.bilibili.lingxiao.home.find.model.SearchResultData\nimport com.bilibili.lingxiao.home.find.model.TopicCardData\nimport com.bilibili.lingxiao.home.live.model.*\nimport com.bilibili.lingxiao.home.mikan.model.MiKanFallData\nimport com.bilibili.lingxiao.home.mikan.model.MiKanRecommendData\nimport com.bilibili.lingxiao.home.region.model.*\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.play.model.VideoDetailData\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.camera.lingxiao.common.app.BaseTransation\nimport com.camera.lingxiao.common.http.ParseHelper\nimport com.camera.lingxiao.common.http.request.HttpRequest\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.google.gson.Gson\nimport com.google.gson.JsonElement\nimport com.google.gson.reflect.TypeToken\nimport com.trello.rxlifecycle2.LifecycleProvider\n\nclass HttpTrans(mLifecycle: LifecycleProvider<*>) : BaseTransation(mLifecycle) {\n    private var debug = true\n    private val TAG = HttpTrans::class.java.simpleName\n    fun getLiveList(callback : HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"_device\",GlobalProperties.DEVICE)\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"device\",GlobalProperties.DEVICE)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        //request.put(\"room_id\",roomId)\n        request.put(\"scale\",GlobalProperties.SCALE)\n        request.put(\"src\",GlobalProperties.SRC)\n        request.put(\"trace_id\",GlobalProperties.getTraceId())\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"version\",GlobalProperties.VERSION)\n\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                LogUtils.d(\"获取到的数据\" + element)\n                var modle = Gson().fromJson(element, LiveData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_HOST_NEW + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接的url---->$url, 屏幕像素---->${GlobalProperties.SCALE}\" )\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET,GlobalProperties.LIVE_HOST_NEW, request, mLifecycle,callback)\n    }\n\n\n    /**\n     * @param page 页码\n     * @param id 用户的av号\n     * fav 是否读取会员收藏状态 (默认 false)\n     */\n    fun getDetailInfo(page:Int,id:String,callback : HttpRxCallback<Any>) {\n        request.clear()\n        request.put(\"_device\",GlobalProperties.DEVICE)\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"device\",GlobalProperties.DEVICE)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"scale\",GlobalProperties.SCALE)\n        request.put(\"src\",GlobalProperties.SRC)\n        request.put(\"trace_id\",GlobalProperties.getTraceId())\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"version\",GlobalProperties.VERSION)\n        request.put(\"page\",page)\n        request.put(\"id\",id)\n\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                LogUtils.d(\"获取到的数据\" + element)\n                var modle = Gson().fromJson(element, VideoDetailData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.DETAIL_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接的获取视频详情的url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET,GlobalProperties.DETAIL_HOST,request, mLifecycle,callback)\n    }\n\n    /**\n     * 获取视频播放详情下面的推荐列表\n     * @param tid 分类编号 new排序为必填 其他为可选\n     * @param page 结果分页选择 默认为第1页\n     * @param pagesize 单页返回的记录条数，最大不超过100，默认为30\n     * @param order 排序方式 default new review hot damku comment promote\n     */\n    fun getRecommendList(tid:Int,page:Int,pagesize:Int,order:String,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"tid\",tid)\n        request.put(\"page\",page)\n        request.put(\"pagesize\",pagesize)\n        request.put(\"order\",order)\n\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                LogUtils.d(\"获取到的数据\" + element)\n                val modle = Gson().fromJson(element, VideoRecoData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.COMMEND_VIDEO_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接视频播放详情下面的推荐列表的url---->\" + url)\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET,GlobalProperties.COMMEND_VIDEO_HOST,request, mLifecycle,callback)\n    }\n\n    /**\n     * @param oid av号\n     * @param ps 每次请求获取多少个\n     * @param next 获取对应的评论楼层  根据all_count获取，如果为0就是带热评的\n     * 比如all_count为80 ps为20， 那么next为0 则获取到 60-80之间的楼层 next为80 一样是60-80之间的楼层，但是没有热评\n     */\n    fun getComment(oid:String,next:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"device\",GlobalProperties.DEVICE)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        //request.put(\"pn\",page)\n        request.put(\"next\",next)\n        request.put(\"ps\",20)\n        request.put(\"sort\",0)\n        request.put(\"type\",1)\n        request.put(\"oid\",oid)\n        request.put(\"trace_id\",GlobalProperties.getTraceId())\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"version\",GlobalProperties.VERSION)\n\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, CommentData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.COMMENT_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接的评论url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET,GlobalProperties.COMMENT_HOST,request, mLifecycle,callback)\n    }\n\n    /**\n     * 楼中楼评论\n     * http://api.bilibili.com/x/v2/reply/reply/cursor?oid=46996647&plat=2&root=1473740845&size=20&sort=0&type=1\n     */\n    fun getDoubleComment(oid:Int,root:Int,size:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"oid\",oid)\n        request.put(\"plat\",2)\n        request.put(\"root\",root)\n        request.put(\"size\",size)\n        request.put(\"sort\",0)\n        request.put(\"type\",1)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var jsonData = element.asJsonObject\n                var jsonRoot = jsonData.getAsJsonObject(\"root\")\n                var modle = Gson().fromJson(jsonRoot, CommentData.Reply::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.COMMENT_DOUBLE_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接的楼中楼评论url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET,GlobalProperties.COMMENT_DOUBLE_HOST,request, mLifecycle,callback)\n    }\n    /**\n     * 获取国内，日本推荐的番剧\n     * https://bangumi.bilibili.com/appindex/follow_index_page?appkey=1d8b6e7d45233436&build=502000&mobi_app=android&platform=android&ts=1493967208000&sign=3eff79d895af9cf800016%20fe8f6bc6ce0\n     */\n    fun getBanGumiRecommend(callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"device\",GlobalProperties.DEVICE)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"version\",GlobalProperties.VERSION)\n        //request.put(\"sign\",GlobalProperties.)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, MiKanRecommendData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.BANGUMI_CN_AND_JP_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接番剧的url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET,GlobalProperties.BANGUMI_CN_AND_JP_HOST, request,mLifecycle,callback)\n    }\n\n    /**\n     * 获取编辑推荐的番剧\n     * https://bangumi.bilibili.com/appindex/follow_index_fall?appkey=1d8b6e7d45233436&build=509000&cursor=0&mobi_app=android&platform=android&ts=1499937514&sign=2dae626fed99d43abbc9d09cfd124641\n     */\n    fun getBanGumiFall(cursor:Long,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"cursor\",cursor)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"version\",GlobalProperties.VERSION)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, MiKanFallData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.BANGUMI_FALL_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接编辑推荐的番剧的url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET,GlobalProperties.BANGUMI_FALL_HOST,request, mLifecycle,callback)\n    }\n\n\n    fun getRegion(callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"build\",GlobalProperties.BUILD)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<RegionData.Data>>() {}.getType()\n                var modle:List<RegionData.Data> = Gson().fromJson<List<RegionData.Data>>(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.CATEGORY_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接分区的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET,GlobalProperties.CATEGORY_HOST,request, mLifecycle,callback)\n    }\n\n    /**\n     * 分区推荐信息\n     */\n    fun getRegionRecommend(callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<RegionRecommendData.Data>>() {}.getType()\n                var modle:List<RegionRecommendData.Data> = Gson().fromJson<List<RegionRecommendData.Data>>(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.CATEGORY_RECOMMEND_HOST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"拼接分区推荐的url---->$url\")\n        }\n\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.CATEGORY_RECOMMEND_HOST,request, mLifecycle, callback)\n    }\n\n    /**\n     * 获取直播间up的信息，主要是uid的获取\n     * 这个接口必须要使用sign签名\n     */\n    fun getLiveUpInfo(roomId:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"actionKey\",\"appkey\")\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"channel\",\"bilibiil140\")\n        request.put(\"device\",GlobalProperties.DEVICE)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"room_id\",roomId)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"sign\",GlobalProperties.getSign(request))  //计算签名，然后作为参数  这里其实可以写一个拦截器，对所有请求进行签名\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element,LiveUpData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            Log.d(TAG,\"获取直播up信息的url---->\"+\n                    GlobalProperties.LIVE_UP_INFO + GlobalProperties.getUrlParamsByMap(request))\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_UP_INFO, request,mLifecycle, callback)\n    }\n\n\n    /**\n     * 获取直播间用户的信息\n     * @param ruid  直播间up主的uid\n     * @param uid 直播间用户的uid\n     */\n    fun getLiveUserInfo(ruid:Int,uid :Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"ruid\",ruid)\n        request.put(\"uid\",uid)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element,LiveUserData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_USER_INFO + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播用户信息的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_USER_INFO, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取金瓜榜\n     */\n    fun getLiveGoldList(roomId:Int,ruid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"next_offset\",\"0\")\n        request.put(\"room_id\",roomId)\n        request.put(\"ruid\",ruid)\n        request.put(\"rank_type\",\"gold-rank\")\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                //val type = object : TypeToken<List<FansGoldListData.FansInfo>>() {}.getType()\n                //var modle:List<FansGoldListData.FansInfo> = Gson().fromJson<List<FansGoldListData.FansInfo>>(element, type)\n                var modle: FansGoldListData = Gson().fromJson(element, FansGoldListData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_UP_GOLD_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播up金瓜榜的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_UP_GOLD_LIST, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取礼物榜\n     */\n    fun getLiveToDayList(roomId:Int,ruid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"next_offset\",0)\n        request.put(\"room_id\",roomId)\n        request.put(\"ruid\",ruid)\n        request.put(\"rank_type\",\"today-rank\")\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                //val type = object : TypeToken<List<FansGoldListData.FansInfo>>() {}.getType()\n                //var modle:List<FansGoldListData.FansInfo> = Gson().fromJson<List<FansGoldListData.FansInfo>>(element, type)\n                var modle: FansGoldListData = Gson().fromJson(element, FansGoldListData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_UP_GOLD_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播up礼物榜的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_UP_GOLD_LIST, request,mLifecycle, callback)\n    }\n\n\n    /**\n     * 获取粉丝榜\n     */\n    fun getLiveFansList(roomId:Int,ruid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"page\",1)\n        request.put(\"roomid\",roomId)\n        request.put(\"ruid\",ruid)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                //val type = object : TypeToken<List<FansGoldListData.FansInfo>>() {}.getType()\n                //var modle:List<FansGoldListData.FansInfo> = Gson().fromJson<List<FansGoldListData.FansInfo>>(element, type)\n                var modle: FansGoldListData = Gson().fromJson(element, FansGoldListData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_FANS_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播up粉丝榜的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_FANS_LIST, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取大航海\n     * @param page 1 页码\n     * @param pageSize 20 个数\n     */\n    fun getLiveFleetList(page:Int,pageSize:Int,ruid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"page\",page)\n        request.put(\"page_size\",pageSize)\n        request.put(\"ruid\",ruid)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle: FleetListData = Gson().fromJson(element, FleetListData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_FLEET_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播up大航海的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_FLEET_LIST, request,mLifecycle, callback)\n    }\n\n    /**\n     * 直播up主的视频投稿\n     */\n    fun getLiveUpVideoList(page:Int,pageSize:Int,ruid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"pn\",page)\n        request.put(\"ps\",pageSize)\n        request.put(\"mid\",ruid)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<UpInfoData>>() {}.getType()\n                var modle:List<UpInfoData> = Gson().fromJson<List<UpInfoData>>(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_UP_VIDEO_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播up视频投稿的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_UP_VIDEO_LIST, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取聊天的历史记录\n     */\n    fun getHistoryChat(roomId: Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"room_id\",roomId)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, LiveChatData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.LIVE_UP_CHAT_HISTORY + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取直播up聊天的历史记录的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_UP_CHAT_HISTORY, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取所有的直播列表\n     * @param page 从1开始\n     * @param pageSize 30\n     * @param areaId  分区的id\n     * @param parentAreaId 大分区的id   这两个为0 就是获取所有的tab\n     * @param type 类型  live_time 最新   online 热门 还有其他类型\n     */\n    fun getLiveAllList(page:Int,pageSize:Int,type:String,areaId:Int,parentAreaId:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"page\",page)\n        request.put(\"page_size\",pageSize)\n        request.put(\"sort_type\",type)\n        request.put(\"area_id\",areaId)\n        request.put(\"parent_area_id\",parentAreaId)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, LiveAllData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_ALL_URL, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取所有的直播分类tab\n     * @param parent_id  最外层的分类\n     */\n    fun getLiveTabList(parent_id:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"parent_id\",parent_id)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<LiveTabData.Tab>>() {}.getType()\n                var modle:List<LiveTabData.Tab> = Gson().fromJson<List<LiveTabData.Tab>>(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.LIVE_TAB_LIST_URL, request,mLifecycle, callback)\n    }\n\n    /**\n     * 获取分区详情\n     * https://app.bilibili.com/x/v2/region/dynamic?build=5410000&mobi_app=android&platform=android&rid=167\n     */\n    fun getRegionList(tid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"rid\",tid)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, RegionDetailData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.REGION_DETAIL_URL + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取分区详情的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.REGION_DETAIL_URL, request,mLifecycle, callback)\n    }\n\n    /**\n     * 分区加载更多\n     */\n    fun getRegionMoreList(rid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"pull\",false)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"rid\",rid)\n        request.put(\"ctime\",GlobalProperties.getSystemTime())\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, RegionDetailData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.REGION_DETAIL_LOADMORE_URL, request,mLifecycle, callback)\n    }\n\n    /**\n     * 分区局部刷新\n     */\n    fun refreshRegionLocality(type:String,rand:Int,rid:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"rand\",rand)\n        request.put(\"rid\",rid)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        var url = \"${GlobalProperties.REGION_LOCALITY_URL}$type?\"\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<RegionRecommendData.Data.Body>>() {}.getType()\n                var modle:List<RegionRecommendData.Data.Body> = Gson().fromJson<List<RegionRecommendData.Data.Body>>(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        getRequest().requestFullPath(HttpRequest.Method.GET, url, request,mLifecycle, callback)\n    }\n\n    /**\n     * 番剧详情\n     */\n    fun getBangumiDetail(season_id:String,type:String,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"appkey\",GlobalProperties.APP_KEY)\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"mobi_app\",GlobalProperties.MOBI_APP)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"season_id\",season_id)\n        request.put(\"ts\",GlobalProperties.getSystemTime())\n        request.put(\"type\",type)\n        request.put(\"sign\",GlobalProperties.getSign(request))  //计算签名，然后作为参数  这里其实可以写一个拦截器，对所有请求进行签名\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, BangumiDetailData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.BANGUMI_DETAIL + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取番剧详情的url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET, GlobalProperties.BANGUMI_DETAIL, request,mLifecycle, callback)\n    }\n\n\n    /**\n     * 番剧详情下面的推荐\n     * https://bangumi.bilibili.com/api/season/recommend/rnd/24618.json\n     */\n    fun getBangumiDetailRecommend(season_id:String,callback: HttpRxCallback<Any>){\n        request.clear()\n        var url = GlobalProperties.BANGUMI_RECOMMEND + \"$season_id.json\"\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, BangumiRecommendData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            Log.d(TAG,\"获取番剧详情下面的推荐的url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET, url, request,mLifecycle, callback)\n    }\n\n    fun getHotSearchWords(limit :Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"limit\",limit)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, HotWordsData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.SEARCH_HOT + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取大家都在搜的url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.SEARCH_HOT, request,mLifecycle, callback)\n    }\n\n    /**\n     * 根据关键字获取搜索结果\n     * @param word 关键字\n     * @param page 从1开始\n     * @param pageSize 20\n     */\n    fun getSearchResult(word :String, page:Int,pageSize:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"build\",GlobalProperties.BUILD)\n        request.put(\"duration\",0)\n        request.put(\"keyword\",word)\n        request.put(\"platform\",GlobalProperties.PLATFORM)\n        request.put(\"pn\",page)\n        request.put(\"ps\",pageSize)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, SearchResultData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.SEARCH_KEYWORD + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取搜索结果url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.SEARCH_KEYWORD, request,mLifecycle, callback)\n    }\n\n    /**\n     * 话题中心\n     */\n    fun getTopicCenter(page:Int,pageSize:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"page\",page)\n        request.put(\"pageSize\",pageSize)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, TopicCardData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.TOPIC_CENTER + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取话题中心url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET, GlobalProperties.TOPIC_CENTER, request,mLifecycle, callback)\n    }\n\n    /**\n     * 活动中心\n     */\n    fun getActivityCenter(page:Int,pageSize:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"page\",page)\n        request.put(\"pageSize\",pageSize)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                var modle = Gson().fromJson(element, TopicCardData::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.ACTIVITY_CENTER + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取活动中心url---->$url\")\n        }\n        getRequest().requestFullPathWithoutCheck(HttpRequest.Method.GET, GlobalProperties.ACTIVITY_CENTER, request,mLifecycle, callback)\n    }\n\n\n    /**\n     * 原创排行榜\n     * //原创\n     * order = bangumi 番剧\n     * order = all 全站\n     * order = origin 原创\n     */\n    fun getOriginRankingList(type :String, page:Int,pageSize:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"order\",type)\n        request.put(\"page\",page)\n        request.put(\"pageSize\",pageSize)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<RankListData.Item>>() {}.getType()\n                var modle :List<RankListData.Item> = Gson().fromJson(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.ORIGIN_RANKING_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取原创排行榜url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.ORIGIN_RANKING_LIST, request,mLifecycle, callback)\n    }\n\n    /**\n     * 全区排行榜\n     * @param rid  分区获取到的rid\n     */\n    fun getAllRegionRankingList(rid :Int, page:Int,pageSize:Int,callback: HttpRxCallback<Any>){\n        request.clear()\n        request.put(\"rid\",rid)\n        request.put(\"page\",page)\n        request.put(\"pageSize\",pageSize)\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n                val type = object : TypeToken<List<RankListData.Item>>() {}.getType()\n                var modle :List<RankListData.Item> = Gson().fromJson(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        if (debug){\n            var url = GlobalProperties.ALL_REGION_RANKING_LIST + GlobalProperties.getUrlParamsByMap(request)\n            Log.d(TAG,\"获取全区排行榜url---->$url\")\n        }\n        getRequest().requestFullPath(HttpRequest.Method.GET, GlobalProperties.ALL_REGION_RANKING_LIST, request,mLifecycle, callback)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/InitIalizeService.kt",
    "content": "package com.bilibili.lingxiao\n\nimport android.app.Application\nimport android.app.IntentService\nimport android.app.Notification\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.content.Intent\nimport android.content.Context\nimport android.graphics.Color\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport androidx.core.app.NotificationCompat\nimport com.bilibili.lingxiao.database.NetCacheDatabase\n\nimport com.camera.lingxiao.common.Common\nimport com.lingxiao.skinlibrary.SkinLib\nimport com.raizlabs.android.dbflow.config.FlowManager\nimport com.tencent.smtt.sdk.QbSdk\nimport com.raizlabs.android.dbflow.config.FlowConfig\n\n\n\n/**\n * An [IntentService] subclass for handling asynchronous task requests in\n * a service on a separate handler thread.\n *\n *\n * 初始化操作都放进这个service\n */\nclass InitIalizeService : IntentService(\"InitIalizeService\") {\n\n    override fun onCreate() {\n        super.onCreate()\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            //startForeground(1,new Notification());\n            startMyOwnForeground()\n        }\n    }\n\n\n    @RequiresApi(api = Build.VERSION_CODES.O)\n    private fun startMyOwnForeground() {\n        val NOTIFICATION_CHANNEL_ID = \"com.example.simpleapp\"\n        val channelName = \"My Background Service\"\n        val chan = NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE)\n        chan.lightColor = Color.BLUE\n        chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE\n        val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n        manager.createNotificationChannel(chan)\n\n        val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)\n        val notification = notificationBuilder.setOngoing(true)\n            .setSmallIcon(R.mipmap.ic_launcher)\n            .setContentTitle(\"App is running in background\")\n            .setPriority(NotificationManager.IMPORTANCE_MIN)\n            .setCategory(Notification.CATEGORY_SERVICE)\n            .build()\n        startForeground(2, notification)\n    }\n\n    override fun onHandleIntent(intent: Intent?) {\n        if (intent != null) {\n            val action = intent.action\n            if (ACTION_FOO == action) {\n                performInit()\n            }\n        }\n    }\n\n    /**\n     * 初始化操作\n     */\n    private fun performInit() {\n        SkinLib.init(mContext as Application)\n        QbSdk.initX5Environment(this, null)\n        Common.initCrash(this, true)\n        FlowManager.init(FlowConfig.Builder(this).build())\n    }\n\n    companion object {\n        // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS\n        private val ACTION_FOO = \"com.lingxiaosuse.picture.tudimension.service.action.FOO\"\n        private lateinit var mContext: Context\n        fun initialize(context: Context) {\n            val intent = Intent(context, InitIalizeService::class.java)\n            intent.action = ACTION_FOO\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                context.startForegroundService(intent)\n            } else {\n                context.startService(intent)\n            }\n            //context.startService(intent);\n            mContext = context\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/SplashActivity.kt",
    "content": "package com.bilibili.lingxiao\n\nimport android.view.View\nimport android.view.animation.Animation\nimport com.camera.lingxiao.common.app.BaseActivity\nimport android.view.animation.ScaleAnimation\nimport android.view.animation.AnimationSet\nimport com.bilibili.lingxiao.home.MainActivity\nimport kotlinx.android.synthetic.main.activity_splash.*\n\n\nclass SplashActivity : BaseActivity() {\n    override val contentLayoutId: Int\n        get() = R.layout.activity_splash\n\n    override fun initWidget() {\n        super.initWidget()\n        startAnim(splash_root)\n    }\n\n    private fun startAnim(view: View) {\n        val animationSet = AnimationSet(true)\n        val scaleAnimation = ScaleAnimation(\n            0.98f, 1.0f, 0.98f, 1.0f,\n            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f\n        )\n        scaleAnimation.duration = 1000\n        //将AlphaAnimation这个已经设置好的动画添加到 AnimationSet中\n        animationSet.addAnimation(scaleAnimation)\n        animationSet.fillAfter = true\n        //启动动画\n        view.startAnimation(animationSet)\n        scaleAnimation.setAnimationListener(object : Animation.AnimationListener {\n            override fun onAnimationStart(animation: Animation) {\n\n            }\n\n            override fun onAnimationEnd(animation: Animation) {\n                StartActivity(MainActivity::class.java, true)\n            }\n\n            override fun onAnimationRepeat(animation: Animation) {\n\n            }\n        })\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/dagger/UiComponent.kt",
    "content": "package com.bilibili.lingxiao.dagger\n\nimport com.bilibili.lingxiao.home.MainActivity\nimport com.bilibili.lingxiao.home.region.ui.RegionFragment\nimport com.bilibili.lingxiao.home.live.ui.LiveFragment\nimport com.bilibili.lingxiao.home.mikan.ui.MikanFragment\nimport com.bilibili.lingxiao.home.recommend.ui.RecommendFragment\nimport com.bilibili.lingxiao.dagger.scope.PerUi\nimport com.bilibili.lingxiao.home.dynamic.DynamicFragment\nimport com.bilibili.lingxiao.home.find.ui.FindFragment\nimport com.bilibili.lingxiao.home.live.ui.play.FansFragment\nimport com.bilibili.lingxiao.home.live.ui.play.FleetListFragment\nimport com.bilibili.lingxiao.home.live.ui.play.InteractFragment\nimport com.bilibili.lingxiao.home.live.ui.play.UpInfoFragment\nimport com.bilibili.lingxiao.home.live.ui.LivePlayActivity\nimport com.bilibili.lingxiao.play.ui.CommentDetailFragment\nimport com.bilibili.lingxiao.play.ui.CommentFragment\nimport com.bilibili.lingxiao.play.ui.IntroduceFragment\nimport com.bilibili.lingxiao.play.ui.PlayActivity\nimport dagger.Component\n\n@Component(modules = [UiModule::class])\n@PerUi\ninterface UiComponent {\n    fun inject(liveFragment: LiveFragment)\n    fun inject(recommendFragment: RecommendFragment)\n    fun inject(hotFragment: RegionFragment)\n    fun inject(mikanFragment: MikanFragment)\n    fun inject(dynamicFragment: DynamicFragment)\n    fun inject(findFragment: FindFragment)\n\n    fun inject(introduceFragment: IntroduceFragment)\n    fun inject(commentFragment: CommentFragment)\n    fun inject(commentDetailFragment: CommentDetailFragment)\n\n    fun inject(interactFragment: InteractFragment)\n    fun inject(upInfoFragment: UpInfoFragment)\n    fun inject(fansFragment: FansFragment)\n    fun inject(fleetListFragment: FleetListFragment)\n\n\n    fun inject(mainActivity: MainActivity)\n    fun inject(playActivity: PlayActivity)\n    fun inject(livePlayActivity: LivePlayActivity)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/dagger/UiModule.kt",
    "content": "package com.bilibili.lingxiao.dagger\n\nimport android.content.Context\nimport com.bilibili.lingxiao.home.region.ui.RegionFragment\nimport com.bilibili.lingxiao.home.live.ui.LiveFragment\nimport com.bilibili.lingxiao.home.mikan.ui.MikanFragment\nimport com.bilibili.lingxiao.home.recommend.ui.RecommendFragment\nimport com.bilibili.lingxiao.dagger.scope.PerUi\nimport com.bilibili.lingxiao.home.dynamic.DynamicFragment\nimport com.bilibili.lingxiao.home.find.ui.FindFragment\nimport com.bilibili.lingxiao.home.live.ui.play.FansFragment\nimport com.bilibili.lingxiao.home.live.ui.play.FleetListFragment\nimport com.bilibili.lingxiao.home.live.ui.play.InteractFragment\nimport com.bilibili.lingxiao.home.live.ui.play.UpInfoFragment\nimport com.bilibili.lingxiao.play.ui.CommentDetailFragment\nimport com.bilibili.lingxiao.play.ui.CommentFragment\nimport com.bilibili.lingxiao.play.ui.IntroduceFragment\nimport dagger.Module\nimport dagger.Provides\n@Module\nclass UiModule {\n    @Provides\n    @PerUi\n    fun provideLiveFragment() : LiveFragment {\n        return LiveFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideRecommendFragment() : RecommendFragment {\n        return RecommendFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideHotFragment() : RegionFragment {\n        return RegionFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideMikanFragment() : MikanFragment {\n        return MikanFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideDynamicFragment() : DynamicFragment {\n        return DynamicFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideFindFragment() : FindFragment {\n        return FindFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideIntroduceFragment() : IntroduceFragment {\n        return IntroduceFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideCommentFragment() : CommentFragment {\n        return CommentFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideInteractFragment() : InteractFragment {\n        return InteractFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideUpInfoFragment() : UpInfoFragment {\n        return UpInfoFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideFansFragment() : FansFragment {\n        return FansFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideFleetListFragment() : FleetListFragment {\n        return FleetListFragment()\n    }\n\n    @Provides\n    @PerUi\n    fun provideCommentDetailFragment() : CommentDetailFragment {\n        return CommentDetailFragment()\n    }\n\n    private lateinit var context: Context\n    fun UiModule(context: Context) {\n        this.context = context\n    }\n\n    @Provides\n    @PerUi\n    fun provideContext() : Context {\n        return context\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/dagger/scope/PerUi.kt",
    "content": "package com.bilibili.lingxiao.dagger.scope\n\nimport javax.inject.Scope\nimport java.lang.annotation.Retention\nimport java.lang.annotation.RetentionPolicy\n\n/**\n * 自定义Scope实现单例\n * 不只用dagger提供的Singleton而且还用自定义的，是因为我们使用的域不一样\n */\n@Scope\n@Retention(RetentionPolicy.RUNTIME)\nannotation class PerUi"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/database/NetCacheDatabase.kt",
    "content": "package com.bilibili.lingxiao.database\n\nimport com.raizlabs.android.dbflow.annotation.Database\n\n\n@Database(name = NetCacheDatabase.NAME,version = NetCacheDatabase.VERSION)\nclass NetCacheDatabase {\n    companion object{\n        const val NAME = \"NetCache\"\n        const val VERSION = 1\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/database/RegionTable.kt",
    "content": "package com.bilibili.lingxiao.database\n\nimport com.raizlabs.android.dbflow.annotation.Column\nimport com.raizlabs.android.dbflow.annotation.PrimaryKey\nimport com.raizlabs.android.dbflow.annotation.Table\nimport com.raizlabs.android.dbflow.structure.BaseModel\n\n@Table(database = NetCacheDatabase::class)\nclass RegionTable : BaseModel(){\n    @PrimaryKey\n    var reid: Int = 0\n    //var children: List<Children>? by oneToMany { select from Children::class }\n    @Column\n    var logo = \"\"\n    @Column\n    var name = \"\"\n    @Column\n    var tid: Int? = null\n    @Column\n    var type: Int? = null\n    @Column\n    var uri: String? = null\n    @Column\n    var updateAt :Long = 0L\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/database/UserInfoTable.kt",
    "content": "package com.bilibili.lingxiao.database\n\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport com.hiczp.bilibili.api.app.model.MyInfo\n\n@Entity\ndata class UserInfoTable(\n    @PrimaryKey val uid: Long,\n    var birthday: String, //生日\n    var coins: Int, // 硬币\n    var face: String,//头像\n    var level: Int, // 等级\n    var name: String, // czp3009\n    var sex: Int, // 0\n    var sign: String,\n    var silence: Int, // 0\n    var telStatus: Int, // 1\n    @Embedded var official: MyInfo.Data.Official,\n    @Embedded var vip: MyInfo.Data.Vip\n) {\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/database/dao/UserDao.kt",
    "content": "package com.bilibili.lingxiao.database.dao\n\nimport androidx.room.*\nimport com.bilibili.lingxiao.database.UserInfoTable\n\n@Dao\ninterface UserDao {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)  //发生冲突后 取代旧数据同时继续事务\n    fun insertUser(userInfoTable: UserInfoTable)\n\n    @Delete\n    fun deleteUser(userInfoTable: UserInfoTable)\n\n    @Update\n    fun update(userInfoTable: UserInfoTable)\n\n    @Query(\"SELECT * FROM UserInfoTable WHERE uid IS :mid LIMIT 1\")\n    fun findById(mid:Long):UserInfoTable?\n\n    @Query(\"SELECT * FROM UserInfoTable LIMIT 1\")\n    fun findUser():UserInfoTable?\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/database/db/AppDatabase.kt",
    "content": "package com.bilibili.lingxiao.database.db\n\nimport androidx.room.Database\nimport androidx.room.RoomDatabase\nimport com.bilibili.lingxiao.database.UserInfoTable\nimport com.bilibili.lingxiao.database.dao.UserDao\n\n@Database(entities = arrayOf(UserInfoTable::class), version = 1)\nabstract class AppDatabase :RoomDatabase(){\n    abstract fun userDao(): UserDao\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/MainActivity.kt",
    "content": "package com.bilibili.lingxiao.home\n\n\nimport android.Manifest\nimport android.net.Uri\n\nimport androidx.appcompat.app.ActionBarDrawerToggle\nimport android.view.Gravity\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.dynamic.DynamicFragment\nimport com.bilibili.lingxiao.home.find.ui.FindFragment\nimport com.bilibili.lingxiao.home.live.adapter.PlayPagerAdapter\nimport com.bilibili.lingxiao.home.region.ui.RegionFragment\nimport com.bilibili.lingxiao.home.live.ui.LiveFragment\nimport com.bilibili.lingxiao.home.mikan.ui.MikanFragment\nimport com.bilibili.lingxiao.home.navigation.SettingActivity\nimport com.bilibili.lingxiao.home.navigation.ThemeActivity\nimport com.bilibili.lingxiao.home.recommend.ui.RecommendFragment\nimport com.bilibili.lingxiao.user.LoginActivity\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.rxbus.SkinChangedEvent\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport kotlinx.android.synthetic.main.activity_main.*\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\nimport pub.devrel.easypermissions.AppSettingsDialog\nimport pub.devrel.easypermissions.EasyPermissions\nimport javax.inject.Inject\nimport com.camera.lingxiao.common.app.ActivityController\nimport com.camera.lingxiao.common.utills.SpUtils\nimport com.facebook.drawee.drawable.ScalingUtils\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.facebook.imagepipeline.common.ImageDecodeOptionsBuilder\nimport com.google.android.material.internal.NavigationMenuView\nimport com.google.gson.Gson\nimport com.hiczp.bilibili.api.app.model.MyInfo\n\n\nclass MainActivity : BaseActivity() {\n\n    private val tabArray by lazy {\n     resources.getStringArray(R.array.main_tab)\n    }\n    private var drawerOpened = false\n    private val mPermessions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE,\n        Manifest.permission.READ_EXTERNAL_STORAGE)\n\n    @Inject\n    lateinit var liveFragment: LiveFragment\n    @Inject\n    lateinit var recommendFragment: RecommendFragment\n    @Inject\n    lateinit var categoryFragment: RegionFragment\n    @Inject\n    lateinit var mikanFragment: MikanFragment\n    @Inject\n    lateinit var dynamicFragment: DynamicFragment\n    @Inject\n    lateinit var findFragment: FindFragment\n\n    private var fragmentList:ArrayList<BaseFragment> = arrayListOf()\n\n    override val contentLayoutId: Int\n        get() = R.layout.activity_main\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onSkinChanged(event : SkinChangedEvent){\n        UltimateBar.newColorBuilder()\n            .statusColor(event.color)   // 状态栏颜色\n            .applyNav(true)             // 是否应用到导航栏\n            .navColor(event.color)         // 导航栏颜色\n            .build(this)\n            .apply()\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN)\n    fun onLogined(user: MyInfo){\n        changeLoginedState(user)\n    }\n\n    override fun initWidget() {\n        super.initWidget()\n        //权限检测\n        if (!EasyPermissions.hasPermissions(this, *mPermessions)){\n            //没有权限就申请\n            EasyPermissions.requestPermissions(this, \"申请权限\",\n                100, *mPermessions)\n        }\n        setSupportActionBar(main_toolbar)\n        //设置返回键可用\n        //supportActionBar?.setHomeButtonEnabled(true);\n        //supportActionBar?.setDisplayHomeAsUpEnabled(true);\n        supportActionBar?.setDisplayShowTitleEnabled(false)\n        initNavigationView()\n        initTabLayout()\n        image_header.setOnClickListener {\n            StartActivity(LoginActivity::class.java,false)\n        }\n        image_download.setOnClickListener {  }\n        image_game.setOnClickListener {  }\n        image_search.setOnClickListener {\n            val popwindowUtil = PopwindowUtil.PopupWindowBuilder(this@MainActivity)\n                .setView(R.layout.fragment_dialog_search)\n                .size(ViewGroup.LayoutParams.MATCH_PARENT.toFloat(),ViewGroup.LayoutParams.WRAP_CONTENT.toFloat())\n                .setFocusable(true)\n                .setTouchable(true)\n                .setOutsideTouchable(true)\n                .create()\n            popwindowUtil.showAtLocation(it,0,-it.height,Gravity.TOP,0.5f)\n            popwindowUtil.getView<ImageView>(R.id.image_exit)!!.setOnClickListener {\n                popwindowUtil.dissmiss()\n            }\n        }\n        val info = SpUtils.getString(this, GlobalProperties.USER_INFO, \"\")\n        if (info.isNotEmpty()){\n            val userInfo = Gson().fromJson(info,MyInfo::class.java)\n            changeLoginedState(userInfo)\n        }\n    }\n\n    private lateinit var navigationView:View\n    private fun initNavigationView() {\n        val drawerToggle = object : ActionBarDrawerToggle(this,main_drawer_layout,\n            main_toolbar, R.string.open, R.string.close\n        ){\n            override fun onDrawerOpened(drawerView: View) {\n                super.onDrawerOpened(drawerView)\n                drawerOpened = true\n            }\n\n            override fun onDrawerClosed(drawerView: View) {\n                super.onDrawerClosed(drawerView)\n                drawerOpened = false\n            }\n        }\n        main_drawer_layout.addDrawerListener(drawerToggle)//设置侧滑监听\n        //drawerToggle.syncState()//设置左箭头与Home图标的切换与侧滑同步\n        image_drawer_home.setOnClickListener {\n            if (drawerOpened){\n                main_drawer_layout.closeDrawer(Gravity.START)\n            }else{\n                main_drawer_layout.openDrawer(Gravity.START)\n            }\n        }\n        navigationView = main_navigation.inflateHeaderView(R.layout.nav_header)\n        val headerView = navigationView.findViewById<SimpleDraweeView>(R.id.nav_header)\n        headerView.setOnClickListener{\n            StartActivity(LoginActivity::class.java,false)\n        }\n        findViewById<LinearLayout>(R.id.ll_nav_setting)\n            .setOnClickListener {\n                StartActivity(SettingActivity::class.java,false)\n            }\n        findViewById<LinearLayout>(R.id.ll_nav_theme)\n            .setOnClickListener {\n                StartActivity(ThemeActivity::class.java,false)\n            }\n        //隐藏NavigationView右侧滚动条\n        val navigationMenuView = main_navigation.getChildAt(0) as NavigationMenuView\n        navigationMenuView.isVerticalScrollBarEnabled = false\n    }\n\n    private fun changeLoginedState(user:MyInfo){\n        val name = navigationView.findViewById<TextView>(R.id.text_name)\n        val dynamicNum = navigationView.findViewById<TextView>(R.id.dynamic_num)\n        val followedNum = navigationView.findViewById<TextView>(R.id.followed_num)\n        val followingNum = navigationView.findViewById<TextView>(R.id.following_num)\n        val headerView = navigationView.findViewById<SimpleDraweeView>(R.id.nav_header)\n\n        headerView.hierarchy.actualImageScaleType = ScalingUtils.ScaleType.CENTER_CROP\n        val imageDecode = ImageDecodeOptionsBuilder().setForceStaticImage(true).build()\n\n        user.data.let {\n            headerView.setImageURI(Uri.parse(it.face))\n            name.text = it.name\n            dynamicNum.text = \"0\"\n            followedNum.text = \"0\"\n            followingNum.text = \"0\"\n        }\n        image_header.setImageURI(Uri.parse(user.data.face))\n        username.text = user.data.name\n    }\n\n    private fun initTabLayout() {\n        for (name in tabArray){\n            main_tabLayout.addTab(main_tabLayout.newTab().setText(name))\n        }\n        fragmentList.add(liveFragment)\n        fragmentList.add(recommendFragment)\n        fragmentList.add(categoryFragment)\n        fragmentList.add(mikanFragment)\n        fragmentList.add(dynamicFragment)\n        fragmentList.add(findFragment)\n        main_viewPager.adapter =\n            PlayPagerAdapter(supportFragmentManager, tabArray, fragmentList)\n        main_tabLayout.setupWithViewPager(main_viewPager)\n        main_viewPager.currentItem = 1\n        //设置viewpager缓存页面个数\n        main_viewPager.offscreenPageLimit = 4\n    }\n\n    private var preTime: Long = 0\n    override fun onBackPressed() {\n        if (drawerOpened){\n            main_drawer_layout.closeDrawers()\n        }else{\n            val nowTime = System.currentTimeMillis()\n            if (nowTime - preTime > 2000) {\n                ToastUtil.show(\"再按一次退出\")\n                preTime = nowTime\n            } else {\n                ActivityController.finishAll()\n            }\n            //super.onBackPressed()\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        fragmentList.clear()\n    }\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    }\n    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {\n        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {\n            AppSettingsDialog.Builder(this).build().show()\n        }\n    }\n\n    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/dynamic/DynamicFragment.kt",
    "content": "package com.bilibili.lingxiao.home.dynamic\n\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\n\nclass DynamicFragment :BaseFragment(){\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_dynamic\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/FindView.kt",
    "content": "package com.bilibili.lingxiao.home.find\n\nimport com.bilibili.lingxiao.home.find.model.HotWordsData\nimport com.bilibili.lingxiao.home.find.model.SearchResultData\nimport com.bilibili.lingxiao.home.region.model.RegionData\n\ninterface FindView {\n    fun onGetHotWords(wordsData: HotWordsData)\n    fun onGetSearchResult(result: SearchResultData)\n    fun onGetRegion(list: List<RegionData.Data>)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/RankListView.kt",
    "content": "package com.bilibili.lingxiao.home.find\n\nimport com.bilibili.lingxiao.home.find.model.RankListData\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface RankListView :BaseView{\n    fun onGetRankList(data :MutableList<RankListData.Item>)\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/TopicView.kt",
    "content": "package com.bilibili.lingxiao.home.find\n\nimport com.bilibili.lingxiao.home.find.model.TopicCardData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface TopicView :BaseView{\n    fun onGetTopicResult(data :TopicCardData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/model/HotWordsData.kt",
    "content": "package com.bilibili.lingxiao.home.find.model\n\n\nimport com.google.gson.annotations.SerializedName\n\ndata class HotWordsData(\n    @SerializedName(\"list\")\n    val list: List<HotWord>,\n    @SerializedName(\"trackid\")\n    val trackid: String\n) {\n    data class HotWord(\n        @SerializedName(\"keyword\")\n        val keyword: String,\n        @SerializedName(\"name_type\")\n        val nameType: String,\n        @SerializedName(\"status\")\n        val status: String,\n        @SerializedName(\"word_type\")\n        val wordType: Int\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/model/RankListData.kt",
    "content": "package com.bilibili.lingxiao.home.find.model\n\n\nimport com.google.gson.annotations.SerializedName\n\ndata class RankListData(\n    @SerializedName(\"data\")\n    val `data`: List<Item>\n) {\n    data class Item(\n        @SerializedName(\"param\")\n        val `param`: String,\n        @SerializedName(\"children\")\n        val children: List<Children>?,\n        @SerializedName(\"cid\")\n        val cid: Int,\n        @SerializedName(\"cover\")\n        val cover: String,\n        @SerializedName(\"danmaku\")\n        val danmaku: Int,\n        @SerializedName(\"duration\")\n        val duration: Int,\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"favourite\")\n        val favourite: Int,\n        @SerializedName(\"follower\")\n        val follower: Int,\n        @SerializedName(\"goto\")\n        val goto: String,\n        @SerializedName(\"like\")\n        val like: Int,\n        @SerializedName(\"mid\")\n        val mid: Int,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"official_verify\")\n        val officialVerify: OfficialVerify,\n        @SerializedName(\"play\")\n        val play: Int,\n        @SerializedName(\"pts\")\n        val pts: Int,\n        @SerializedName(\"pubdate\")\n        val pubdate: Int,\n        @SerializedName(\"reply\")\n        val reply: Int,\n        @SerializedName(\"rid\")\n        val rid: Int,\n        @SerializedName(\"rname\")\n        val rname: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"uri\")\n        val uri: String\n    ) {\n        data class OfficialVerify(\n            @SerializedName(\"desc\")\n            val desc: String,\n            @SerializedName(\"type\")\n            val type: Int\n        )\n\n        data class Children(\n            @SerializedName(\"param\")\n            val `param`: String,\n            @SerializedName(\"cid\")\n            val cid: Int,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"danmaku\")\n            val danmaku: Int,\n            @SerializedName(\"duration\")\n            val duration: Int,\n            @SerializedName(\"face\")\n            val face: String,\n            @SerializedName(\"favourite\")\n            val favourite: Int,\n            @SerializedName(\"goto\")\n            val goto: String,\n            @SerializedName(\"like\")\n            val like: Int,\n            @SerializedName(\"mid\")\n            val mid: Int,\n            @SerializedName(\"name\")\n            val name: String,\n            @SerializedName(\"play\")\n            val play: Int,\n            @SerializedName(\"pts\")\n            val pts: Int,\n            @SerializedName(\"pubdate\")\n            val pubdate: Int,\n            @SerializedName(\"reply\")\n            val reply: Int,\n            @SerializedName(\"rid\")\n            val rid: Int,\n            @SerializedName(\"rname\")\n            val rname: String,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"uri\")\n            val uri: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/model/SearchResultData.kt",
    "content": "package com.bilibili.lingxiao.home.find.model\n\n\nimport com.google.gson.annotations.SerializedName\n\ndata class SearchResultData(\n    @SerializedName(\"array\")\n    val array: Int,\n    @SerializedName(\"attribute\")\n    val attribute: Int,\n    @SerializedName(\"item\")\n    val item: List<Item>,\n    @SerializedName(\"items\")\n    val items: Items,\n    @SerializedName(\"nav\")\n    val nav: List<Nav>,\n    @SerializedName(\"page\")\n    val page: Int,\n    @SerializedName(\"trackid\")\n    val trackid: String\n) {\n    class Items(\n    )\n\n    data class Nav(\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"pages\")\n        val pages: Int,\n        @SerializedName(\"total\")\n        val total: Int,\n        @SerializedName(\"type\")\n        val type: Int\n    )\n\n    data class Item(\n        @SerializedName(\"param\")\n        val `param`: String,\n        @SerializedName(\"archives\")\n        val archives: Int,\n        @SerializedName(\"attentions\")\n        val attentions: Int,\n        @SerializedName(\"author\")\n        val author: String?,\n        @SerializedName(\"av_items\")\n        val avItems: List<AvItem>,\n        @SerializedName(\"badge\")\n        val badge: String,\n        @SerializedName(\"cover\")\n        val cover: String?,\n        @SerializedName(\"danmaku\")\n        val danmaku: Int?,\n        @SerializedName(\"desc\")\n        val desc: String,\n        @SerializedName(\"duration\")\n        val duration: String,\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"fans\")\n        val fans: Int,\n        @SerializedName(\"goto\")\n        val goto: String,\n        @SerializedName(\"is_up\")\n        val isUp: Boolean,\n        @SerializedName(\"level\")\n        val level: Int,\n        @SerializedName(\"linktype\")\n        val linktype: String,\n        @SerializedName(\"live_uri\")\n        val liveUri: String,\n        @SerializedName(\"mid\")\n        val mid: Int,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"new_rec_tags\")\n        val newRecTags: List<NewRecTag>,\n        @SerializedName(\"official_verify\")\n        val officialVerify: OfficialVerify,\n        @SerializedName(\"online\")\n        val online: Int,\n        @SerializedName(\"play\")\n        val play: Int?,\n        @SerializedName(\"position\")\n        val position: Int,\n        @SerializedName(\"rating\")\n        val rating: Double,\n        @SerializedName(\"rec_tags\")\n        val recTags: List<String>,\n        @SerializedName(\"region\")\n        val region: Int,\n        @SerializedName(\"roomid\")\n        val roomid: Int,\n        @SerializedName(\"sign\")\n        val sign: String,\n        @SerializedName(\"tags\")\n        val tags: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"trackid\")\n        val trackid: String,\n        @SerializedName(\"type\")\n        val type: String,\n        @SerializedName(\"uri\")\n        val uri: String,\n        @SerializedName(\"vip\")\n        val vip: Vip\n    ) {\n        data class AvItem(\n            @SerializedName(\"param\")\n            val `param`: String,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"ctime\")\n            val ctime: Int,\n            @SerializedName(\"danmaku\")\n            val danmaku: Int,\n            @SerializedName(\"duration\")\n            val duration: String,\n            @SerializedName(\"goto\")\n            val goto: String,\n            @SerializedName(\"play\")\n            val play: Int,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"uri\")\n            val uri: String\n        )\n\n        data class Vip(\n            @SerializedName(\"due_date\")\n            val dueDate: Int,\n            @SerializedName(\"label\")\n            val label: Label,\n            @SerializedName(\"status\")\n            val status: Int,\n            @SerializedName(\"theme_type\")\n            val themeType: Int,\n            @SerializedName(\"type\")\n            val type: Int,\n            @SerializedName(\"vip_pay_type\")\n            val vipPayType: Int\n        ) {\n            data class Label(\n                @SerializedName(\"path\")\n                val path: String\n            )\n        }\n\n        data class OfficialVerify(\n            @SerializedName(\"desc\")\n            val desc: String,\n            @SerializedName(\"type\")\n            val type: Int\n        )\n\n        data class NewRecTag(\n            @SerializedName(\"bg_color\")\n            val bgColor: String,\n            @SerializedName(\"bg_color_night\")\n            val bgColorNight: String,\n            @SerializedName(\"bg_style\")\n            val bgStyle: Int,\n            @SerializedName(\"border_color\")\n            val borderColor: String,\n            @SerializedName(\"border_color_night\")\n            val borderColorNight: String,\n            @SerializedName(\"text\")\n            val text: String,\n            @SerializedName(\"text_color\")\n            val textColor: String,\n            @SerializedName(\"text_color_night\")\n            val textColorNight: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/model/TopicCardData.kt",
    "content": "package com.bilibili.lingxiao.home.find.model\n\n\nimport com.google.gson.annotations.SerializedName\n\ndata class TopicCardData(\n    @SerializedName(\"code\")\n    val code: Int,\n    @SerializedName(\"list\")\n    val list: List<Item>,\n    @SerializedName(\"pages\")\n    val pages: Int,\n    @SerializedName(\"total\")\n    val total: Int\n) {\n    data class Item(\n        @SerializedName(\"cover\")\n        val cover: String,\n        @SerializedName(\"link\")\n        val link: String,\n        @SerializedName(\"state\")\n        val state: Int?,\n        @SerializedName(\"title\")\n        val title: String\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/presenter/FindPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.find.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.database.RegionTable\nimport com.bilibili.lingxiao.home.find.FindView\nimport com.bilibili.lingxiao.home.find.model.HotWordsData\nimport com.bilibili.lingxiao.home.find.ui.FindFragment\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass FindPresenter(view: FindView, fragment: FindFragment)\n    :BasePresenter<FindView, FindFragment>(view, fragment) {\n    private val httpTrans: HttpTrans by lazy {\n        HttpTrans(fragment)\n    }\n    fun getHotWords(limit :Int){\n        httpTrans.getHotSearchWords(limit,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetHotWords(lists[0] as HotWordsData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n\n    fun getRegion(){\n\n        httpTrans.getRegion(object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                var list = lists[0] as List<RegionData.Data>\n                /*var timeStamp = System.currentTimeMillis()\n                list.forEach {\n                    val region = RegionTable()\n                    region.logo = it.logo\n                    region.name = it.name\n                    region.reid = it.reid\n                    region.tid = it.tid\n                    region.type = it.type\n                    region.uri = it.uri\n                    region.updateAt = timeStamp\n                    region.save()\n                }*/\n                mView?.onGetRegion(list)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                //mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/presenter/RankListPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.find.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.find.RankListView\nimport com.bilibili.lingxiao.home.find.model.RankListData\nimport com.bilibili.lingxiao.home.find.ui.RankListFragment\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass RankListPresenter(view: RankListView, fragment: RankListFragment) :\n    BasePresenter<RankListView, RankListFragment>(view, fragment) {\n    private val httpTrans: HttpTrans by lazy {\n        HttpTrans(fragment)\n    }\n\n    fun getOriginRankingList(type :String, page:Int,pageSize:Int){\n        httpTrans.getOriginRankingList(type,page,pageSize,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetRankList(lists[0] as MutableList<RankListData.Item>)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n\n    fun getALlRegionRankingList(rid :Int, page:Int,pageSize:Int){\n        httpTrans.getAllRegionRankingList(rid, page, pageSize,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetRankList(lists[0] as MutableList<RankListData.Item>)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/presenter/SearchDetailPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.find.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.find.FindView\nimport com.bilibili.lingxiao.home.find.model.SearchResultData\nimport com.bilibili.lingxiao.home.find.ui.SearchDetailActivity\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass SearchDetailPresenter(view: FindView, activity: SearchDetailActivity)\n    : BasePresenter<FindView, SearchDetailActivity>(view, activity) {\n    private val httpTrans: HttpTrans by lazy {\n        HttpTrans(activity)\n    }\n\n    fun getSearchResult(word:String,page:Int,pageSize:Int){\n        httpTrans.getSearchResult(word,page,pageSize,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetSearchResult(lists[0] as SearchResultData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/presenter/TopicCenterPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.find.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.find.TopicView\nimport com.bilibili.lingxiao.home.find.model.TopicCardData\nimport com.bilibili.lingxiao.home.find.ui.TopicCenterActivity\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass TopicCenterPresenter(view: TopicView, activity: TopicCenterActivity) :\n    BasePresenter<TopicView, TopicCenterActivity>(view, activity) {\n    private val httpTrans: HttpTrans by lazy {\n        HttpTrans(activity)\n    }\n\n    fun getTopicCenter(page:Int,pageSize:Int){\n        httpTrans.getTopicCenter(page,pageSize,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetTopicResult(lists[0] as TopicCardData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n\n\n    fun getActivityCenter(page:Int,pageSize:Int){\n        httpTrans.getActivityCenter(page,pageSize,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetTopicResult(lists[0] as TopicCardData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/ui/FindFragment.kt",
    "content": "package com.bilibili.lingxiao.home.find.ui\n\nimport android.content.Intent\nimport com.google.android.material.snackbar.Snackbar\nimport android.util.Log\nimport android.view.Gravity\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.database.RegionTable\nimport com.bilibili.lingxiao.home.find.presenter.FindPresenter\nimport com.bilibili.lingxiao.home.find.FindView\nimport com.bilibili.lingxiao.home.find.model.HotWordsData\nimport com.bilibili.lingxiao.home.find.model.SearchResultData\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.user.LoginActivity\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.bilibili.lingxiao.widget.LaybelLayout\n\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport com.raizlabs.android.dbflow.sql.language.SQLite\nimport kotlinx.android.synthetic.main.fragment_find.*\nimport kotlinx.android.synthetic.main.fragment_find.view.*\nimport org.greenrobot.eventbus.EventBus\n\nclass FindFragment :BaseFragment(), FindView,View.OnClickListener{\n    private val TAG = FindFragment::class.java.simpleName\n    private var presenter: FindPresenter =\n        FindPresenter(this, this)\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_find\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        root.interest_group.setOnClickListener(this)\n        root.topic_center.setOnClickListener(this)\n        root.activity_center.setOnClickListener(this)\n        root.black_door.setOnClickListener(this)\n        root.origin_rank_list.setOnClickListener(this)\n        root.all_rank_list.setOnClickListener(this)\n        root.round_shop.setOnClickListener(this)\n        root.show_more.setOnClickListener {\n            if (root.laybel.isCollapsed()){\n                text_show_more.text = \"折叠\"\n                image_show_more.setImageResource(R.drawable.ic_arrow_up)\n            }else{\n                image_show_more.setImageResource(R.drawable.ic_arrow_down_gray_round)\n                text_show_more.text = \"查看更多\"\n            }\n            root.laybel.startAnimation()\n        }\n        root.laybel.setOnLaybelClickListener(object : LaybelLayout.LaybelItemClickListener{\n            override fun onLaybelItemClick(keyWord: String) {\n                Snackbar.make(root.laybel,keyWord,\n                    Snackbar.LENGTH_SHORT).show()\n                var intent = Intent(activity, SearchDetailActivity::class.java)\n                intent.putExtra(\"keyWord\",keyWord)\n                startActivity(intent)\n            }\n        })\n        root.search.setOnClickListener {\n            val popwindowUtil = PopwindowUtil.PopupWindowBuilder(context!!)\n                .setView(R.layout.fragment_dialog_search)\n                .size(ViewGroup.LayoutParams.MATCH_PARENT.toFloat(), ViewGroup.LayoutParams.WRAP_CONTENT.toFloat())\n                .setFocusable(true)\n                .setTouchable(true)\n                .setOutsideTouchable(true)\n                .create()\n            popwindowUtil.showAtLocation(it,0,-it.getHeight(), Gravity.TOP,0.5f)\n            popwindowUtil.getView<ImageView>(R.id.image_exit)!!.setOnClickListener {\n                popwindowUtil.dissmiss()\n            }\n        }\n        root.search_qr.setOnClickListener {\n            Snackbar.make(it,\"通过扫码查找\",\n                Snackbar.LENGTH_SHORT).show()\n        }\n    }\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        presenter.getHotWords(50)\n    }\n\n    override fun onGetHotWords(wordsData: HotWordsData) {\n        var words = arrayListOf<String>()\n        Log.d(TAG,\"获取到的热门搜索$wordsData\")\n        for (item in wordsData.list){\n            words.add(item.keyword)\n        }\n        laybel.setAdapter(LaybelLayout.Adapter(words))\n    }\n\n    override fun onClick(v: View) {\n        when(v.id){\n            R.id.interest_group -> {\n                if (!GlobalProperties.userLogined()){\n                    ToastUtil.show(resources.getString(R.string.login_then_next))\n                    startActivity(Intent(activity,LoginActivity::class.java))\n                }\n            }\n            R.id.topic_center -> {\n                val intent = Intent(activity,TopicCenterActivity::class.java)\n                intent.putExtra(\"type\",resources.getString(R.string.find_line_topic))\n                startActivity(intent)\n            }\n            R.id.activity_center -> {\n                val intent = Intent(activity,TopicCenterActivity::class.java)\n                intent.putExtra(\"type\",resources.getString(R.string.find_line_activity))\n                startActivity(intent)\n            }\n            R.id.black_door -> {\n                var intent = Intent(activity, WebActivity::class.java)\n                intent.putExtra(\"uri\",GlobalProperties.BLACK_DOOR)\n                intent.putExtra(\"title\",resources.getString(R.string.find_line_blackdoor))\n                startActivity(intent)\n            }\n            R.id.origin_rank_list -> {\n                var intent = Intent(activity, RankListActivity::class.java)\n                intent.putExtra(\"type\",resources.getString(R.string.find_line_top_original))\n                startActivity(intent)\n            }\n            R.id.all_rank_list -> {\n                //先查询是否有分区的数据\n                /*var tables = SQLite.select().from(RegionTable::class.java).queryList()\n                if (tables == null || tables.isEmpty()){\n                    presenter.getRegion()\n                    showProgressDialog(\"请求数据中...\",context!!);\n                    return\n                }*/\n                presenter.getRegion()\n                showProgressDialog(\"请求数据中...\",context!!);\n            }\n            R.id.round_shop ->{\n                var intent = Intent(activity, WebActivity::class.java)\n                intent.putExtra(\"uri\",GlobalProperties.ROUND_SHOP)\n                intent.putExtra(\"title\",resources.getString(R.string.find_line_shop))\n                startActivity(intent)\n            }\n        }\n    }\n\n    override fun onGetRegion(list: List<RegionData.Data>) {\n        cancleProgressDialog()\n        EventBus.getDefault().postSticky(list)\n        var intent = Intent(activity, RankListActivity::class.java)\n        intent.putExtra(\"type\",resources.getString(R.string.find_line_top_all))\n        startActivity(intent)\n    }\n    override fun onGetSearchResult(result: SearchResultData) {\n\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/ui/RankListActivity.kt",
    "content": "package com.bilibili.lingxiao.home.find.ui\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.database.RegionTable\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.raizlabs.android.dbflow.sql.language.SQLite\nimport kotlinx.android.synthetic.main.activity_rank_list.*\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass RankListActivity : BaseActivity() {\n    lateinit var tabArray :Array<String>\n    var tables:List<RegionData.Data> = arrayListOf()\n    lateinit var pagerAdapter:PagerAdapter\n    override val contentLayoutId: Int\n        get() = R.layout.activity_rank_list\n\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(tool_bar)\n        val type = intent.getStringExtra(\"type\")\n        tool_bar.title = type\n        if (type.equals(resources.getString(R.string.find_line_top_original))){\n            tabArray = resources.getStringArray(R.array.origin_ranking_list)\n            initTabView()\n        }else{\n            //tables = SQLite.select().from(RegionTable::class.java).queryList()\n\n            /*tables?.let {\n                tabArray = it.map {\n                        regionTable ->  regionTable.name\n                }.toTypedArray()\n            }*/\n        }\n\n    }\n\n    fun initTabView(){\n        for (name in tabArray){\n            tabLayout.addTab(tabLayout.newTab().setText(name))\n        }\n        pagerAdapter = PagerAdapter(supportFragmentManager)\n        viewpager.adapter = pagerAdapter\n        tabLayout.setupWithViewPager(viewpager)\n        //设置viewpager缓存页面个数\n        viewpager.setOffscreenPageLimit(3)\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetRegion(list: List<RegionData.Data>){\n        EventBus.getDefault().removeStickyEvent(list)\n        tables = list.subList(1,list.size)\n        tabArray = tables.map {\n                region ->  region.name\n        }.toTypedArray()\n        initTabView()\n    }\n    inner class PagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {\n        override fun getCount(): Int {\n            return tabArray.size\n        }\n\n        override fun getItem(position: Int): androidx.fragment.app.Fragment {\n            var bundle = Bundle()\n            if (tables.isEmpty()){\n                var type = \"origin\"\n                if (position == 1){\n                    type = \"all\"\n                }else if (position == 2){\n                    type = \"bangumi\"\n                }\n                bundle.putString(\"type\",type)\n            }else{\n                tables.let {\n                    if (it.size > position)\n                        bundle.putInt(\"rid\",it[position].tid)\n                    else\n                        bundle.putInt(\"rid\",0)\n                }\n            }\n\n            var fragment = RankListFragment()\n            fragment.arguments = bundle\n            return fragment\n        }\n\n        override fun getPageTitle(position: Int): CharSequence? {\n            return tabArray.get(position)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/ui/RankListFragment.kt",
    "content": "package com.bilibili.lingxiao.home.find.ui\n\nimport android.content.Context\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.find.RankListView\nimport com.bilibili.lingxiao.home.find.model.RankListData\nimport com.bilibili.lingxiao.home.find.presenter.RankListPresenter\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout\nimport kotlinx.android.synthetic.main.normal_refresh_view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.view.refresh\n\nclass RankListFragment :BaseFragment(),RankListView{\n    private var mRankList = arrayListOf<RankListData.Item>()\n    private lateinit var mPresenter: RankListPresenter\n    private lateinit var mRankListAdapter :RankListAdapter\n    private var page = 1\n    private val pageSize = 20\n    private var pageType :String? = null\n    private var rid :Int = 0\n\n    private lateinit var refresh:SmartRefreshLayout\n    override val contentLayoutId: Int\n        get() = R.layout.normal_refresh_view\n\n    override fun initArgs(bundle: Bundle?) {\n        super.initArgs(bundle)\n        pageType = bundle?.getString(\"type\")\n        rid = bundle!!.getInt(\"rid\")\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        mPresenter = RankListPresenter(this,this)\n        mRankListAdapter = RankListAdapter(R.layout.item_rank_list, mRankList)\n        root.recycerView.layoutManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        root.recycerView.adapter = mRankListAdapter\n        root.refresh.setOnRefreshListener {\n            mRankList.clear()\n            if (pageType.isNullOrEmpty()){\n                mPresenter.getALlRegionRankingList(rid,page,pageSize)\n            }else\n                mPresenter.getOriginRankingList(pageType!!,page,pageSize)\n        }\n        refresh = root.refresh\n        root.refresh.setOnLoadMoreListener{\n            page++\n            if (pageType.isNullOrEmpty()){\n                mPresenter.getALlRegionRankingList(rid,page,pageSize)\n            }else\n                mPresenter.getOriginRankingList(pageType!!,page,pageSize)\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n    override fun onGetRankList(data: MutableList<RankListData.Item>) {\n        mRankListAdapter.addData(data)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n\n    inner class RankListAdapter(layout:Int,data: MutableList<RankListData.Item>?) :\n        BaseQuickAdapter<RankListData.Item, BaseViewHolder>(layout,data) {\n        override fun convert(helper: BaseViewHolder, item: RankListData.Item) {\n            helper.setText(R.id.title,item.title)\n            helper.setText(R.id.up_name,item.name)\n            helper.setText(R.id.grade,\"综合评分：${item.pts}\")\n            var imageCover = helper.getView<SimpleDraweeView>(R.id.cover_image)\n            imageCover.setImageURI(Uri.parse(item.cover))\n            helper.setText(R.id.text_rank,\"${helper.position+1}\")\n            if (helper.position+1 > 3)\n                helper.setTextColor(R.id.text_rank,resources.getColor(R.color.black_alpha_144))\n            else\n                helper.setTextColor(R.id.text_rank,resources.getColor(R.color.colorPrimary))\n\n            var parent = helper.getView<LinearLayout>(R.id.root_show_all)\n            var showAllVideo = helper.getView<TextView>(R.id.text_show_all)\n            if (item.children != null){\n                showAllVideo.visibility = View.VISIBLE\n                if (parent.childCount > 1) parent.removeViews(1,parent.childCount-1)\n            } else{\n                showAllVideo.visibility = View.GONE\n            }\n            showAllVideo.setOnClickListener {\n                it.visibility = View.GONE\n                item.children!!.forEach {\n                    addChildItem(parent,context!!,it)\n                }\n            }\n        }\n\n        fun addChildItem(parent:ViewGroup,context:Context, data :RankListData.Item.Children){\n            val childView = View.inflate(context,R.layout.item_rank_list_child,null)\n            val titleTextView = childView.findViewById<TextView>(R.id.text_title)\n            titleTextView.text = data.title\n            val messageTextView = childView.findViewById<TextView>(R.id.text_grade)\n            messageTextView.text = \"综合评分：${data.pts}\"\n            parent.addView(childView)\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/ui/SearchDetailActivity.kt",
    "content": "package com.bilibili.lingxiao.home.find.ui\n\nimport androidx.appcompat.widget.SearchView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.find.FindView\nimport com.bilibili.lingxiao.home.find.presenter.SearchDetailPresenter\nimport com.bilibili.lingxiao.home.find.model.HotWordsData\nimport com.bilibili.lingxiao.home.find.model.SearchResultData\nimport com.bilibili.lingxiao.home.live.adapter.PlayPagerAdapter\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.flyco.tablayout.listener.CustomTabEntity\nimport kotlinx.android.synthetic.main.activity_search_detail.*\nimport org.greenrobot.eventbus.EventBus\n\nclass SearchDetailActivity : BaseActivity() , FindView {\n    lateinit var presenter: SearchDetailPresenter\n    private val mTabEntities = arrayListOf<CustomTabEntity>()\n    private var page = 1\n    private val pageSize = 20\n    private var keyWord = \"\"\n    override val contentLayoutId: Int\n        get() = R.layout.activity_search_detail\n\n    override fun initWidget() {\n        super.initWidget()\n        keyWord = intent.getStringExtra(\"keyWord\")\n        presenter = SearchDetailPresenter(this, this)\n        presenter.getSearchResult(keyWord,page,pageSize)\n        initSearchView()\n        text_cancel.setOnClickListener {\n            finish()\n        }\n        /*close.setOnClickListener {\n            searchview.setQuery(\"\",false)\n        }*/\n        for (name in resources.getStringArray(R.array.search_type)){\n            mTabEntities.add(TabEntity(name))\n        }\n        common_tablayout.setTabData(mTabEntities)\n        viewpager.adapter = PlayPagerAdapter(supportFragmentManager,\n            arrayOf(\"综合\"),\n            arrayListOf(SearchDetailFragment()))\n\n    }\n\n    private fun initSearchView() {\n        //设置左侧有放大镜(在搜索框中) 右侧有叉叉\n        //searchview.setIconified(false)\n        searchview.onActionViewExpanded();\n        var textView =\n            searchview.findViewById<SearchView.SearchAutoComplete>(R.id.search_src_text)\n        textView.setTextColor(resources.getColor(R.color.black_alpha_160))\n        textView.setHintTextColor(resources.getColor(R.color.black_alpha_112))\n        textView.setText(keyWord)\n        searchview.setOnQueryTextFocusChangeListener { v, hasFocus ->\n\n        }\n        searchview.setOnQueryTextListener(object :SearchView.OnQueryTextListener{\n            override fun onQueryTextSubmit(text: String): Boolean {\n                keyWord = text\n                getSearchResult(page)\n                return true\n            }\n\n            override fun onQueryTextChange(text: String): Boolean {\n                return true\n            }\n\n        })\n    }\n\n    /**\n     * 给fragment调用\n     */\n    fun getSearchResult(page :Int){\n        presenter.getSearchResult(keyWord,page,pageSize)\n    }\n\n    override fun onGetSearchResult(result: SearchResultData) {\n        if (tablayout.tabCount < result.nav.size){\n            for (item in result.nav){\n                var name = item.name\n                if (item.total != 0) name+= \"(${item.total})\"\n                tablayout.addTab(tablayout.newTab().setText(name))\n            }\n        }\n        EventBus.getDefault().postSticky(result.item)\n    }\n\n    override fun onGetHotWords(wordsData: HotWordsData) {\n\n    }\n\n    override fun onGetRegion(list: List<RegionData.Data>) {\n\n    }\n    private inner class TabEntity(var title:String): CustomTabEntity{\n        override fun getTabUnselectedIcon(): Int {\n            return R.drawable.ic_arrow_down_gray_round\n        }\n\n        override fun getTabSelectedIcon(): Int {\n            return R.drawable.ic_arrow_up\n        }\n\n        override fun getTabTitle(): String {\n            return title\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/ui/SearchDetailFragment.kt",
    "content": "package com.bilibili.lingxiao.home.find.ui\n\nimport android.net.Uri\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.view.View\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.find.model.SearchResultData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport kotlinx.android.synthetic.main.layout_empty.view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.view.*\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\nimport java.util.*\n\nclass SearchDetailFragment :BaseFragment(){\n    lateinit var videoDetailAdapter: VideoDetailAdapter\n    var mRecommendList = arrayListOf<SearchResultData.Item>()\n    var page = 1\n    override val contentLayoutId: Int\n        get() = R.layout.normal_refresh_view\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        initRecyclerView(root)\n    }\n\n    private fun initRecyclerView(root: View) {\n        var recommendManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        root.recycerView.layoutManager = recommendManager\n        videoDetailAdapter =\n            VideoDetailAdapter(R.layout.item_videodetail_recommend, mRecommendList)\n        root.recycerView.adapter = videoDetailAdapter\n\n        var empty = View.inflate(context,R.layout.layout_empty,null)\n        empty.image_error.setImageResource(R.drawable.ic_search_holder_default)\n        empty.text_desc.text = getString(R.string.find_searching)\n        videoDetailAdapter.setEmptyView(empty)\n        //root.refresh.autoRefresh()\n        root.refresh.setOnRefreshListener {\n            mRecommendList.clear()\n            var act = activity as SearchDetailActivity\n            act.getSearchResult(1)\n        }\n        root.refresh.setOnLoadMoreListener {\n            var act = activity as SearchDetailActivity\n            act.getSearchResult(++page)\n        }\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetSearchData(item: List<SearchResultData.Item>){\n        EventBus.getDefault().removeStickyEvent(item)\n        videoDetailAdapter.addData(item)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    inner class VideoDetailAdapter : BaseQuickAdapter<SearchResultData.Item, BaseViewHolder> {\n        constructor(layoutResId: Int, data: List<SearchResultData.Item>):super(layoutResId,data)\n        override fun convert(helper: BaseViewHolder, item: SearchResultData.Item) {\n            when(item.goto){\n                \"av\" ->{\n                    helper.setText(R.id.title,item.title)\n                    helper.setText(R.id.up_name,item.author)\n                    helper.setText(R.id.play_num, StringUtil.getBigDecimalNumber(item.play))\n                    helper.setText(R.id.damku_num,StringUtil.getBigDecimalNumber(item.danmaku))\n                    var image : SimpleDraweeView = helper.getView(R.id.cover_image)\n                    image.setImageURI(Uri.parse(item.cover + GlobalProperties.IMAGE_RULE_240_150))\n                    helper.addOnClickListener(R.id.more)\n                }\n                \"author\" -> {\n                    //直播\n                }\n                \"game\" ->{\n\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/find/ui/TopicCenterActivity.kt",
    "content": "package com.bilibili.lingxiao.home.find.ui\n\nimport android.content.Intent\nimport android.net.Uri\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.find.TopicView\nimport com.bilibili.lingxiao.home.find.model.TopicCardData\nimport com.bilibili.lingxiao.home.find.presenter.TopicCenterPresenter\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport kotlinx.android.synthetic.main.activity_topic_center.*\nimport kotlinx.android.synthetic.main.title_bar.*\n\nclass TopicCenterActivity : BaseActivity(),TopicView{\n    private var mTopicList = arrayListOf<TopicCardData.Item>()\n    private lateinit var mPresenter:TopicCenterPresenter\n    private lateinit var mTopicAdapter :TopicAdapter\n    private var page = 1\n    private val pageSize = 20\n    private val pageType by lazy {\n        intent.getStringExtra(\"type\")\n    }\n    override val contentLayoutId: Int\n        get() = R.layout.activity_topic_center\n\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(title_bar)\n        title_bar.title = pageType\n        mPresenter = TopicCenterPresenter(this,this)\n        mTopicAdapter = TopicAdapter(R.layout.item_topic_card, mTopicList)\n        recycerView.layoutManager =\n            androidx.recyclerview.widget.LinearLayoutManager(this)\n        recycerView.adapter = mTopicAdapter\n        refresh.autoRefresh()\n        refresh.setOnRefreshListener {\n            mTopicList.clear()\n            if (pageType.equals(resources.getString(R.string.find_line_topic)))\n                mPresenter.getTopicCenter(page,pageSize)\n            else\n                mPresenter.getActivityCenter(page,pageSize)\n        }\n        refresh.setOnLoadMoreListener{\n            page++\n            if (pageType.equals(resources.getString(R.string.find_line_topic)))\n                mPresenter.getTopicCenter(page,pageSize)\n            else\n                mPresenter.getActivityCenter(page,pageSize)\n        }\n        mTopicAdapter.setOnItemClickListener { adapter, view, position ->\n            var intent = Intent(applicationContext, WebActivity::class.java)\n            intent.putExtra(\"uri\",mTopicList[position].link)\n            intent.putExtra(\"title\",mTopicList[position].title)\n            intent.putExtra(\"image\",mTopicList[position].cover)\n            startActivity(intent)\n        }\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun onGetTopicResult(data: TopicCardData) {\n        mTopicAdapter.addData(data.list)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n\n    }\n\n    inner class TopicAdapter(layout:Int,data: MutableList<TopicCardData.Item>?) :\n        BaseQuickAdapter<TopicCardData.Item, BaseViewHolder>(layout,data) {\n        override fun convert(helper: BaseViewHolder, item: TopicCardData.Item) {\n            helper.setText(R.id.title,item.title)\n            var imageCover = helper.getView<SimpleDraweeView>(R.id.image_cover)\n            imageCover.setImageURI(Uri.parse(item.cover))\n            if (item.state == null){\n                helper.setVisible(R.id.image_state,false)\n            }else {\n                helper.setVisible(R.id.image_state,true)\n                helper.setImageResource(R.id.image_state,\n                    if (item.state==0)\n                        R.drawable.ic_badge_going\n                    else\n                        R.drawable.ic_badge_end)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/BannerImageLoader.kt",
    "content": "package com.bilibili.lingxiao.home.live\n\nimport android.content.Context\nimport android.widget.ImageView\nimport com.youth.banner.loader.ImageLoader\nimport com.facebook.drawee.view.SimpleDraweeView\nimport android.R.attr.path\nimport android.media.Image\nimport android.net.Uri\n\n\nclass BannerImageLoader :ImageLoader(){\n    override fun displayImage(context: Context?, path: Any?, imageView: ImageView?) {\n        //用fresco加载图片简单用法，记得要写下面的createImageView方法\n        val uri = Uri.parse(path as String)\n        imageView?.setImageURI(uri)\n    }\n\n    override fun createImageView(context: Context?): ImageView {\n        //使用fresco，需要创建它提供的ImageView，当然你也可以用自己自定义的具有图片加载功能的ImageView\n        val simpleDraweeView = SimpleDraweeView(context)\n        return simpleDraweeView\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/DanMaKuTool.kt",
    "content": "package com.bilibili.lingxiao.home.live\n\nimport android.util.Log\nimport com.bilibili.lingxiao.GlobalProperties\nimport okhttp3.*\nimport okio.ByteString\nimport org.json.JSONObject\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.util.*\nimport kotlin.concurrent.timerTask\n\nobject DanMaKuTool {\n    private val TAG = DanMaKuTool::class.java.simpleName\n    private var webSocket: okhttp3.WebSocket? =null\n    fun joinRoom(roomId:Int){\n        var client = OkHttpClient.Builder().build()\n        var request = Request\n            .Builder()\n            .url(GlobalProperties.LIVE_DANMAKU_URL)\n            .build()\n        webSocket = client.newWebSocket(request,object : WebSocketListener(){\n            override fun onOpen(webSocket: okhttp3.WebSocket, response: Response) {\n                super.onOpen(webSocket, response)\n                var inRoomMessage = JSONObject()\n                inRoomMessage.put(\"clientver\",\"1.6.3\")\n                inRoomMessage.put(\"platform\",\"web\")\n                inRoomMessage.put(\"protover\",2)\n                inRoomMessage.put(\"roomid\",roomId)  //必填\n                inRoomMessage.put(\"type\",2)\n                var bytes = inRoomMessage.toString().toByteArray(Charsets.UTF_8)\n                sendCmd(7, bytes, webSocket)\n                startTask(webSocket)\n                Log.d(TAG,\"websocket连接成功，发送进房消息$inRoomMessage\")\n            }\n\n            override fun onMessage(webSocket: WebSocket, bytes: ByteString) {\n                super.onMessage(webSocket, bytes)\n                Log.d(TAG,\"websocket接收消息$bytes\")\n            }\n            override fun onClosed(webSocket: okhttp3.WebSocket, code: Int, reason: String) {\n                super.onClosed(webSocket, code, reason)\n                Log.d(TAG,\"websocket断开连接\")\n                exitRoom()\n            }\n\n            override fun onFailure(webSocket: okhttp3.WebSocket, t: Throwable, response: Response?) {\n                super.onFailure(webSocket, t, response)\n                Log.d(TAG,\"websocket连接失败: $response , throw: $t\")\n                exitRoom()\n            }\n        })\n    }\n\n    /**\n     * @param cmd 命令\n     * @param data 数据包\n     */\n    private fun sendCmd(cmd: Int, data: ByteArray, webSocket: WebSocket){\n        var buffer = ByteBuffer.allocate(16 + data.size)\n        buffer.order(ByteOrder.BIG_ENDIAN)  //字节序为大端模式\n        buffer.putInt(16 + data.size)\n        buffer.putShort(16)  //头部长度\n        buffer.putShort(1)  //协议版本，目前是1\n        buffer.putInt(cmd)  //操作码（封包类型）\n        buffer.putInt(1)  //sequence，可以取常数1\n        buffer.put(data)\n        webSocket.send(ByteString.of(buffer))\n    }\n\n    //每秒发送一条消息\n    private var timer: Timer? = null\n    private fun startTask(webSocket: okhttp3.WebSocket?){\n        timer = Timer()\n        var timerTask = timerTask {\n            sendCmd(2, \"\".toByteArray(), webSocket!!)\n            //webSocket?.send(\"\" + System.currentTimeMillis())\n            //除了文本内容外，还可以将如图像，声音，视频等内容转为ByteString发送\n            //boolean send(ByteString bytes);\n        }\n        timer?.schedule(timerTask, 30000, 1000)\n    }\n\n    fun exitRoom(){\n        webSocket?.cancel()\n        timer?.cancel()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/LivePlatform.kt",
    "content": "package com.bilibili.lingxiao.home.live\n\nimport com.bilibili.lingxiao.home.live.ui.LiveFragment\n\n//@Component(modules = arrayOf(ViewModule::class))\ninterface LivePlatform{\n    fun getLiveList(liveFragment: LiveFragment)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/FansAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport android.net.Uri\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.FansGoldListData\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\n\nclass FansAdapter(layoutResId: Int, data: MutableList<FansGoldListData.FansInfo>?) :\n    BaseQuickAdapter<FansGoldListData.FansInfo, BaseViewHolder>(layoutResId, data) {\n    private val levelImages = arrayOf(\n        R.drawable.ic_live_rank_1,\n        R.drawable.ic_live_rank_2,\n        R.drawable.ic_live_rank_3\n    )\n\n    override fun convert(helper: BaseViewHolder, item: FansGoldListData.FansInfo) {\n        var image_level = helper.getView<ImageView>(R.id.image_rank_level)\n        var level = item.rank - 1\n        if (level < 3){\n            //前三名才有图标\n            image_level.visibility = View.VISIBLE\n            helper.setText(R.id.text_rank_level,\"\")\n            image_level.setImageResource(levelImages[level])\n        }else{\n            helper.setText(R.id.text_rank_level,\"\" + item.rank)\n            image_level.visibility = View.INVISIBLE\n        }\n\n        var image_header = helper.getView<SimpleDraweeView>(R.id.image_header)\n        image_header.setImageURI(Uri.parse(item.face + GlobalProperties.IMAGE_RULE_60_60))\n\n        helper.setText(R.id.username,item.uname)\n        helper.setText(R.id.text_gold_num,\"\" + item.score)\n        /*if (item.icon != null){\n            var image_gold = helper.getView<SimpleDraweeView>(R.id.image_rank_gold)\n            image_gold.setImageURI(Uri.parse(item.icon))\n        }*/\n        if (item.medal_name != null){\n            helper.setText(R.id.text_medal_name,item.medal_name)\n            var text_medal = helper.getView<TextView>(R.id.text_medal_name)\n            text_medal.visibility = View.VISIBLE\n            if (item.color != null){\n                //text_medal.setBackgroundColor(item.color)\n            }\n            helper.getView<LinearLayout>(R.id.ll_gold).visibility = View.GONE\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/FleetAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport android.net.Uri\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.FleetListData\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\n\nclass FleetAdapter (layoutResId: Int, data: MutableList<FleetListData.UserInfo>?) :\n    BaseQuickAdapter<FleetListData.UserInfo, BaseViewHolder>(layoutResId, data) {\n\n    override fun convert(helper: BaseViewHolder, item: FleetListData.UserInfo) {\n        var image_header = helper.getView<SimpleDraweeView>(R.id.image_header)\n        image_header.setImageURI(Uri.parse(item.face))\n        helper.setText(R.id.username,item.username)\n\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/LiveRecommendAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport android.net.Uri\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\n\n\nclass LiveRecommendAdapter(layout:Int,data:List<LiveData.RecommendDataBean.LivesBean>)\n    :BaseQuickAdapter<LiveData.RecommendDataBean.LivesBean,BaseViewHolder>(layout,data){\n    val TAG = LiveRecommendAdapter::class.java.simpleName\n    override fun convert(helper: BaseViewHolder, item: LiveData.RecommendDataBean.LivesBean) {\n        var image:SimpleDraweeView = helper.getView(R.id.live_user_image)\n        image.setImageURI(Uri.parse(item.cover?.src  + GlobalProperties.IMAGE_RULE_240_150))\n        helper.setText(R.id.live_title,item.title)\n        helper.setText(R.id.live_category_name,item.area_v2_name)\n        helper.setText(R.id.live_username,item.owner?.name)\n        helper.setText(R.id.live_people_number,StringUtil.getBigDecimalNumber(item.online))\n\n        //Log.d(TAG,\"标题\"+item.title + \"类型\" +item.area_v2_name)\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/LiveRecyAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport android.net.Uri\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport android.view.View\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.BannerImageLoader\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.bilibili.lingxiao.home.live.model.MultiItemLiveData\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.chad.library.adapter.base.util.MultiTypeDelegate\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.youth.banner.Banner\nimport com.youth.banner.BannerConfig\nimport com.youth.banner.Transformer\nimport kotlin.properties.Delegates\n\nclass LiveRecyAdapter : BaseQuickAdapter<MultiItemLiveData, LiveRecyAdapter.LiveViewHolde> {\n    var recycledViewPool: androidx.recyclerview.widget.RecyclerView.RecycledViewPool by Delegates.notNull()\n    constructor(data:MutableList<MultiItemLiveData>, recycledViewPool: androidx.recyclerview.widget.RecyclerView.RecycledViewPool) :super(data){\n        this.recycledViewPool = recycledViewPool\n       /* addItemType(MultiItemLiveData.BANNER,R.layout.layout_banner)\n        addItemType(MultiItemLiveData.CATEGORY,R.layout.item_live_category)\n        addItemType(MultiItemLiveData.RECOMMEND,R.layout.layout_recommend)\n        addItemType(MultiItemLiveData.PARTITION,R.layout.layout_partition)*/\n        multiTypeDelegate = object : MultiTypeDelegate<MultiItemLiveData>() {\n            override fun getItemType(entity: MultiItemLiveData): Int {\n                //根据你的实体类来判断布局类型\n                return entity.itemType\n            }\n        }\n        multiTypeDelegate\n            .registerItemType(MultiItemLiveData.RECOMMEND,R.layout.layout_recommend) //推荐的\n            .registerItemType(MultiItemLiveData.PARTITION,R.layout.layout_partition) //分类的\n    }\n    override fun convert(helper: LiveViewHolde, item: MultiItemLiveData) {\n        when(helper.itemViewType){\n            MultiItemLiveData.RECOMMEND->{\n                initRecommend(helper,item.liveList)\n                helper.setText(R.id.live_recommend_more,\"更多${item.partitionsBean.partition.count}个推荐直播 >\")\n                helper.addOnClickListener(R.id.live_recommend_more)\n            }\n            MultiItemLiveData.PARTITION->{\n                var image : SimpleDraweeView = helper.getView(R.id.image_part)\n                image.setImageURI(Uri.parse(item.partitionsBean.partition.sub_icon.src + GlobalProperties.IMAGE_RULE_240_150))\n\n                helper.setText(R.id.live_category_name,item.partitionsBean.partition.name)\n\n                initPartition(helper,item.partitionsBean.lives)\n                helper.addOnClickListener(R.id.live_look_more)\n                helper.setText(R.id.live_look_more,\"当前${item.partitionsBean.partition.count}个直播\")\n                //initPartition(helper,item.partitions)\n            }\n        }\n    }\n\n\n    inner class LiveViewHolde : BaseViewHolder {\n        //adapter复用\n        var liveRecommendAdapter:LiveRecommendAdapter? = null\n        var partitionAdapter:PartitionVideoAdapter? = null\n        constructor(view: View?):super(view){\n\n        }\n    }\n\n    private fun initPartition(helper: LiveViewHolde, data: MutableList<LiveData.RecommendDataBean.LivesBean>) {\n        if (helper.partitionAdapter != null) return\n        var list = data\n        if (list.size > 4){\n            list = list.subList(0,4)\n        }\n        var categoryAdapter =\n            PartitionVideoAdapter(R.layout.item_live_video, list)\n        categoryAdapter.openLoadAnimation(SCALEIN)\n        helper.partitionAdapter = categoryAdapter\n        var manager = androidx.recyclerview.widget.GridLayoutManager(mContext, 2)\n        val recyclerView: androidx.recyclerview.widget.RecyclerView = helper.getView(R.id.live_partition_recy)\n        recyclerView.adapter = categoryAdapter\n        recyclerView.layoutManager = manager\n        recyclerView.isNestedScrollingEnabled = false\n        recyclerView.setRecycledViewPool(recycledViewPool)\n\n        recyclerView.addOnScrollListener(object :\n            androidx.recyclerview.widget.RecyclerView.OnScrollListener(){\n            override fun onScrollStateChanged(recyclerView: androidx.recyclerview.widget.RecyclerView, newState: Int) {\n                if (newState == androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE){\n                    categoryAdapter.isScroller = false\n                    categoryAdapter.notifyDataSetChanged()\n                }else{\n                    categoryAdapter.isScroller = true\n                }\n                super.onScrollStateChanged(recyclerView, newState)\n            }\n        })\n\n        categoryAdapter.setOnItemClickListener(object :OnItemClickListener{\n            override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {\n                listener?.onPartitionClick(data[position],position)\n            }\n\n        })\n    }\n\n    private fun initRecommend(helper: LiveViewHolde, lives: MutableList<LiveData.RecommendDataBean.LivesBean>) {\n        if (helper.liveRecommendAdapter != null) return\n        val recyclerView: androidx.recyclerview.widget.RecyclerView = helper.getView(R.id.recycerView)\n        recyclerView.setHasFixedSize(true)      //设置固定大小\n        recyclerView.setLayoutManager(\n            androidx.recyclerview.widget.GridLayoutManager(\n                mContext,\n                2,\n                androidx.recyclerview.widget.GridLayoutManager.VERTICAL,\n                false\n            )\n        )\n        var liveRecommendAdapter =\n            LiveRecommendAdapter(R.layout.item_live_video, lives)\n        liveRecommendAdapter.openLoadAnimation(SCALEIN)\n        helper.liveRecommendAdapter = liveRecommendAdapter\n        recyclerView.adapter = liveRecommendAdapter\n        recyclerView.isNestedScrollingEnabled = false\n        recyclerView.setRecycledViewPool(recycledViewPool)\n\n        liveRecommendAdapter.setOnItemClickListener(object :OnItemClickListener{\n            override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {\n                listener?.onRecommendClick(lives[position],position)\n            }\n        })\n    }\n    private  var listener: OnMultiItemClickListener? = null\n    fun setMultiItemClickListener(listener: OnMultiItemClickListener){\n        this.listener = listener\n    }\n    interface OnMultiItemClickListener{\n        fun onRecommendClick(live: LiveData.RecommendDataBean.LivesBean, position:Int)\n        fun onPartitionClick(live: LiveData.RecommendDataBean.LivesBean, position:Int)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/PartitionAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\n\nclass PartitionAdapter(layout:Int,data: MutableList<LiveData.PartitionsBean>)\n    :BaseQuickAdapter<LiveData.PartitionsBean,BaseViewHolder>(layout,data){\n    override fun convert(helper: BaseViewHolder, item: LiveData.PartitionsBean) {\n        helper.setText(R.id.live_category_name,item.partition?.name)\n        LogUtils.d(\"LiveRecyAdapter 获取到Partition  name 的值-》》\" + item.partition?.name)\n        initRecy(helper, item.lives)\n    }\n    //var categoryAdapter :PartitionVideoAdapter? = null\n    private fun initRecy(helper: BaseViewHolder, data: MutableList<LiveData.RecommendDataBean.LivesBean>) {\n        var list = data\n        if (list.size > 4){\n            list = list.subList(0,4)\n        }\n        var categoryAdapter =\n            PartitionVideoAdapter(R.layout.item_live_video, list)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(mContext, 2)\n        val recyclerView: androidx.recyclerview.widget.RecyclerView = helper.getView(R.id.live_partition_recy)\n        recyclerView.adapter = categoryAdapter\n        recyclerView.layoutManager = manager\n        recyclerView.isNestedScrollingEnabled = false\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/PartitionVideoAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport android.net.Uri\nimport android.util.Log\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport java.math.BigDecimal\n\nclass PartitionVideoAdapter(layoutResId: Int, data: MutableList<LiveData.RecommendDataBean.LivesBean>) :\n    BaseQuickAdapter<LiveData.RecommendDataBean.LivesBean, BaseViewHolder>(layoutResId, data) {\n    var isScroller = false\n    override fun convert(helper: BaseViewHolder, item: LiveData.RecommendDataBean.LivesBean) {\n        if (!isScroller){\n            var image :SimpleDraweeView = helper.getView(R.id.live_user_image)\n            image.setImageURI(Uri.parse(item.cover.src  + GlobalProperties.IMAGE_RULE_240_150))\n        }\n\n        helper.setText(R.id.live_title,item.title)\n        helper.setText(R.id.live_category_name,item.area)\n        helper.setText(R.id.live_username,item.owner.name)\n        helper.setText(R.id.live_people_number,StringUtil.getBigDecimalNumber(item.online))\n\n        Log.d(TAG,\"标题\"+item.title + \"类型\" +item.area)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/adapter/PlayPagerAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.live.adapter\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport android.view.ViewGroup\nimport androidx.fragment.app.FragmentPagerAdapter\n\nclass PlayPagerAdapter(fm: FragmentManager, data:Array<String>, fragments:List<Fragment>) : FragmentPagerAdapter(fm) {\n    private var tabArray:Array<String> = data\n    private var fms:List<androidx.fragment.app.Fragment> = fragments\n    override fun getCount(): Int {\n        return tabArray.size\n    }\n\n    override fun getItem(position: Int): androidx.fragment.app.Fragment {\n        return fms.get(position)\n    }\n\n    override fun getPageTitle(position: Int): CharSequence? {\n        return tabArray.get(position)\n    }\n\n    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {\n        //super.destroyItem(container, position, `object`)\n        //不调用destroy，懒加载fragment\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/FansGoldListData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class FansGoldListData(\n    @SerializedName(\"list\")\n    val list: List<FansInfo>,\n    @SerializedName(\"next_offset\")\n    val nextOffset: Int,\n    @SerializedName(\"own\")\n    val own: Own\n) {\n    data class Own(\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"guard_level\")\n        val guardLevel: Int,\n        @SerializedName(\"icon\")\n        val icon: String,\n        @SerializedName(\"rank\")\n        val rank: Int,\n        @SerializedName(\"rank_text\")\n        val rankText: String,\n        @SerializedName(\"score\")\n        val score: Int,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"uname\")\n        val uname: String\n    )\n\n    data class FansInfo(\n        @SerializedName(\"face\")\n        val face: String?,\n        @SerializedName(\"guard_level\")\n        val guardLevel: Int?,\n        @SerializedName(\"icon\")\n        val icon: String?,\n        @SerializedName(\"isSelf\")\n        val isSelf: Int?,\n        @SerializedName(\"rank\")\n        val rank: Int,\n        @SerializedName(\"score\")\n        val score: Int?,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"uname\")\n        val uname: String?,\n        @SerializedName(\"medal_name\")\n        val medal_name: String?,\n        @SerializedName(\"level\")\n        val level: Int?,\n        @SerializedName(\"color\")\n        val color: Int?\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/FleetListData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class FleetListData(\n    @SerializedName(\"info\")\n    val info: Info,\n    @SerializedName(\"list\")\n    val list: List<UserInfo>,\n    @SerializedName(\"top3\")\n    val top3: List<Top3>\n) {\n    data class UserInfo(\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"guard_level\")\n        val guardLevel: Int,\n        @SerializedName(\"is_alive\")\n        val isAlive: Int,\n        @SerializedName(\"rank\")\n        val rank: Int,\n        @SerializedName(\"ruid\")\n        val ruid: Int,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"username\")\n        val username: String\n    )\n\n    data class Info(\n        @SerializedName(\"now\")\n        val now: Int,\n        @SerializedName(\"num\")\n        val num: Int,\n        @SerializedName(\"page\")\n        val page: Int\n    )\n\n    data class Top3(\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"guard_level\")\n        val guardLevel: Int,\n        @SerializedName(\"is_alive\")\n        val isAlive: Int,\n        @SerializedName(\"rank\")\n        val rank: Int,\n        @SerializedName(\"ruid\")\n        val ruid: Int,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"username\")\n        val username: String\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveAllData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class LiveAllData(\n    @SerializedName(\"banner\")\n    val banner: List<Any>,\n    @SerializedName(\"count\")\n    val count: Int,\n    @SerializedName(\"list\")\n    val list: List<LiveInfo>,\n    @SerializedName(\"new_tags\")\n    val newTags: List<NewTag>,\n    @SerializedName(\"tags\")\n    val tags: List<Tag>\n) {\n    data class LiveInfo(\n        @SerializedName(\"area_id\")\n        val areaId: Int,\n        @SerializedName(\"area_name\")\n        val areaName: String,\n        @SerializedName(\"area_v2_id\")\n        val areaV2Id: Int,\n        @SerializedName(\"area_v2_name\")\n        val areaV2Name: String,\n        @SerializedName(\"area_v2_parent_id\")\n        val areaV2ParentId: Int,\n        @SerializedName(\"area_v2_parent_name\")\n        val areaV2ParentName: String,\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"group_id\")\n        val groupId: Int,\n        @SerializedName(\"link\")\n        val link: String,\n        @SerializedName(\"online\")\n        val online: Int,\n        @SerializedName(\"parent_id\")\n        val parentId: Int,\n        @SerializedName(\"parent_name\")\n        val parentName: String,\n        @SerializedName(\"pk_id\")\n        val pkId: Int,\n        @SerializedName(\"roomid\")\n        val roomid: Int,\n        @SerializedName(\"session_id\")\n        val sessionId: String,\n        @SerializedName(\"show_cover\")\n        val showCover: String,\n        @SerializedName(\"system_cover\")\n        val systemCover: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"uname\")\n        val uname: String,\n        @SerializedName(\"user_cover\")\n        val userCover: String,\n        @SerializedName(\"user_cover_flag\")\n        val userCoverFlag: Int,\n        @SerializedName(\"web_pendent\")\n        val webPendent: String,\n        @SerializedName(\"play_url\")\n        val playUrl:String,\n        @SerializedName(\"play_url_h265\")\n        val playUrlH265:String,\n        @SerializedName(\"play_url_card\")\n        val playUrlCard:String,\n        @SerializedName(\"quality_description\")\n        val qualitys:List<QualityDescription>,\n        @SerializedName(\"current_quality\")\n        val currentQuality:Int\n    ){\n        data class QualityDescription(@SerializedName(\"qn\")\n                                      val qn:Int,@SerializedName(\"desc\")\n        val desc:String)\n    }\n\n    data class NewTag(\n        @SerializedName(\"hero_list\")\n        val heroList: List<Any>,\n        @SerializedName(\"icon\")\n        val icon: String,\n        @SerializedName(\"id\")\n        val id: Int,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"sort_type\")\n        val sortType: String,\n        @SerializedName(\"sub\")\n        val sub: List<Any>,\n        @SerializedName(\"type\")\n        val type: Int\n    )\n\n    data class Tag(\n        @SerializedName(\"id\")\n        val id: Int,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"sort_type\")\n        val sortType: String\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveChatData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class LiveChatData(\n    @SerializedName(\"admin\")\n    val admin: List<Any>,\n    @SerializedName(\"room\")\n    val room: List<Room>\n) {\n    data class Room(\n        @SerializedName(\"bubble\")\n        val bubble: Int,\n        @SerializedName(\"check_info\")\n        val checkInfo: CheckInfo,\n        @SerializedName(\"guard_level\")\n        val guardLevel: Int,\n        @SerializedName(\"isadmin\")\n        val isadmin: Int,\n        @SerializedName(\"medal\")\n        val medal: List<Any>,\n        @SerializedName(\"nickname\")\n        val nickname: String,\n        @SerializedName(\"rank\")\n        val rank: Int,\n        @SerializedName(\"rnd\")\n        val rnd: String,\n        @SerializedName(\"svip\")\n        val svip: Int,\n        @SerializedName(\"teamid\")\n        val teamid: Int,\n        @SerializedName(\"text\")\n        val text: String,\n        @SerializedName(\"timeline\")\n        val timeline: String,\n        @SerializedName(\"title\")\n        val title: List<String>,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"uname_color\")\n        val unameColor: String,\n        @SerializedName(\"user_level\")\n        val userLevel: List<Any>,\n        @SerializedName(\"user_title\")\n        val userTitle: String,\n        @SerializedName(\"vip\")\n        val vip: Int\n    ) {\n        data class CheckInfo(\n            @SerializedName(\"ct\")\n            val ct: String,\n            @SerializedName(\"ts\")\n            val ts: Int\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveData.java",
    "content": "package com.bilibili.lingxiao.home.live.model;\n\nimport com.chad.library.adapter.base.entity.MultiItemEntity;\n\nimport java.util.List;\n\npublic class LiveData {\n    private List<BannerBean> banner;\n    private List<EntranceIconsBean> entranceIcons;\n    private List<PartitionsBean> partitions;\n    private RecommendDataBean recommend_data;\n\n    public RecommendDataBean getRecommend_data() {\n        return recommend_data;\n    }\n\n    public void setRecommend_data(RecommendDataBean recommend_data) {\n        this.recommend_data = recommend_data;\n    }\n\n    public List<BannerBean> getBanner() {\n        return banner;\n    }\n\n    public void setBanner(List<BannerBean> banner) {\n        this.banner = banner;\n    }\n\n    public List<EntranceIconsBean> getEntranceIcons() {\n        return entranceIcons;\n    }\n\n    public void setEntranceIcons(List<EntranceIconsBean> entranceIcons) {\n        this.entranceIcons = entranceIcons;\n    }\n\n    public List<PartitionsBean> getPartitions() {\n        return partitions;\n    }\n\n    public void setPartitions(List<PartitionsBean> partitions) {\n        this.partitions = partitions;\n    }\n\n\n\n    public static class RecommendDataBean {\n\n        private PartitionBean partition;\n        private List<LivesBean> lives;\n        private List<BannerDataBean> banner_data;\n\n        public PartitionBean getPartition() {\n            return partition;\n        }\n\n        public void setPartition(PartitionBean partition) {\n            this.partition = partition;\n        }\n\n        public List<LivesBean> getLives() {\n            return lives;\n        }\n\n        public void setLives(List<LivesBean> lives) {\n            this.lives = lives;\n        }\n\n        public List<BannerDataBean> getBanner_data() {\n            return banner_data;\n        }\n\n        public void setBanner_data(List<BannerDataBean> banner_data) {\n            this.banner_data = banner_data;\n        }\n\n        public static class PartitionBean {\n            /**\n             * id : 0\n             * name : 推荐主播\n             * area : hot\n             * sub_icon : {\"src\":\"http://static.hdslb.com/live-static/images/mobile/android/small/xxhdpi/-1.png?20171116172700\",\"height\":\"63\",\"width\":\"63\"}\n             * count : 2718\n             */\n\n            private int id;\n            private String name;\n            private String area;\n            private SubIconBean sub_icon;\n            private int count;\n\n            public int getId() {\n                return id;\n            }\n\n            public void setId(int id) {\n                this.id = id;\n            }\n\n            public String getName() {\n                return name;\n            }\n\n            public void setName(String name) {\n                this.name = name;\n            }\n\n            public String getArea() {\n                return area;\n            }\n\n            public void setArea(String area) {\n                this.area = area;\n            }\n\n            public SubIconBean getSub_icon() {\n                return sub_icon;\n            }\n\n            public void setSub_icon(SubIconBean sub_icon) {\n                this.sub_icon = sub_icon;\n            }\n\n            public int getCount() {\n                return count;\n            }\n\n            public void setCount(int count) {\n                this.count = count;\n            }\n\n            public static class SubIconBean {\n                /**\n                 * src : http://static.hdslb.com/live-static/images/mobile/android/small/xxhdpi/-1.png?20171116172700\n                 * height : 63\n                 * width : 63\n                 */\n\n                private String src;\n                private String height;\n                private String width;\n\n                public String getSrc() {\n                    return src;\n                }\n\n                public void setSrc(String src) {\n                    this.src = src;\n                }\n\n                public String getHeight() {\n                    return height;\n                }\n\n                public void setHeight(String height) {\n                    this.height = height;\n                }\n\n                public String getWidth() {\n                    return width;\n                }\n\n                public void setWidth(String width) {\n                    this.width = width;\n                }\n            }\n        }\n\n        public static class LivesBean {\n            /**\n             * owner : {\"face\":\"http://i1.hdslb.com/bfs/face/8c49a758216f9bd14b0046afe48a3514f44126f0.jpg\",\"mid\":110631,\"name\":\"宫本狗雨\"}\n             * cover : {\"src\":\"http://i0.hdslb.com/bfs/live/63602c757dd6aaf2f498cb3d44b47fced6589a1e.jpg\",\"height\":180,\"width\":320}\n             * room_id : 5279\n             * check_version : 0\n             * online : 137592\n             * area : 电子竞技\n             * area_id : 4\n             * title : 新版本天使？\n             * playurl : http://ws.live-play.acgvideo.com/live-ws/192264/live_110631_5953326.flv?wsSecret=af81b46037fbe718d61c86bd1d5f83e5&wsTime=1552361203&trid=5c8a82b44da94db4b26ce3e478acb5dd&sig=no\n             * accept_quality : 4\n             * broadcast_type : 0\n             * is_tv : 0\n             * area_v2_id : 86\n             * area_v2_name : 英雄联盟\n             * area_v2_parent_id : 2\n             * area_v2_parent_name : 网游\n             */\n\n            private OwnerBean owner;\n            private CoverBean cover;\n            private int room_id;\n            private int check_version;\n            private int online;\n            private String area;\n            private int area_id;\n            private String title;\n            private String playurl;\n            private String accept_quality;\n            private int broadcast_type;\n            private int is_tv;\n            private int area_v2_id;\n            private String area_v2_name;\n            private int area_v2_parent_id;\n            private String area_v2_parent_name;\n\n            public OwnerBean getOwner() {\n                return owner;\n            }\n\n            public void setOwner(OwnerBean owner) {\n                this.owner = owner;\n            }\n\n            public CoverBean getCover() {\n                return cover;\n            }\n\n            public void setCover(CoverBean cover) {\n                this.cover = cover;\n            }\n\n            public int getRoom_id() {\n                return room_id;\n            }\n\n            public void setRoom_id(int room_id) {\n                this.room_id = room_id;\n            }\n\n            public int getCheck_version() {\n                return check_version;\n            }\n\n            public void setCheck_version(int check_version) {\n                this.check_version = check_version;\n            }\n\n            public int getOnline() {\n                return online;\n            }\n\n            public void setOnline(int online) {\n                this.online = online;\n            }\n\n            public String getArea() {\n                return area;\n            }\n\n            public void setArea(String area) {\n                this.area = area;\n            }\n\n            public int getArea_id() {\n                return area_id;\n            }\n\n            public void setArea_id(int area_id) {\n                this.area_id = area_id;\n            }\n\n            public String getTitle() {\n                return title;\n            }\n\n            public void setTitle(String title) {\n                this.title = title;\n            }\n\n            public String getPlayurl() {\n                return playurl;\n            }\n\n            public void setPlayurl(String playurl) {\n                this.playurl = playurl;\n            }\n\n            public String getAccept_quality() {\n                return accept_quality;\n            }\n\n            public void setAccept_quality(String accept_quality) {\n                this.accept_quality = accept_quality;\n            }\n\n            public int getBroadcast_type() {\n                return broadcast_type;\n            }\n\n            public void setBroadcast_type(int broadcast_type) {\n                this.broadcast_type = broadcast_type;\n            }\n\n            public int getIs_tv() {\n                return is_tv;\n            }\n\n            public void setIs_tv(int is_tv) {\n                this.is_tv = is_tv;\n            }\n\n            public int getArea_v2_id() {\n                return area_v2_id;\n            }\n\n            public void setArea_v2_id(int area_v2_id) {\n                this.area_v2_id = area_v2_id;\n            }\n\n            public String getArea_v2_name() {\n                return area_v2_name;\n            }\n\n            public void setArea_v2_name(String area_v2_name) {\n                this.area_v2_name = area_v2_name;\n            }\n\n            public int getArea_v2_parent_id() {\n                return area_v2_parent_id;\n            }\n\n            public void setArea_v2_parent_id(int area_v2_parent_id) {\n                this.area_v2_parent_id = area_v2_parent_id;\n            }\n\n            public String getArea_v2_parent_name() {\n                return area_v2_parent_name;\n            }\n\n            public void setArea_v2_parent_name(String area_v2_parent_name) {\n                this.area_v2_parent_name = area_v2_parent_name;\n            }\n\n            public static class OwnerBean {\n                /**\n                 * face : http://i1.hdslb.com/bfs/face/8c49a758216f9bd14b0046afe48a3514f44126f0.jpg\n                 * mid : 110631\n                 * name : 宫本狗雨\n                 */\n\n                private String face;\n                private int mid;\n                private String name;\n\n                public String getFace() {\n                    return face;\n                }\n\n                public void setFace(String face) {\n                    this.face = face;\n                }\n\n                public int getMid() {\n                    return mid;\n                }\n\n                public void setMid(int mid) {\n                    this.mid = mid;\n                }\n\n                public String getName() {\n                    return name;\n                }\n\n                public void setName(String name) {\n                    this.name = name;\n                }\n            }\n\n            public static class CoverBean {\n                /**\n                 * src : http://i0.hdslb.com/bfs/live/63602c757dd6aaf2f498cb3d44b47fced6589a1e.jpg\n                 * height : 180\n                 * width : 320\n                 */\n\n                private String src;\n                private int height;\n                private int width;\n\n                public String getSrc() {\n                    return src;\n                }\n\n                public void setSrc(String src) {\n                    this.src = src;\n                }\n\n                public int getHeight() {\n                    return height;\n                }\n\n                public void setHeight(int height) {\n                    this.height = height;\n                }\n\n                public int getWidth() {\n                    return width;\n                }\n\n                public void setWidth(int width) {\n                    this.width = width;\n                }\n            }\n        }\n\n        public static class BannerDataBean {\n            /**\n             * owner : {\"face\":\"http://i2.hdslb.com/bfs/face/5d35da6e93fbfb1a77ad6d1f1004b08413913f9a.jpg\",\"mid\":11153765,\"name\":\"3号直播间\"}\n             * cover : {\"src\":\"http://i0.hdslb.com/bfs/live/98c268f907705241a3e3face25ae365e3120406b.png\",\"height\":180,\"width\":320}\n             * room_id : 23058\n             * check_version : 0\n             * online : 10249\n             * area : 放映厅\n             * area_id : 7\n             * title : 哔哩哔哩音悦台\n             * playurl : http://qn.live-play.acgvideo.com/live-qn/686976/live_11153765_9369560.flv?wsSecret=6afca689c0b3f203f783b9fb0ad3ca7e&wsTime=1552361162&trid=876262f11acf4e668cf3b74967eb3fc1&sig=no\n             * accept_quality : 4\n             * broadcast_type : 0\n             * is_tv : 0\n             * area_v2_id : 34\n             * area_v2_name : 音乐台\n             * area_v2_parent_id : 1\n             * area_v2_parent_name : 娱乐\n             */\n\n            private OwnerBeanX owner;\n            private CoverBeanX cover;\n            private int room_id;\n            private int check_version;\n            private int online;\n            private String area;\n            private int area_id;\n            private String title;\n            private String playurl;\n            private String accept_quality;\n            private int broadcast_type;\n            private int is_tv;\n            private int area_v2_id;\n            private String area_v2_name;\n            private int area_v2_parent_id;\n            private String area_v2_parent_name;\n\n            public OwnerBeanX getOwner() {\n                return owner;\n            }\n\n            public void setOwner(OwnerBeanX owner) {\n                this.owner = owner;\n            }\n\n            public CoverBeanX getCover() {\n                return cover;\n            }\n\n            public void setCover(CoverBeanX cover) {\n                this.cover = cover;\n            }\n\n            public int getRoom_id() {\n                return room_id;\n            }\n\n            public void setRoom_id(int room_id) {\n                this.room_id = room_id;\n            }\n\n            public int getCheck_version() {\n                return check_version;\n            }\n\n            public void setCheck_version(int check_version) {\n                this.check_version = check_version;\n            }\n\n            public int getOnline() {\n                return online;\n            }\n\n            public void setOnline(int online) {\n                this.online = online;\n            }\n\n            public String getArea() {\n                return area;\n            }\n\n            public void setArea(String area) {\n                this.area = area;\n            }\n\n            public int getArea_id() {\n                return area_id;\n            }\n\n            public void setArea_id(int area_id) {\n                this.area_id = area_id;\n            }\n\n            public String getTitle() {\n                return title;\n            }\n\n            public void setTitle(String title) {\n                this.title = title;\n            }\n\n            public String getPlayurl() {\n                return playurl;\n            }\n\n            public void setPlayurl(String playurl) {\n                this.playurl = playurl;\n            }\n\n            public String getAccept_quality() {\n                return accept_quality;\n            }\n\n            public void setAccept_quality(String accept_quality) {\n                this.accept_quality = accept_quality;\n            }\n\n            public int getBroadcast_type() {\n                return broadcast_type;\n            }\n\n            public void setBroadcast_type(int broadcast_type) {\n                this.broadcast_type = broadcast_type;\n            }\n\n            public int getIs_tv() {\n                return is_tv;\n            }\n\n            public void setIs_tv(int is_tv) {\n                this.is_tv = is_tv;\n            }\n\n            public int getArea_v2_id() {\n                return area_v2_id;\n            }\n\n            public void setArea_v2_id(int area_v2_id) {\n                this.area_v2_id = area_v2_id;\n            }\n\n            public String getArea_v2_name() {\n                return area_v2_name;\n            }\n\n            public void setArea_v2_name(String area_v2_name) {\n                this.area_v2_name = area_v2_name;\n            }\n\n            public int getArea_v2_parent_id() {\n                return area_v2_parent_id;\n            }\n\n            public void setArea_v2_parent_id(int area_v2_parent_id) {\n                this.area_v2_parent_id = area_v2_parent_id;\n            }\n\n            public String getArea_v2_parent_name() {\n                return area_v2_parent_name;\n            }\n\n            public void setArea_v2_parent_name(String area_v2_parent_name) {\n                this.area_v2_parent_name = area_v2_parent_name;\n            }\n\n            public static class OwnerBeanX {\n                /**\n                 * face : http://i2.hdslb.com/bfs/face/5d35da6e93fbfb1a77ad6d1f1004b08413913f9a.jpg\n                 * mid : 11153765\n                 * name : 3号直播间\n                 */\n\n                private String face;\n                private int mid;\n                private String name;\n\n                public String getFace() {\n                    return face;\n                }\n\n                public void setFace(String face) {\n                    this.face = face;\n                }\n\n                public int getMid() {\n                    return mid;\n                }\n\n                public void setMid(int mid) {\n                    this.mid = mid;\n                }\n\n                public String getName() {\n                    return name;\n                }\n\n                public void setName(String name) {\n                    this.name = name;\n                }\n            }\n\n            public static class CoverBeanX {\n                /**\n                 * src : http://i0.hdslb.com/bfs/live/98c268f907705241a3e3face25ae365e3120406b.png\n                 * height : 180\n                 * width : 320\n                 */\n\n                private String src;\n                private int height;\n                private int width;\n\n                public String getSrc() {\n                    return src;\n                }\n\n                public void setSrc(String src) {\n                    this.src = src;\n                }\n\n                public int getHeight() {\n                    return height;\n                }\n\n                public void setHeight(int height) {\n                    this.height = height;\n                }\n\n                public int getWidth() {\n                    return width;\n                }\n\n                public void setWidth(int width) {\n                    this.width = width;\n                }\n            }\n        }\n    }\n\n    public static class BannerBean {\n        /**\n         * id : 913\n         * pic : http://i0.hdslb.com/bfs/vc/7564c8b074a4ece54c23e10660c520e300cae782.jpg\n         * link : https://www.bilibili.com/blackboard/activity-mdG8HVNeU.html\n         * title : 超新星学员计划\n         * position : 4\n         * sort_num : 1\n         * img : http://i0.hdslb.com/bfs/vc/7564c8b074a4ece54c23e10660c520e300cae782.jpg\n         */\n\n        private String id;\n        private String pic;\n        private String link;\n        private String title;\n        private String position;\n        private String sort_num;\n        private String img;\n        public String getId() {\n            return id;\n        }\n\n        public void setId(String id) {\n            this.id = id;\n        }\n\n        public String getPic() {\n            return pic;\n        }\n\n        public void setPic(String pic) {\n            this.pic = pic;\n        }\n\n        public String getLink() {\n            return link;\n        }\n\n        public void setLink(String link) {\n            this.link = link;\n        }\n\n        public String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        public String getPosition() {\n            return position;\n        }\n\n        public void setPosition(String position) {\n            this.position = position;\n        }\n\n        public String getSort_num() {\n            return sort_num;\n        }\n\n        public void setSort_num(String sort_num) {\n            this.sort_num = sort_num;\n        }\n\n        public String getImg() {\n            return img;\n        }\n\n        public void setImg(String img) {\n            this.img = img;\n        }\n    }\n\n    public static class EntranceIconsBean {\n        /**\n         * id : 9\n         * name : 绘画专区\n         * entrance_icon : {\"src\":\"http://static.hdslb.com/live-static/images/mobile/android/big/xxhdpi/9_big.png?20171116172700\",\"height\":\"132\",\"width\":\"132\"}\n         */\n\n        private int id;\n        private String name;\n        private EntranceIconBean entrance_icon;\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public String getName() {\n            return name;\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public EntranceIconBean getEntrance_icon() {\n            return entrance_icon;\n        }\n\n        public void setEntrance_icon(EntranceIconBean entrance_icon) {\n            this.entrance_icon = entrance_icon;\n        }\n\n        public static class EntranceIconBean {\n            /**\n             * src : http://static.hdslb.com/live-static/images/mobile/android/big/xxhdpi/9_big.png?20171116172700\n             * height : 132\n             * width : 132\n             */\n\n            private String src;\n            private String height;\n            private String width;\n\n            public String getSrc() {\n                return src;\n            }\n\n            public void setSrc(String src) {\n                this.src = src;\n            }\n\n            public String getHeight() {\n                return height;\n            }\n\n            public void setHeight(String height) {\n                this.height = height;\n            }\n\n            public String getWidth() {\n                return width;\n            }\n\n            public void setWidth(String width) {\n                this.width = width;\n            }\n        }\n    }\n\n    public static class PartitionsBean {\n        /**\n         * partition : {\"id\":9,\"name\":\"绘画专区\",\"area\":\"draw\",\"sub_icon\":{\"src\":\"http://static.hdslb.com/live-static/images/mobile/android/small/xxhdpi/9.png?20171116172700\",\"height\":\"63\",\"width\":\"63\"},\"count\":92}\n         * lives : [{\"owner\":{\"face\":\"http://i1.hdslb.com/bfs/face/6c80fa10147b4481688bcaee61ff052fde0b4bdc.jpg\",\"mid\":9871569,\"name\":\"小逝lullaby\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/e02e3b4f71fa8c57793d70fbccb6edbd5883d14a.jpg\",\"height\":180,\"width\":320},\"title\":\"封⭐面是我画的，不用问了\\u2026\",\"room_id\":73088,\"check_version\":0,\"online\":487,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/150694/live_9871569_3091457.flv?wsSecret=4b788f2328d20d0c0b9437d71e2d4382&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i1.hdslb.com/bfs/face/8fdff55db668991462065f2507713939ff115bd3.jpg\",\"mid\":1668013,\"name\":\"戴腕表的怒龙道\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/user_cover/5b6910d2bdedc73c15691ba3a89a91d208194016.jpg\",\"height\":180,\"width\":320},\"title\":\"瞎播测试\",\"room_id\":1152924,\"check_version\":0,\"online\":10,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/102457/live_1668013_3398863.flv?wsSecret=72e9fb1cde73b74a0f71e63e9c04133a&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i1.hdslb.com/bfs/face/ce8af5ba39f59dcd898ed59dbc26e9d0021a3ce1.jpg\",\"mid\":35271215,\"name\":\"PumpkinJakk-金鱼\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/bff83d0b5a86e4654fc6ac08c866aa667d22f1db.jpg\",\"height\":180,\"width\":320},\"title\":\"【金鱼】玄羽恋歌\",\"room_id\":472538,\"check_version\":0,\"online\":176,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/422797/live_35271215_8431452.flv?wsSecret=a81c8b69bdfa4aed1d540c33dc0ff3d3&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i0.hdslb.com/bfs/face/a1818c874392a6f203d832f70a87fddc6bc6b1f7.jpg\",\"mid\":25972035,\"name\":\"肉松馅的蛋烘糕\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/room_cover/db559be4044b11e2384907bb8402569eac10e8c3.jpg\",\"height\":180,\"width\":320},\"title\":\"听歌画画\\u2014战斗天使\",\"room_id\":4290727,\"check_version\":0,\"online\":68,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/165867/live_25972035_3513791.flv?wsSecret=16b19213250a04a234c1e815ff9ab24f&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i2.hdslb.com/bfs/face/1c3f961754cadf27dfc961b3b6692bea7e0bf269.jpg\",\"mid\":1972394,\"name\":\"蒙塔基的钢蛋儿_\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/d28d9e54cd8e5a2fd6fa525a4dad323e3cccf720.jpg\",\"height\":180,\"width\":320},\"title\":\"暴躁小画家\",\"room_id\":946340,\"check_version\":0,\"online\":52,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/700399/live_1972394_8085638.flv?wsSecret=cd9dfc564ddc77374897d4283a4dd17f&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i1.hdslb.com/bfs/face/c04066b823ee54bc9e33e0816c6427ada986c293.jpg\",\"mid\":534128,\"name\":\"harrymiao\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/ce0e1b42ece824bc94100c2ee547d98613ba11b3.jpg\",\"height\":180,\"width\":320},\"title\":\"harrymiao的直播间\",\"room_id\":936402,\"check_version\":0,\"online\":1294,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/126418/live_534128_3438840.flv?wsSecret=b4b95993ef9af3f16679246e141e5a4b&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i2.hdslb.com/bfs/face/7449c484755309bc89d6bd68fb5d73ff7f6316e2.jpg\",\"mid\":20002577,\"name\":\"大河庄一世繁华\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/room_cover/edec2128180f074a95446dc4986c5e14274130ed.jpg\",\"height\":180,\"width\":320},\"title\":\"南小鸟白丝--花嫁折纸\",\"room_id\":465495,\"check_version\":0,\"online\":2238,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/496273/live_20002577_3735661.flv?wsSecret=5aca8343597fa49f52f6f02727ea8944&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i0.hdslb.com/bfs/face/202a3aff95f7835e3992786ab61c325ba109030a.jpg\",\"mid\":26583489,\"name\":\"云度动漫代咕咕\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/e6f273d1c54e8502b591c9aebce86e149ca5a805.jpg\",\"height\":180,\"width\":320},\"title\":\"【昆明云度】画师之友电台\",\"room_id\":94946,\"check_version\":0,\"online\":7450,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/120126/live_26583489_8892733.flv?wsSecret=931e52a3554b73137a8be27cd981f720&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i0.hdslb.com/bfs/face/a2df382ad145f1f4418ea4e5123477656e4221a1.jpg\",\"mid\":233132995,\"name\":\"大概是一颗葱油饼\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/room_cover/c06583ea7b61dd157e9d70f6d13a73cfec4e3337.jpg\",\"height\":180,\"width\":320},\"title\":\"画累了，摸鱼\",\"room_id\":5923793,\"check_version\":0,\"online\":6,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/718773/live_233132995_8419718.flv?wsSecret=a7d1e7cf5d3e58350386e16edd51732d&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0},{\"owner\":{\"face\":\"http://i1.hdslb.com/bfs/face/b507c4a5418eb91f6ada4795292594439f5c2864.jpg\",\"mid\":96760464,\"name\":\"君_尹醉\"},\"cover\":{\"src\":\"http://i0.hdslb.com/bfs/live/user_cover/c06a52dd1f2c1fd019c7611fda828a5b21c16ada.jpg\",\"height\":180,\"width\":320},\"title\":\"勤快如我，肝已爆\",\"room_id\":3965495,\"check_version\":0,\"online\":55,\"area\":\"绘画专区\",\"area_id\":9,\"playurl\":\"http://ws.live-play.acgvideo.com/live-ws/553886/live_96760464_7014326.flv?wsSecret=016aa9c8bc360d094c333cb0f4e0d4e6&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\",\"accept_quality\":\"4\",\"broadcast_type\":0,\"is_tv\":0}]\n         */\n\n        private RecommendDataBean.PartitionBean partition;\n        private List<RecommendDataBean.LivesBean> lives;\n\n        public RecommendDataBean.PartitionBean getPartition() {\n            return partition;\n        }\n\n        public void setPartition(RecommendDataBean.PartitionBean partition) {\n            this.partition = partition;\n        }\n\n        public List<RecommendDataBean.LivesBean> getLives() {\n            return lives;\n        }\n\n        public void setLives(List<RecommendDataBean.LivesBean> lives) {\n            this.lives = lives;\n        }\n\n        public static class PartitionBeanX {\n            /**\n             * id : 9\n             * name : 绘画专区\n             * area : draw\n             * sub_icon : {\"src\":\"http://static.hdslb.com/live-static/images/mobile/android/small/xxhdpi/9.png?20171116172700\",\"height\":\"63\",\"width\":\"63\"}\n             * count : 92\n             */\n\n            private int id;\n            private String name;\n            private String area;\n            private SubIconBeanX sub_icon;\n            private int count;\n\n            public int getId() {\n                return id;\n            }\n\n            public void setId(int id) {\n                this.id = id;\n            }\n\n            public String getName() {\n                return name;\n            }\n\n            public void setName(String name) {\n                this.name = name;\n            }\n\n            public String getArea() {\n                return area;\n            }\n\n            public void setArea(String area) {\n                this.area = area;\n            }\n\n            public SubIconBeanX getSub_icon() {\n                return sub_icon;\n            }\n\n            public void setSub_icon(SubIconBeanX sub_icon) {\n                this.sub_icon = sub_icon;\n            }\n\n            public int getCount() {\n                return count;\n            }\n\n            public void setCount(int count) {\n                this.count = count;\n            }\n\n            public static class SubIconBeanX {\n                /**\n                 * src : http://static.hdslb.com/live-static/images/mobile/android/small/xxhdpi/9.png?20171116172700\n                 * height : 63\n                 * width : 63\n                 */\n\n                private String src;\n                private String height;\n                private String width;\n\n                public String getSrc() {\n                    return src;\n                }\n\n                public void setSrc(String src) {\n                    this.src = src;\n                }\n\n                public String getHeight() {\n                    return height;\n                }\n\n                public void setHeight(String height) {\n                    this.height = height;\n                }\n\n                public String getWidth() {\n                    return width;\n                }\n\n                public void setWidth(String width) {\n                    this.width = width;\n                }\n            }\n        }\n\n        public static class LivesBeanX {\n            /**\n             * owner : {\"face\":\"http://i1.hdslb.com/bfs/face/6c80fa10147b4481688bcaee61ff052fde0b4bdc.jpg\",\"mid\":9871569,\"name\":\"小逝lullaby\"}\n             * cover : {\"src\":\"http://i0.hdslb.com/bfs/live/e02e3b4f71fa8c57793d70fbccb6edbd5883d14a.jpg\",\"height\":180,\"width\":320}\n             * title : 封⭐面是我画的，不用问了…\n             * room_id : 73088\n             * check_version : 0\n             * online : 487\n             * area : 绘画专区\n             * area_id : 9\n             * playurl : http://ws.live-play.acgvideo.com/live-ws/150694/live_9871569_3091457.flv?wsSecret=4b788f2328d20d0c0b9437d71e2d4382&wsTime=1552361161&trid=63901c288ca44742ab2f55db64af616a&sig=no\n             * accept_quality : 4\n             * broadcast_type : 0\n             * is_tv : 0\n             */\n\n            private OwnerBeanXX owner;\n            private CoverBeanXX cover;\n            private String title;\n            private int room_id;\n            private int check_version;\n            private int online;\n            private String area;\n            private int area_id;\n            private String playurl;\n            private String accept_quality;\n            private int broadcast_type;\n            private int is_tv;\n\n            public OwnerBeanXX getOwner() {\n                return owner;\n            }\n\n            public void setOwner(OwnerBeanXX owner) {\n                this.owner = owner;\n            }\n\n            public CoverBeanXX getCover() {\n                return cover;\n            }\n\n            public void setCover(CoverBeanXX cover) {\n                this.cover = cover;\n            }\n\n            public String getTitle() {\n                return title;\n            }\n\n            public void setTitle(String title) {\n                this.title = title;\n            }\n\n            public int getRoom_id() {\n                return room_id;\n            }\n\n            public void setRoom_id(int room_id) {\n                this.room_id = room_id;\n            }\n\n            public int getCheck_version() {\n                return check_version;\n            }\n\n            public void setCheck_version(int check_version) {\n                this.check_version = check_version;\n            }\n\n            public int getOnline() {\n                return online;\n            }\n\n            public void setOnline(int online) {\n                this.online = online;\n            }\n\n            public String getArea() {\n                return area;\n            }\n\n            public void setArea(String area) {\n                this.area = area;\n            }\n\n            public int getArea_id() {\n                return area_id;\n            }\n\n            public void setArea_id(int area_id) {\n                this.area_id = area_id;\n            }\n\n            public String getPlayurl() {\n                return playurl;\n            }\n\n            public void setPlayurl(String playurl) {\n                this.playurl = playurl;\n            }\n\n            public String getAccept_quality() {\n                return accept_quality;\n            }\n\n            public void setAccept_quality(String accept_quality) {\n                this.accept_quality = accept_quality;\n            }\n\n            public int getBroadcast_type() {\n                return broadcast_type;\n            }\n\n            public void setBroadcast_type(int broadcast_type) {\n                this.broadcast_type = broadcast_type;\n            }\n\n            public int getIs_tv() {\n                return is_tv;\n            }\n\n            public void setIs_tv(int is_tv) {\n                this.is_tv = is_tv;\n            }\n\n            public static class OwnerBeanXX {\n                /**\n                 * face : http://i1.hdslb.com/bfs/face/6c80fa10147b4481688bcaee61ff052fde0b4bdc.jpg\n                 * mid : 9871569\n                 * name : 小逝lullaby\n                 */\n\n                private String face;\n                private int mid;\n                private String name;\n\n                public String getFace() {\n                    return face;\n                }\n\n                public void setFace(String face) {\n                    this.face = face;\n                }\n\n                public int getMid() {\n                    return mid;\n                }\n\n                public void setMid(int mid) {\n                    this.mid = mid;\n                }\n\n                public String getName() {\n                    return name;\n                }\n\n                public void setName(String name) {\n                    this.name = name;\n                }\n            }\n\n            public static class CoverBeanXX {\n                /**\n                 * src : http://i0.hdslb.com/bfs/live/e02e3b4f71fa8c57793d70fbccb6edbd5883d14a.jpg\n                 * height : 180\n                 * width : 320\n                 */\n\n                private String src;\n                private int height;\n                private int width;\n\n                public String getSrc() {\n                    return src;\n                }\n\n                public void setSrc(String src) {\n                    this.src = src;\n                }\n\n                public int getHeight() {\n                    return height;\n                }\n\n                public void setHeight(int height) {\n                    this.height = height;\n                }\n\n                public int getWidth() {\n                    return width;\n                }\n\n                public void setWidth(int width) {\n                    this.width = width;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveDataNew.java",
    "content": "package com.bilibili.lingxiao.home.live.model;\n\nimport java.util.List;\n\npublic class LiveDataNew {\n\n    /**\n     * card_list : [{\"card_type\":\"area_entrance_v1\",\"card_data\":{\"area_entrance_v1\":{\"module_info\":{\"id\":58,\"link\":\"\",\"pic\":\"\",\"title\":\"分区入口（二合一）\",\"type\":15,\"sort\":3,\"count\":0},\"extra_info\":{\"offline\":[]},\"list\":[{\"id\":145,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=145&area_name=视频聊天&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/14a8c9c6d0a7685091db270cb523690b9e78b523.png\",\"title\":\"视频聊天\",\"area_v2_id\":145,\"area_v2_parent_id\":1,\"tag_type\":0},{\"id\":86,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=2&parent_area_name=网游&area_id=86&area_name=英雄联盟&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0e808167886ad2299971ea49aade69b3663db9b9.png\",\"title\":\"英雄联盟\",\"area_v2_id\":86,\"area_v2_parent_id\":2,\"tag_type\":1},{\"id\":35,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=35&area_name=王者荣耀&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0fefa924760b2dd492a12dddafe179bfa1216918.png\",\"title\":\"王者荣耀\",\"area_v2_id\":35,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":207,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=207&area_name=舞见&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/5837fa9608fab6c1465ec29c5abecab44f7bc376.png\",\"title\":\"舞见\",\"area_v2_id\":207,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":1,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/8fd5339dac84ec34e72f707f4c3b665d0aa41905.png\",\"title\":\"娱乐\",\"area_v2_id\":0,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":6,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=6&parent_area_name=单机&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/827033eb0ac50db3d9f849abe8e39a5d3b1ecd53.png\",\"title\":\"单机\",\"area_v2_id\":0,\"area_v2_parent_id\":6,\"tag_type\":1},{\"id\":5,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=5&parent_area_name=电台&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/a7adae1f7571a97f51d60f685823acc610d00a7e.png\",\"title\":\"电台\",\"area_v2_id\":0,\"area_v2_parent_id\":5,\"tag_type\":1},{\"id\":321,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=321&area_name=原神&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/ae3da64c304f2450e6bd97e1046d2f9ea97632d8.png\",\"title\":\"原神\",\"area_v2_id\":321,\"area_v2_parent_id\":3,\"tag_type\":2},{\"id\":163,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=163&area_name=第五人格&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/976be38da68267cab88f92f0ed78e057995798d6.png\",\"title\":\"第五人格\",\"area_v2_id\":163,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":0,\"link\":\"https://live.bilibili.com/app/mytag/\",\"pic\":\"https://i0.hdslb.com/bfs/vc/ff03528785fc8c91491d79e440398484811d6d87.png\",\"title\":\"全部标签\",\"area_v2_id\":0,\"area_v2_parent_id\":0,\"tag_type\":1}]}}},{\"card_type\":\"my_idol_v1\",\"card_data\":{\"my_idol_v1\":{\"module_info\":{\"id\":13,\"link\":\"http://live.bilibili.com/app/myfollow/\",\"pic\":\"http://i0.hdslb.com/bfs/live/484abcd8940ee43ec8b4409cbfe0c1e52f09a338.png\",\"title\":\"我的关注\",\"type\":8,\"sort\":4,\"count\":0},\"extra_info\":{\"total_count\":2,\"time_desc\":\"\",\"uname_desc\":\"\",\"tags_desc\":\"\",\"card_type\":0,\"relation_page\":1,\"show_type\":1},\"list\":[{\"roomid\":21144080,\"uid\":392836434,\"uname\":\"哔哩哔哩王者荣耀赛事\",\"face\":\"http://i2.hdslb.com/bfs/face/c082025ef7f7351030a41c0c761c6ccd48b34cc8.jpg\",\"cover\":\"http://i0.hdslb.com/bfs/vc/529d66baa613b336324a032f4de1f09ae79a13df.jpg\",\"title\":\"\",\"area\":12,\"live_time\":1599570812,\"area_name\":\"手游直播\",\"area_v2_id\":35,\"area_v2_name\":\"王者荣耀\",\"area_v2_parent_name\":\"手游\",\"area_v2_parent_id\":3,\"live_tag_name\":\"王者荣耀\",\"online\":217521,\"play_url\":\"http://222.134.1.73/live-bvc/462083/live_21144080_bs_7276836_2500.flv?cdn=cn-gotcha01&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=c5fdeccf9fd5431bb517769a878c177a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=ab1944419757341e0d3e76ccffb7c5d6&ptype=0&src=269&sl=4&order=1\",\"play_url_h265\":\"http://222.134.1.73/live-bvc/577742/live_21144080_bs_7276836_minihevc.flv?cdn=cn-gotcha01&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=c5fdeccf9fd5431bb517769a878c177a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=b01d2010beb256325862d7754c9a8975&ptype=0&src=269&sl=4&order=1\",\"accept_quality\":[4,3,2],\"current_quality\":4,\"pk_id\":0,\"link\":\"http://live.bilibili.com/21144080?broadcast_type=0\",\"special_attention\":0,\"broadcast_type\":0,\"pendent_ru\":\"\",\"pendent_ru_color\":\"\",\"pendent_ru_pic\":\"\",\"official_verify\":1,\"current_qn\":400,\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":400,\"desc\":\"蓝光\"},{\"qn\":150,\"desc\":\"高清\"},{\"qn\":80,\"desc\":\"流畅\"}],\"play_url_card\":\"\",\"flag\":0,\"pendent_list\":[],\"p2p_type\":8},{\"roomid\":65842,\"uid\":12304806,\"uname\":\"空心萝卜有点甜\",\"face\":\"http://i0.hdslb.com/bfs/face/4f5ded807db65df8ee7f06823a66d28374a81c5c.jpg\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/054328fd50322dce7e27196d3898b661a7dd0648.jpg\",\"title\":\"【美服】今天好冷记得添衣\",\"area\":4,\"live_time\":1600474591,\"area_name\":\"电子竞技\",\"area_v2_id\":86,\"area_v2_name\":\"英雄联盟\",\"area_v2_parent_name\":\"网游\",\"area_v2_parent_id\":2,\"live_tag_name\":\"英雄联盟\",\"online\":7750,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/697275/live_12304806_9119674.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=c5fdeccf9fd5431bb517769a878c177a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=70d887b69187da5080fbe01b1406a2d0&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"accept_quality\":[4],\"current_quality\":4,\"pk_id\":0,\"link\":\"http://live.bilibili.com/65842?broadcast_type=0\",\"special_attention\":0,\"broadcast_type\":0,\"pendent_ru\":\"\",\"pendent_ru_color\":\"\",\"pendent_ru_pic\":\"\",\"official_verify\":0,\"current_qn\":10000,\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"flag\":0,\"pendent_list\":[],\"p2p_type\":0}]}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":4286620,\"title\":\"国服野王射手五排带粉百分百胜率舰长=26\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/dfa77e2236e63a2ec2661afbe11ed5e8aba017b7.jpg\",\"link\":\"/4286620\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":102712244,\"online\":3810,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"沐宇の\"},\"cover_right_style\":{\"text\":\"3810\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_B33F8708-598A-4995-BA7F-84EFB56A363F\",\"group_id\":1000078,\"jumpfrom_extend\":4,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_B33F8708-598A-4995-BA7F-84EFB56A363F&group_id=1000078&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=4286620&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_B33F8708-598A-4995-BA7F-84EFB56A363F&group_id=1000078&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=4286620&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":102712244,\"name\":\"UP主:沐宇の\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":4286620,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/743822/live_102712244_3012231.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=6aae04399013d0afc3b5dc3b895899b0&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":0,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":21686237,\"title\":\"央视新闻特别节目《跟着黄河入大海》 一起领略雄浑粗犷的印象史诗\",\"cover\":\"http://i0.hdslb.com/bfs/vc/021fb8c393ff4d6bf5960742cf6b311091aa46d8.jpg\",\"link\":\"/21686237\",\"area_id\":372,\"area_name\":\"陪伴学习\",\"parent_area_id\":11,\"parent_area_name\":\"学习\",\"uid\":456664753,\"online\":31226,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"央视新闻\"},\"cover_right_style\":{\"text\":\"3.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"陪伴学习\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_B7B2A309-191C-49C6-8727-AE1392BB8C3E\",\"group_id\":1000076,\"jumpfrom_extend\":2,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_B7B2A309-191C-49C6-8727-AE1392BB8C3E&group_id=1000076&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21686237&parent_id=11&area_id=372\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_B7B2A309-191C-49C6-8727-AE1392BB8C3E&group_id=1000076&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21686237&parent_id=11&area_id=372\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,2],\"current_qn\":80,\"current_quality\":2,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/104178/live_456664753_32691722_800.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=80&trid=a16e029a8552420398766574779931b3&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=f89604e46d936e6c44b98a4ba2b1969d&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":80,\"desc\":\"流畅\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":1,\"is_hide_feedback\":1}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":21144080,\"title\":\"\",\"cover\":\"http://i0.hdslb.com/bfs/vc/529d66baa613b336324a032f4de1f09ae79a13df.jpg\",\"link\":\"/21144080\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":392836434,\"online\":217521,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"哔哩哔哩王者荣耀赛事\"},\"cover_right_style\":{\"text\":\"21.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_97C610CC-8358-4409-BEE6-E0B41A5545F7\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_97C610CC-8358-4409-BEE6-E0B41A5545F7&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21144080&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_97C610CC-8358-4409-BEE6-E0B41A5545F7&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21144080&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":392836434,\"name\":\"UP主:哔哩哔哩王者荣耀赛事\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":21144080,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,3,2],\"current_qn\":400,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha03.bilivideo.com/live-bvc/499105/live_21144080_bs_7276836_2500.flv?cdn=cn-gotcha03&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=8a1a64e51b24e3c52c3586670eda5041&ptype=0&src=269&sl=4&order=1\",\"play_url_h265\":\"http://d1--cn-gotcha03.bilivideo.com/live-bvc/280510/live_21144080_bs_7276836_minihevc.flv?cdn=cn-gotcha03&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=8dbdc1d3a2ae2ae4d8cfcb6f34f82402&ptype=0&src=269&sl=4&order=1\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":400,\"desc\":\"蓝光\"},{\"qn\":150,\"desc\":\"高清\"},{\"qn\":80,\"desc\":\"流畅\"}],\"play_url_card\":\"\",\"p2p_type\":8,\"pk_id\":0,\"index\":2,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":14333289,\"title\":\"北美小瓜等你鸭~\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/3be840683fc953768b59f020ebcf831d82920d9b.jpg\",\"link\":\"/14333289\",\"area_id\":145,\"area_name\":\"视频聊天\",\"parent_area_id\":1,\"parent_area_name\":\"娱乐\",\"uid\":381153360,\"online\":7242,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"是瓜瓜呀QAQ\"},\"cover_right_style\":{\"text\":\"7242\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"视频聊天\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_0E71277D-5057-4FA0-8063-6C244C5A9872\",\"group_id\":1000089,\"jumpfrom_extend\":4,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_0E71277D-5057-4FA0-8063-6C244C5A9872&group_id=1000089&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=14333289&parent_id=1&area_id=145\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_0E71277D-5057-4FA0-8063-6C244C5A9872&group_id=1000089&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=14333289&parent_id=1&area_id=145\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":381153360,\"name\":\"UP主:是瓜瓜呀QAQ\",\"id_type\":\"anchor\"},{\"id\":145,\"name\":\"分区:视频聊天\",\"id_type\":\"area_id\"},{\"id\":14333289,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/111374/live_381153360_4944645.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=51b9c02837e872b76073a3269f1797da&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":3,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":21654762,\"title\":\"王者荣耀甲级职业联赛\",\"cover\":\"http://i0.hdslb.com/bfs/vc/96f2eb616866c7edaa357e4371e017f47b6d2ae2.png\",\"link\":\"/21654762\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":477572722,\"online\":1428,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"王者荣耀甲级职业联赛\"},\"cover_right_style\":{\"text\":\"1428\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_46FCA657-3E57-48FA-9852-8C42DC702D9F\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_46FCA657-3E57-48FA-9852-8C42DC702D9F&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21654762&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_46FCA657-3E57-48FA-9852-8C42DC702D9F&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21654762&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":477572722,\"name\":\"UP主:王者荣耀甲级职业联赛\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":21654762,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,3],\"current_qn\":400,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/205395/live_477572722_14509464_2500.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=40754e6b3694b5de573095e8187d1af4&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":400,\"desc\":\"蓝光\"},{\"qn\":150,\"desc\":\"高清\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":4,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":21767760,\"title\":\"【莽夫射手】免费带粉关注就能上两颗星\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/a074046309666e0621a2d90c6f2234e8db03be56.jpg\",\"link\":\"/21767760\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":352586669,\"online\":456,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"鄙人泰日天\"},\"cover_right_style\":{\"text\":\"456\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_7F7B3A65-FB8F-4899-98D6-BFDD059B3040\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_7F7B3A65-FB8F-4899-98D6-BFDD059B3040&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21767760&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_7F7B3A65-FB8F-4899-98D6-BFDD059B3040&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21767760&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":352586669,\"name\":\"UP主:鄙人泰日天\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":21767760,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/798623/live_352586669_16422394.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=ebff9abbb5f21fc6b5d5b9bb21379628&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":5,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22387444,\"title\":\"学打王者的59天\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/fa6fd4e5e307e2c44e0383c1f8b0edd464b582a2.jpg\",\"link\":\"/22387444\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":630838913,\"online\":14962,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"宋妈妈\"},\"cover_right_style\":{\"text\":\"1.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_482746B7-65A7-4DC0-8C4D-E9B490F85402\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_482746B7-65A7-4DC0-8C4D-E9B490F85402&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22387444&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_482746B7-65A7-4DC0-8C4D-E9B490F85402&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22387444&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":630838913,\"name\":\"UP主:宋妈妈\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22387444,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,3],\"current_qn\":150,\"current_quality\":3,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/323069/live_630838913_27579538_1500.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=150&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=9a078c001b346ed361cc1352cf82dec4&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":150,\"desc\":\"高清\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":6,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":2155911,\"title\":\"一个很欲的男人\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/94845a121a2d1c949f3056b20942e74851c8382f.jpg\",\"link\":\"/2155911\",\"area_id\":192,\"area_name\":\"聊天电台\",\"parent_area_id\":5,\"parent_area_name\":\"电台\",\"uid\":59423672,\"online\":9395,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"欧皇饼干\"},\"cover_right_style\":{\"text\":\"9395\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"聊天电台\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_B28BE850-824E-4C24-B62E-8DCD93FD44BC\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_B28BE850-824E-4C24-B62E-8DCD93FD44BC&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=2155911&parent_id=5&area_id=192\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_B28BE850-824E-4C24-B62E-8DCD93FD44BC&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=2155911&parent_id=5&area_id=192\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":59423672,\"name\":\"UP主:欧皇饼干\",\"id_type\":\"anchor\"},{\"id\":192,\"name\":\"分区:聊天电台\",\"id_type\":\"area_id\"},{\"id\":2155911,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/607932/live_59423672_3201049.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=84fccaf140fd17f452d57448235d6161&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":7,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":21493788,\"title\":\"百星国服马超赛季末免费带粉！芜湖上将\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/eb0995440e0b195595d4f627451c57fe0c859f82.jpg\",\"link\":\"/21493788\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":439216466,\"online\":37487,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"玄亮boy\"},\"cover_right_style\":{\"text\":\"3.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_0918BFC7-B9BC-44F5-8E81-83858E0A8BC4\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_0918BFC7-B9BC-44F5-8E81-83858E0A8BC4&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21493788&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_0918BFC7-B9BC-44F5-8E81-83858E0A8BC4&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21493788&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":439216466,\"name\":\"UP主:玄亮boy\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":21493788,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha03.bilivideo.com/live-bvc/852671/live_439216466_43614771.flv?cdn=cn-gotcha03&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=8be1b4900844097755d3b1b47b9c3b7b&ptype=0&src=5&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":8,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":3144150,\"title\":\"国服守约：弹无虚发\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/492560c85a4f909f0f27ced843679c2ba2d489a6.jpg\",\"link\":\"/3144150\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":78701270,\"online\":61691,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"穆青浪青骚青\"},\"cover_right_style\":{\"text\":\"6.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_E66E6D5A-9795-4015-AD57-8DB0E22037E4\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_E66E6D5A-9795-4015-AD57-8DB0E22037E4&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=3144150&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_E66E6D5A-9795-4015-AD57-8DB0E22037E4&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=3144150&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":78701270,\"name\":\"UP主:穆青浪青骚青\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":3144150,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,3],\"current_qn\":400,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/480606/live_78701270_6835410_2500.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=fbe72c74e50780e090e780e5e5f4b5c4&ptype=0&src=9&sl=2&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":400,\"desc\":\"蓝光\"},{\"qn\":150,\"desc\":\"高清\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":9,\"is_hide_feedback\":0}}},{\"card_type\":\"hour_rank_card_v3\",\"card_data\":{\"hour_rank_card_v3\":{\"module_info\":{\"id\":4,\"link\":\"https://live.bilibili.com/p/html/live-app-rank/index.html?is_live_webview=1&nav=hour\",\"pic\":\"http://i0.hdslb.com/bfs/live/39cd413f6bc72fb9da8c10ff2686b537477294ab.png\",\"title\":\"小时榜\",\"type\":5,\"sort\":11,\"count\":0},\"extra_info\":{\"sub_title\":\"08:00-09:00 总榜排名\"},\"list\":[{\"rank\":1,\"uid\":398723615,\"roomid\":21507954,\"uname\":\"阿洛鸽鸽\",\"face\":\"http://i0.hdslb.com/bfs/face/9312ad7afa2045a8b218ed3e5303789902b6dfca.jpg\",\"live_status\":1,\"area_v2_parent_id\":2,\"area_v2_parent_name\":\"网游\",\"area_v2_id\":80,\"area_v2_name\":\"绝地求生\"},{\"rank\":2,\"uid\":57119113,\"roomid\":4120123,\"uname\":\"萌音の宝宝\",\"face\":\"http://i2.hdslb.com/bfs/face/1b5a8f531c06bc2ea195c782622ee09dee161ff0.jpg\",\"live_status\":1,\"area_v2_parent_id\":5,\"area_v2_parent_name\":\"电台\",\"area_v2_id\":192,\"area_v2_name\":\"聊天电台\"},{\"rank\":3,\"uid\":180642443,\"roomid\":11331001,\"uname\":\"是仙仙醬啦\",\"face\":\"http://i0.hdslb.com/bfs/face/272b156044ed921836819833b325c4465bda9aee.jpg\",\"live_status\":1,\"area_v2_parent_id\":1,\"area_v2_parent_name\":\"娱乐\",\"area_v2_id\":145,\"area_v2_name\":\"视频聊天\"}]}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":4623741,\"title\":\"七千场三指狂暴公孙离教学\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/b03eb2ff7096e6d134994659cbc2cea1d36ae79e.jpg\",\"link\":\"/4623741\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":16571835,\"online\":21923,\"pendent_list\":[],\"cover_left_style\":{\"text\":\"看阿离玩凉月\"},\"cover_right_style\":{\"text\":\"2.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_4461B1DE-9B55-49B0-BA7D-2EDB22A0BEFF\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_4461B1DE-9B55-49B0-BA7D-2EDB22A0BEFF&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=4623741&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_4461B1DE-9B55-49B0-BA7D-2EDB22A0BEFF&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=4623741&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":16571835,\"name\":\"UP主:看阿离玩凉月\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":4623741,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,3],\"current_qn\":400,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/694172/live_16571835_4990264_2500.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=1c57afa9c4d895e9a501ab7d01a5bf59&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/623942/live_16571835_4990264_minihevc.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=b8ecda2e2dc8878d7f1bdf6931731c1d&ptype=0&src=9&sl=1&order=1\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":400,\"desc\":\"蓝光\"},{\"qn\":150,\"desc\":\"高清\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":10,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":21368856,\"title\":\"治愈系声优 慵懒少女音\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/2111a083cbf67b23826550e3ad963158bbc692bd.jpg\",\"link\":\"/21368856\",\"area_id\":192,\"area_name\":\"聊天电台\",\"parent_area_id\":5,\"parent_area_name\":\"电台\",\"uid\":410124536,\"online\":31457,\"pendent_list\":[{\"content\":\"正在大乱斗\",\"position\":2,\"color\":\"#FB9E60\",\"pic\":\"http://i0.hdslb.com/bfs/vc/e442d1802eb6a3248a2d16f636d19058da2ac52c.png\"}],\"cover_left_style\":{\"text\":\"阿黛不太呆\"},\"cover_right_style\":{\"text\":\"3.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"聊天电台\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_893D4F9B-451C-426A-A241-F9B4C385983D\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_893D4F9B-451C-426A-A241-F9B4C385983D&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21368856&parent_id=5&area_id=192\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_893D4F9B-451C-426A-A241-F9B4C385983D&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21368856&parent_id=5&area_id=192\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":410124536,\"name\":\"UP主:阿黛不太呆\",\"id_type\":\"anchor\"},{\"id\":192,\"name\":\"分区:聊天电台\",\"id_type\":\"area_id\"},{\"id\":21368856,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/593860/live_410124536_59922380.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=fa656a0d93e0895b6baa70368f7ec746&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":11,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22357952,\"title\":\"八块腹肌B站第一职业打野，上舰即王者\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/6743f354537d5aecf1e75a672095101a9a51e060.jpg\",\"link\":\"/22357952\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":626721613,\"online\":41112,\"pendent_list\":[{\"content\":\"新星主播\",\"position\":2,\"color\":\"#FFA726\",\"pic\":\"http://i0.hdslb.com/bfs/activity-plat/static/20180718/709f466138d4b2616c6a14497c4e9086/p60rrw6880.png\"},{\"content\":\"\",\"position\":1,\"color\":\"#FB9E60\",\"pic\":\"https://i0.hdslb.com/bfs/live/539ce26c45cd4019f55b64cfbcedc3c01820e539.png\"}],\"cover_left_style\":{\"text\":\"百星野王初夏\"},\"cover_right_style\":{\"text\":\"4.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_2ADE28DA-FE51-4B7A-92C9-3805E281744E\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_2ADE28DA-FE51-4B7A-92C9-3805E281744E&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22357952&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_2ADE28DA-FE51-4B7A-92C9-3805E281744E&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22357952&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":626721613,\"name\":\"UP主:百星野王初夏\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22357952,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4,3],\"current_qn\":400,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/331247/live_626721613_30203946_2500.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=400&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=5b0d975daa176ca869692b23e584f8c3&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"},{\"qn\":400,\"desc\":\"蓝光\"},{\"qn\":150,\"desc\":\"高清\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":12,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22502808,\"title\":\"露脸 输一把恶龙咆哮\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/a3c495b2caa217f2fc64761c442bed8388de6d7e.jpg\",\"link\":\"/22502808\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":676532563,\"online\":4905,\"pendent_list\":[{\"content\":\"正在大乱斗\",\"position\":2,\"color\":\"#FB9E60\",\"pic\":\"http://i0.hdslb.com/bfs/vc/e442d1802eb6a3248a2d16f636d19058da2ac52c.png\"}],\"cover_left_style\":{\"text\":\"住你隔壁的芹菜姐姐\"},\"cover_right_style\":{\"text\":\"4905\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_3CA53AE1-B9A7-477B-BF78-A70F9778301F\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_3CA53AE1-B9A7-477B-BF78-A70F9778301F&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22502808&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_3CA53AE1-B9A7-477B-BF78-A70F9778301F&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22502808&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":676532563,\"name\":\"UP主:住你隔壁的芹菜姐姐\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22502808,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/726114/live_676532563_85406162.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=d2a0b9c7d7e7fc8a69c4bee3cc12cf99&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":13,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22348202,\"title\":\"上船包荣耀幸福~温柔技术好 还是没人疼\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/cb729e4b1f5ef113b123c440ed03a773658b4456.jpg\",\"link\":\"/22348202\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":481507885,\"online\":33015,\"pendent_list\":[{\"content\":\"正在大乱斗\",\"position\":2,\"color\":\"#FB9E60\",\"pic\":\"http://i0.hdslb.com/bfs/vc/e442d1802eb6a3248a2d16f636d19058da2ac52c.png\"}],\"cover_left_style\":{\"text\":\"温柔睿ya\"},\"cover_right_style\":{\"text\":\"3.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_1428CDBC-37DC-4386-A1E1-C8F77979A6A4\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_1428CDBC-37DC-4386-A1E1-C8F77979A6A4&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22348202&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_1428CDBC-37DC-4386-A1E1-C8F77979A6A4&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22348202&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":481507885,\"name\":\"UP主:温柔睿ya\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22348202,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/851214/live_481507885_82171996.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=c6d0449a4e0555de348af082e6694634&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":14,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22398773,\"title\":\"bilibili主播的直播间\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/bf4382b0551cf2a4220748fafde86014b8cb48e4.jpg\",\"link\":\"/22398773\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":596517997,\"online\":4948,\"pendent_list\":[{\"content\":\"新星主播\",\"position\":2,\"color\":\"#FFA726\",\"pic\":\"http://i0.hdslb.com/bfs/activity-plat/static/20180718/709f466138d4b2616c6a14497c4e9086/p60rrw6880.png\"}],\"cover_left_style\":{\"text\":\"果冻爱梦琪\"},\"cover_right_style\":{\"text\":\"4948\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_77249B2E-60DC-4A09-A3AE-8DEC8039964C\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_77249B2E-60DC-4A09-A3AE-8DEC8039964C&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22398773&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_77249B2E-60DC-4A09-A3AE-8DEC8039964C&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22398773&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":596517997,\"name\":\"UP主:果冻爱梦琪\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22398773,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha03.bilivideo.com/live-bvc/284182/live_596517997_9805457.flv?cdn=cn-gotcha03&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=60893833c61210a8ca4d4a1f5076cbf6&ptype=0&src=5&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":15,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":4120123,\"title\":\"声控酥软~awsl\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/bc42a6ed75ca307b63ac34538bd29e280c5a348b.jpg\",\"link\":\"/4120123\",\"area_id\":192,\"area_name\":\"聊天电台\",\"parent_area_id\":5,\"parent_area_name\":\"电台\",\"uid\":57119113,\"online\":19560,\"pendent_list\":[{\"content\":\"天选时刻\",\"position\":2,\"color\":\"#FB9E60\",\"pic\":\"https://i0.hdslb.com/bfs/live/0cc6f3244063981b21cec7be2692d85f1a6d7792.png\"}],\"cover_left_style\":{\"text\":\"萌音の宝宝\"},\"cover_right_style\":{\"text\":\"1.0 万\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"聊天电台\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_AD3E1A56-01AA-4426-99A1-C11900392E01\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_AD3E1A56-01AA-4426-99A1-C11900392E01&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=4120123&parent_id=5&area_id=192\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_AD3E1A56-01AA-4426-99A1-C11900392E01&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=4120123&parent_id=5&area_id=192\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":57119113,\"name\":\"UP主:萌音の宝宝\",\"id_type\":\"anchor\"},{\"id\":192,\"name\":\"分区:聊天电台\",\"id_type\":\"area_id\"},{\"id\":4120123,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/547069/live_57119113_9985879.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=5bc8eadafe643e1887bc23c5f119169e&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":16,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22026697,\"title\":\"早场露手，晚场露脸\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/c457f1d1262264a8e51b22b50c5ca201f2d59820.jpg\",\"link\":\"/22026697\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":349773676,\"online\":3660,\"pendent_list\":[{\"content\":\"新星主播\",\"position\":2,\"color\":\"#FFA726\",\"pic\":\"http://i0.hdslb.com/bfs/activity-plat/static/20180718/709f466138d4b2616c6a14497c4e9086/p60rrw6880.png\"}],\"cover_left_style\":{\"text\":\"无心pq\"},\"cover_right_style\":{\"text\":\"3660\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_92BFF0C2-77C2-45A2-96D1-B91339B016DA\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_92BFF0C2-77C2-45A2-96D1-B91339B016DA&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22026697&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_92BFF0C2-77C2-45A2-96D1-B91339B016DA&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22026697&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":349773676,\"name\":\"UP主:无心pq\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22026697,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/594959/live_349773676_52512174.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=71cebca21db28ab873e343ba8811435d&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":17,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22395120,\"title\":\"中国第一韩信 带粉 b坷垃上车\",\"cover\":\"http://i0.hdslb.com/bfs/live/new_room_cover/6ae25198bd24b8fea1aef90b5ded8ab39ae9bb07.jpg\",\"link\":\"/22395120\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":96001030,\"online\":4964,\"pendent_list\":[{\"content\":\"正在大乱斗\",\"position\":2,\"color\":\"#FB9E60\",\"pic\":\"http://i0.hdslb.com/bfs/vc/e442d1802eb6a3248a2d16f636d19058da2ac52c.png\"}],\"cover_left_style\":{\"text\":\"す菜菜\"},\"cover_right_style\":{\"text\":\"4964\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_1BC60AD9-C7B2-4318-A6BE-C6D860C49347\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_1BC60AD9-C7B2-4318-A6BE-C6D860C49347&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22395120&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_1BC60AD9-C7B2-4318-A6BE-C6D860C49347&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22395120&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":96001030,\"name\":\"UP主:す菜菜\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22395120,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha04.bilivideo.com/live-bvc/573536/live_96001030_1605341.flv?cdn=cn-gotcha04&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=c64b1d86020256348889bd4a71742e38&ptype=0&src=9&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":18,\"is_hide_feedback\":0}}},{\"card_type\":\"small_card_v1\",\"card_data\":{\"small_card_v1\":{\"id\":22361196,\"title\":\"免费带粉 声音像耀\",\"cover\":\"http://i0.hdslb.com/bfs/live/user_cover/7fba1003a4be7e7014de2a89bb076f7f1b1825bb.jpg\",\"link\":\"/22361196\",\"area_id\":35,\"area_name\":\"王者荣耀\",\"parent_area_id\":3,\"parent_area_name\":\"手游\",\"uid\":538290227,\"online\":8658,\"pendent_list\":[{\"content\":\"新星主播\",\"position\":2,\"color\":\"#FFA726\",\"pic\":\"http://i0.hdslb.com/bfs/activity-plat/static/20180718/709f466138d4b2616c6a14497c4e9086/p60rrw6880.png\"}],\"cover_left_style\":{\"text\":\"声优一定是我\"},\"cover_right_style\":{\"text\":\"8658\",\"img\":\"\"},\"subtitle_style\":{\"text\":\"王者荣耀\",\"text_color\":\"#999999\",\"text_night_color\":\"\",\"type\":\"area\"},\"session_id\":\"6bd8279106e98b57_C85388FA-4110-4318-B9CA-2B39977F902E\",\"group_id\":1000080,\"jumpfrom_extend\":3,\"show_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_C85388FA-4110-4318-B9CA-2B39977F902E&group_id=1000080&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22361196&parent_id=3&area_id=35\",\"click_callback\":\"https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=6bd8279106e98b57_C85388FA-4110-4318-B9CA-2B39977F902E&group_id=1000080&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22361196&parent_id=3&area_id=35\",\"feedback_img\":\"\",\"feedback_night_img\":\"\",\"feedback\":[{\"title\":\"不感兴趣\",\"subtitle\":\"选择后将减少相似内容推荐\",\"type\":\"dislike\",\"reasons\":[{\"id\":538290227,\"name\":\"UP主:声优一定是我\",\"id_type\":\"anchor\"},{\"id\":35,\"name\":\"分区:王者荣耀\",\"id_type\":\"area_id\"},{\"id\":22361196,\"name\":\"不感兴趣\",\"id_type\":\"un_interest\"}]}],\"flag\":0,\"broadcast_type\":0,\"accept_quality\":[4],\"current_qn\":10000,\"current_quality\":4,\"play_url\":\"http://d1--cn-gotcha03.bilivideo.com/live-bvc/993204/live_538290227_21499137.flv?cdn=cn-gotcha03&expires=1600484344&len=0&oi=1996788670&pt=android&qn=10000&trid=43878c4d0f314adc846e2fc160c20692&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=facac8fab180255ed5b428a2fc9b1adc&ptype=0&src=5&sl=1&order=1\",\"play_url_h265\":\"\",\"quality_description\":[{\"qn\":10000,\"desc\":\"原画\"}],\"play_url_card\":\"\",\"p2p_type\":0,\"pk_id\":0,\"index\":19,\"is_hide_feedback\":0}}}]\n     * is_rollback : 0\n     * has_more : 1\n     */\n\n    private int is_rollback;\n    private int has_more;\n    private List<CardListBean> card_list;\n\n    public int getIs_rollback() {\n        return is_rollback;\n    }\n\n    public void setIs_rollback(int is_rollback) {\n        this.is_rollback = is_rollback;\n    }\n\n    public int getHas_more() {\n        return has_more;\n    }\n\n    public void setHas_more(int has_more) {\n        this.has_more = has_more;\n    }\n\n    public List<CardListBean> getCard_list() {\n        return card_list;\n    }\n\n    public void setCard_list(List<CardListBean> card_list) {\n        this.card_list = card_list;\n    }\n\n    public static class CardListBean {\n        /**\n         * card_type : area_entrance_v1\n         * card_data : {\"area_entrance_v1\":{\"module_info\":{\"id\":58,\"link\":\"\",\"pic\":\"\",\"title\":\"分区入口（二合一）\",\"type\":15,\"sort\":3,\"count\":0},\"extra_info\":{\"offline\":[]},\"list\":[{\"id\":145,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=145&area_name=视频聊天&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/14a8c9c6d0a7685091db270cb523690b9e78b523.png\",\"title\":\"视频聊天\",\"area_v2_id\":145,\"area_v2_parent_id\":1,\"tag_type\":0},{\"id\":86,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=2&parent_area_name=网游&area_id=86&area_name=英雄联盟&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0e808167886ad2299971ea49aade69b3663db9b9.png\",\"title\":\"英雄联盟\",\"area_v2_id\":86,\"area_v2_parent_id\":2,\"tag_type\":1},{\"id\":35,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=35&area_name=王者荣耀&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0fefa924760b2dd492a12dddafe179bfa1216918.png\",\"title\":\"王者荣耀\",\"area_v2_id\":35,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":207,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=207&area_name=舞见&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/5837fa9608fab6c1465ec29c5abecab44f7bc376.png\",\"title\":\"舞见\",\"area_v2_id\":207,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":1,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/8fd5339dac84ec34e72f707f4c3b665d0aa41905.png\",\"title\":\"娱乐\",\"area_v2_id\":0,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":6,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=6&parent_area_name=单机&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/827033eb0ac50db3d9f849abe8e39a5d3b1ecd53.png\",\"title\":\"单机\",\"area_v2_id\":0,\"area_v2_parent_id\":6,\"tag_type\":1},{\"id\":5,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=5&parent_area_name=电台&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/a7adae1f7571a97f51d60f685823acc610d00a7e.png\",\"title\":\"电台\",\"area_v2_id\":0,\"area_v2_parent_id\":5,\"tag_type\":1},{\"id\":321,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=321&area_name=原神&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/ae3da64c304f2450e6bd97e1046d2f9ea97632d8.png\",\"title\":\"原神\",\"area_v2_id\":321,\"area_v2_parent_id\":3,\"tag_type\":2},{\"id\":163,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=163&area_name=第五人格&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/976be38da68267cab88f92f0ed78e057995798d6.png\",\"title\":\"第五人格\",\"area_v2_id\":163,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":0,\"link\":\"https://live.bilibili.com/app/mytag/\",\"pic\":\"https://i0.hdslb.com/bfs/vc/ff03528785fc8c91491d79e440398484811d6d87.png\",\"title\":\"全部标签\",\"area_v2_id\":0,\"area_v2_parent_id\":0,\"tag_type\":1}]}}\n         */\n\n        private String card_type;\n        private CardDataBean card_data;\n\n        public String getCard_type() {\n            return card_type;\n        }\n\n        public void setCard_type(String card_type) {\n            this.card_type = card_type;\n        }\n\n        public CardDataBean getCard_data() {\n            return card_data;\n        }\n\n        public void setCard_data(CardDataBean card_data) {\n            this.card_data = card_data;\n        }\n\n        public static class CardDataBean {\n            /**\n             * area_entrance_v1 : {\"module_info\":{\"id\":58,\"link\":\"\",\"pic\":\"\",\"title\":\"分区入口（二合一）\",\"type\":15,\"sort\":3,\"count\":0},\"extra_info\":{\"offline\":[]},\"list\":[{\"id\":145,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=145&area_name=视频聊天&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/14a8c9c6d0a7685091db270cb523690b9e78b523.png\",\"title\":\"视频聊天\",\"area_v2_id\":145,\"area_v2_parent_id\":1,\"tag_type\":0},{\"id\":86,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=2&parent_area_name=网游&area_id=86&area_name=英雄联盟&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0e808167886ad2299971ea49aade69b3663db9b9.png\",\"title\":\"英雄联盟\",\"area_v2_id\":86,\"area_v2_parent_id\":2,\"tag_type\":1},{\"id\":35,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=35&area_name=王者荣耀&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0fefa924760b2dd492a12dddafe179bfa1216918.png\",\"title\":\"王者荣耀\",\"area_v2_id\":35,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":207,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=207&area_name=舞见&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/5837fa9608fab6c1465ec29c5abecab44f7bc376.png\",\"title\":\"舞见\",\"area_v2_id\":207,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":1,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/8fd5339dac84ec34e72f707f4c3b665d0aa41905.png\",\"title\":\"娱乐\",\"area_v2_id\":0,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":6,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=6&parent_area_name=单机&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/827033eb0ac50db3d9f849abe8e39a5d3b1ecd53.png\",\"title\":\"单机\",\"area_v2_id\":0,\"area_v2_parent_id\":6,\"tag_type\":1},{\"id\":5,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=5&parent_area_name=电台&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/a7adae1f7571a97f51d60f685823acc610d00a7e.png\",\"title\":\"电台\",\"area_v2_id\":0,\"area_v2_parent_id\":5,\"tag_type\":1},{\"id\":321,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=321&area_name=原神&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/ae3da64c304f2450e6bd97e1046d2f9ea97632d8.png\",\"title\":\"原神\",\"area_v2_id\":321,\"area_v2_parent_id\":3,\"tag_type\":2},{\"id\":163,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=163&area_name=第五人格&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/976be38da68267cab88f92f0ed78e057995798d6.png\",\"title\":\"第五人格\",\"area_v2_id\":163,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":0,\"link\":\"https://live.bilibili.com/app/mytag/\",\"pic\":\"https://i0.hdslb.com/bfs/vc/ff03528785fc8c91491d79e440398484811d6d87.png\",\"title\":\"全部标签\",\"area_v2_id\":0,\"area_v2_parent_id\":0,\"tag_type\":1}]}\n             */\n\n            private AreaEntranceV1Bean area_entrance_v1;\n\n            public AreaEntranceV1Bean getArea_entrance_v1() {\n                return area_entrance_v1;\n            }\n\n            public void setArea_entrance_v1(AreaEntranceV1Bean area_entrance_v1) {\n                this.area_entrance_v1 = area_entrance_v1;\n            }\n\n            public static class AreaEntranceV1Bean {\n                /**\n                 * module_info : {\"id\":58,\"link\":\"\",\"pic\":\"\",\"title\":\"分区入口（二合一）\",\"type\":15,\"sort\":3,\"count\":0}\n                 * extra_info : {\"offline\":[]}\n                 * list : [{\"id\":145,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=145&area_name=视频聊天&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/14a8c9c6d0a7685091db270cb523690b9e78b523.png\",\"title\":\"视频聊天\",\"area_v2_id\":145,\"area_v2_parent_id\":1,\"tag_type\":0},{\"id\":86,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=2&parent_area_name=网游&area_id=86&area_name=英雄联盟&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0e808167886ad2299971ea49aade69b3663db9b9.png\",\"title\":\"英雄联盟\",\"area_v2_id\":86,\"area_v2_parent_id\":2,\"tag_type\":1},{\"id\":35,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=35&area_name=王者荣耀&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/0fefa924760b2dd492a12dddafe179bfa1216918.png\",\"title\":\"王者荣耀\",\"area_v2_id\":35,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":207,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=207&area_name=舞见&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/5837fa9608fab6c1465ec29c5abecab44f7bc376.png\",\"title\":\"舞见\",\"area_v2_id\":207,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":1,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/8fd5339dac84ec34e72f707f4c3b665d0aa41905.png\",\"title\":\"娱乐\",\"area_v2_id\":0,\"area_v2_parent_id\":1,\"tag_type\":1},{\"id\":6,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=6&parent_area_name=单机&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/827033eb0ac50db3d9f849abe8e39a5d3b1ecd53.png\",\"title\":\"单机\",\"area_v2_id\":0,\"area_v2_parent_id\":6,\"tag_type\":1},{\"id\":5,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=5&parent_area_name=电台&area_id=0&area_name=&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/live/a7adae1f7571a97f51d60f685823acc610d00a7e.png\",\"title\":\"电台\",\"area_v2_id\":0,\"area_v2_parent_id\":5,\"tag_type\":1},{\"id\":321,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=321&area_name=原神&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/ae3da64c304f2450e6bd97e1046d2f9ea97632d8.png\",\"title\":\"原神\",\"area_v2_id\":321,\"area_v2_parent_id\":3,\"tag_type\":2},{\"id\":163,\"link\":\"https://live.bilibili.com/app/area?parent_area_id=3&parent_area_name=手游&area_id=163&area_name=第五人格&source_event=1\",\"pic\":\"http://i0.hdslb.com/bfs/vc/976be38da68267cab88f92f0ed78e057995798d6.png\",\"title\":\"第五人格\",\"area_v2_id\":163,\"area_v2_parent_id\":3,\"tag_type\":1},{\"id\":0,\"link\":\"https://live.bilibili.com/app/mytag/\",\"pic\":\"https://i0.hdslb.com/bfs/vc/ff03528785fc8c91491d79e440398484811d6d87.png\",\"title\":\"全部标签\",\"area_v2_id\":0,\"area_v2_parent_id\":0,\"tag_type\":1}]\n                 */\n\n                private ModuleInfoBean module_info;\n                private ExtraInfoBean extra_info;\n                private List<ListBean> list;\n\n                public ModuleInfoBean getModule_info() {\n                    return module_info;\n                }\n\n                public void setModule_info(ModuleInfoBean module_info) {\n                    this.module_info = module_info;\n                }\n\n                public ExtraInfoBean getExtra_info() {\n                    return extra_info;\n                }\n\n                public void setExtra_info(ExtraInfoBean extra_info) {\n                    this.extra_info = extra_info;\n                }\n\n                public List<ListBean> getList() {\n                    return list;\n                }\n\n                public void setList(List<ListBean> list) {\n                    this.list = list;\n                }\n\n                public static class ModuleInfoBean {\n                    /**\n                     * id : 58\n                     * link :\n                     * pic :\n                     * title : 分区入口（二合一）\n                     * type : 15\n                     * sort : 3\n                     * count : 0\n                     */\n\n                    private int id;\n                    private String link;\n                    private String pic;\n                    private String title;\n                    private int type;\n                    private int sort;\n                    private int count;\n\n                    public int getId() {\n                        return id;\n                    }\n\n                    public void setId(int id) {\n                        this.id = id;\n                    }\n\n                    public String getLink() {\n                        return link;\n                    }\n\n                    public void setLink(String link) {\n                        this.link = link;\n                    }\n\n                    public String getPic() {\n                        return pic;\n                    }\n\n                    public void setPic(String pic) {\n                        this.pic = pic;\n                    }\n\n                    public String getTitle() {\n                        return title;\n                    }\n\n                    public void setTitle(String title) {\n                        this.title = title;\n                    }\n\n                    public int getType() {\n                        return type;\n                    }\n\n                    public void setType(int type) {\n                        this.type = type;\n                    }\n\n                    public int getSort() {\n                        return sort;\n                    }\n\n                    public void setSort(int sort) {\n                        this.sort = sort;\n                    }\n\n                    public int getCount() {\n                        return count;\n                    }\n\n                    public void setCount(int count) {\n                        this.count = count;\n                    }\n                }\n\n                public static class ExtraInfoBean {\n                    private List<?> offline;\n\n                    public List<?> getOffline() {\n                        return offline;\n                    }\n\n                    public void setOffline(List<?> offline) {\n                        this.offline = offline;\n                    }\n                }\n\n                public static class ListBean {\n                    /**\n                     * id : 145\n                     * link : https://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=145&area_name=视频聊天&source_event=1\n                     * pic : http://i0.hdslb.com/bfs/vc/14a8c9c6d0a7685091db270cb523690b9e78b523.png\n                     * title : 视频聊天\n                     * area_v2_id : 145\n                     * area_v2_parent_id : 1\n                     * tag_type : 0\n                     */\n\n                    private int id;\n                    private String link;\n                    private String pic;\n                    private String title;\n                    private int area_v2_id;\n                    private int area_v2_parent_id;\n                    private int tag_type;\n\n                    public int getId() {\n                        return id;\n                    }\n\n                    public void setId(int id) {\n                        this.id = id;\n                    }\n\n                    public String getLink() {\n                        return link;\n                    }\n\n                    public void setLink(String link) {\n                        this.link = link;\n                    }\n\n                    public String getPic() {\n                        return pic;\n                    }\n\n                    public void setPic(String pic) {\n                        this.pic = pic;\n                    }\n\n                    public String getTitle() {\n                        return title;\n                    }\n\n                    public void setTitle(String title) {\n                        this.title = title;\n                    }\n\n                    public int getArea_v2_id() {\n                        return area_v2_id;\n                    }\n\n                    public void setArea_v2_id(int area_v2_id) {\n                        this.area_v2_id = area_v2_id;\n                    }\n\n                    public int getArea_v2_parent_id() {\n                        return area_v2_parent_id;\n                    }\n\n                    public void setArea_v2_parent_id(int area_v2_parent_id) {\n                        this.area_v2_parent_id = area_v2_parent_id;\n                    }\n\n                    public int getTag_type() {\n                        return tag_type;\n                    }\n\n                    public void setTag_type(int tag_type) {\n                        this.tag_type = tag_type;\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveTabData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class LiveTabData(\n    @SerializedName(\"data\")\n    val `data`: List<Tab>\n) {\n    data class Tab(\n        @SerializedName(\"act_id\")\n        val actId: String,\n        @SerializedName(\"area_type\")\n        val areaType: Int,\n        @SerializedName(\"hot_status\")\n        val hotStatus: Int,\n        @SerializedName(\"id\")\n        val id: String?,\n        @SerializedName(\"lock_status\")\n        val lockStatus: String,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"old_area_id\")\n        val oldAreaId: String,\n        @SerializedName(\"parent_id\")\n        val parentId: String?,\n        @SerializedName(\"parent_name\")\n        val parentName: String,\n        @SerializedName(\"pic\")\n        val pic: String,\n        @SerializedName(\"pk_status\")\n        val pkStatus: String\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveUpData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class LiveUpData(\n    @SerializedName(\"activity_banner_info\")\n    val activityBannerInfo: ActivityBannerInfo,\n    @SerializedName(\"activity_lol_match_info\")\n    val activityLolMatchInfo: ActivityLolMatchInfo,\n    @SerializedName(\"activity_score_info\")\n    val activityScoreInfo: Any,\n    @SerializedName(\"anchor_info\")\n    val anchorInfo: AnchorInfo,\n    @SerializedName(\"anchor_reward\")\n    val anchorReward: AnchorReward,\n    @SerializedName(\"guard_buy_info\")\n    val guardBuyInfo: GuardBuyInfo,\n    @SerializedName(\"guard_info\")\n    val guardInfo: GuardInfo,\n    @SerializedName(\"pk_info\")\n    val pkInfo: Any,\n    @SerializedName(\"rankdb_info\")\n    val rankdbInfo: RankdbInfo,\n    @SerializedName(\"room_info\")\n    val roomInfo: RoomInfo,\n    @SerializedName(\"round_video_info\")\n    val roundVideoInfo: Any,\n    @SerializedName(\"skin_info\")\n    val skinInfo: SkinInfo,\n    @SerializedName(\"tab_info\")\n    val tabInfo: List<TabInfo>\n) {\n    data class AnchorInfo(\n        @SerializedName(\"base_info\")\n        val baseInfo: BaseInfo,\n        @SerializedName(\"live_info\")\n        val liveInfo: LiveInfo,\n        @SerializedName(\"relation_info\")\n        val relationInfo: RelationInfo\n    ) {\n        data class BaseInfo(\n            @SerializedName(\"face\")\n            val face: String,\n            @SerializedName(\"gender\")\n            val gender: String,\n            @SerializedName(\"official_info\")\n            val officialInfo: OfficialInfo,\n            @SerializedName(\"uname\")\n            val uname: String\n        ) {\n            data class OfficialInfo(\n                @SerializedName(\"desc\")\n                val desc: String,\n                @SerializedName(\"role\")\n                val role: Int,\n                @SerializedName(\"title\")\n                val title: String\n            )\n        }\n\n        data class LiveInfo(\n            @SerializedName(\"level\")\n            val level: Int,\n            @SerializedName(\"level_color\")\n            val levelColor: Int\n        )\n\n        data class RelationInfo(\n            @SerializedName(\"attention\")\n            val attention: Int\n        )\n    }\n\n    data class TabInfo(\n        @SerializedName(\"default\")\n        val default: Int,\n        @SerializedName(\"default_sub_tab\")\n        val defaultSubTab: String,\n        @SerializedName(\"desc\")\n        val desc: String,\n        @SerializedName(\"order\")\n        val order: Int,\n        @SerializedName(\"status\")\n        val status: Int,\n        @SerializedName(\"sub_tab\")\n        val subTab: List<Any>,\n        @SerializedName(\"type\")\n        val type: String,\n        @SerializedName(\"url\")\n        val url: String\n    )\n\n    data class GuardBuyInfo(\n        @SerializedName(\"count\")\n        val count: Int,\n        @SerializedName(\"duration\")\n        val duration: Int,\n        @SerializedName(\"list\")\n        val list: List<Any>\n    )\n\n    data class SkinInfo(\n        @SerializedName(\"current_time\")\n        val currentTime: Int,\n        @SerializedName(\"end_time\")\n        val endTime: Int,\n        @SerializedName(\"id\")\n        val id: Int,\n        @SerializedName(\"skin_config\")\n        val skinConfig: String,\n        @SerializedName(\"start_time\")\n        val startTime: Int\n    )\n\n    data class GuardInfo(\n        @SerializedName(\"count\")\n        val count: Int\n    )\n\n    data class AnchorReward(\n        @SerializedName(\"wish_open\")\n        val wishOpen: Boolean\n    )\n\n    data class RankdbInfo(\n        @SerializedName(\"color\")\n        val color: String,\n        @SerializedName(\"h5_url\")\n        val h5Url: String,\n        @SerializedName(\"rank_desc\")\n        val rankDesc: String,\n        @SerializedName(\"timestamp\")\n        val timestamp: Int,\n        @SerializedName(\"web_url\")\n        val webUrl: String\n    )\n\n    data class ActivityBannerInfo(\n        @SerializedName(\"bottom\")\n        val bottom: List<Any>,\n        @SerializedName(\"gift_banner\")\n        val giftBanner: GiftBanner,\n        @SerializedName(\"inputBanner\")\n        val inputBanner: List<Any>,\n        @SerializedName(\"lol_activity\")\n        val lolActivity: LolActivity,\n        @SerializedName(\"superBanner\")\n        val superBanner: Any,\n        @SerializedName(\"top\")\n        val top: List<Top>\n    ) {\n        data class Top(\n            @SerializedName(\"activity_title\")\n            val activityTitle: String,\n            @SerializedName(\"color\")\n            val color: String,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"expire_hour\")\n            val expireHour: Int,\n            @SerializedName(\"gift_img\")\n            val giftImg: String,\n            @SerializedName(\"id\")\n            val id: Int,\n            @SerializedName(\"is_close\")\n            val isClose: Int,\n            @SerializedName(\"jump_url\")\n            val jumpUrl: String,\n            @SerializedName(\"rank\")\n            val rank: String,\n            @SerializedName(\"rank_name\")\n            val rankName: String,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"type\")\n            val type: Int,\n            @SerializedName(\"week_gift_color\")\n            val weekGiftColor: String,\n            @SerializedName(\"week_rank_color\")\n            val weekRankColor: String,\n            @SerializedName(\"week_text_color\")\n            val weekTextColor: String\n        )\n\n        data class GiftBanner(\n            @SerializedName(\"img\")\n            val img: List<Any>,\n            @SerializedName(\"interval\")\n            val interval: Int\n        )\n\n        data class LolActivity(\n            @SerializedName(\"guess_cover\")\n            val guessCover: String,\n            @SerializedName(\"status\")\n            val status: Int,\n            @SerializedName(\"vote_cover\")\n            val voteCover: String\n        )\n    }\n\n    data class ActivityLolMatchInfo(\n        @SerializedName(\"commentatorInfo\")\n        val commentatorInfo: List<Any>,\n        @SerializedName(\"guess_info\")\n        val guessInfo: List<Any>,\n        @SerializedName(\"match_id\")\n        val matchId: Int,\n        @SerializedName(\"round\")\n        val round: Int,\n        @SerializedName(\"status\")\n        val status: Int,\n        @SerializedName(\"team_info\")\n        val teamInfo: List<Any>,\n        @SerializedName(\"timestamp\")\n        val timestamp: Int,\n        @SerializedName(\"vote_config\")\n        val voteConfig: VoteConfig\n    ) {\n        data class VoteConfig(\n            @SerializedName(\"price\")\n            val price: Int,\n            @SerializedName(\"status\")\n            val status: Int,\n            @SerializedName(\"vote_nums\")\n            val voteNums: List<Int>\n        )\n    }\n\n    data class RoomInfo(\n        @SerializedName(\"area_id\")\n        val areaId: Int,\n        @SerializedName(\"area_name\")\n        val areaName: String,\n        @SerializedName(\"background\")\n        val background: String,\n        @SerializedName(\"cover\")\n        val cover: String,\n        @SerializedName(\"description\")\n        val description: String?,\n        @SerializedName(\"hidden_status\")\n        val hiddenStatus: Int,\n        @SerializedName(\"hidden_time\")\n        val hiddenTime: Int,\n        @SerializedName(\"keyframe\")\n        val keyframe: String,\n        @SerializedName(\"live_screen_type\")\n        val liveScreenType: Int,\n        @SerializedName(\"live_start_time\")\n        val liveStartTime: Int,\n        @SerializedName(\"live_status\")\n        val liveStatus: Int,\n        @SerializedName(\"lock_status\")\n        val lockStatus: Int,\n        @SerializedName(\"lock_time\")\n        val lockTime: Int,\n        @SerializedName(\"online\")\n        val online: Int,\n        @SerializedName(\"parent_area_id\")\n        val parentAreaId: Int,\n        @SerializedName(\"parent_area_name\")\n        val parentAreaName: String,\n        @SerializedName(\"pendants\")\n        val pendants: Pendants,\n        @SerializedName(\"pk_status\")\n        val pkStatus: Int,\n        @SerializedName(\"room_id\")\n        val roomId: Int,\n        @SerializedName(\"short_id\")\n        val shortId: Int,\n        @SerializedName(\"special_type\")\n        val specialType: Int,\n        @SerializedName(\"tags\")\n        val tags: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"uid\")\n        val uid: Int,\n        @SerializedName(\"up_session\")\n        val upSession: String\n    ) {\n        data class Pendants(\n            @SerializedName(\"badge\")\n            val badge: Any,\n            @SerializedName(\"frame\")\n            val frame: Any\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/LiveUserData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class LiveUserData(\n    @SerializedName(\"area_name\")\n    val areaName: String,\n    @SerializedName(\"attention_num\")\n    val attentionNum: Int,\n    @SerializedName(\"desc\")\n    val desc: String,\n    @SerializedName(\"face\")\n    val face: String,\n    @SerializedName(\"fans_medal\")\n    val fansMedal: Any,\n    @SerializedName(\"follow_num\")\n    val followNum: Int,\n    @SerializedName(\"is_admin\")\n    val isAdmin: Int,\n    @SerializedName(\"is_block\")\n    val isBlock: Int,\n    @SerializedName(\"level_color\")\n    val levelColor: Int,\n    @SerializedName(\"mailbox_notice\")\n    val mailboxNotice: Int,\n    @SerializedName(\"mailbox_switch\")\n    val mailboxSwitch: Int,\n    @SerializedName(\"main_vip\")\n    val mainVip: Int,\n    @SerializedName(\"month_vip\")\n    val monthVip: Int,\n    @SerializedName(\"pendant\")\n    val pendant: String,\n    @SerializedName(\"pendant_from\")\n    val pendantFrom: Int,\n    @SerializedName(\"privilege_type\")\n    val privilegeType: Int,\n    @SerializedName(\"relation_status\")\n    val relationStatus: Int,\n    @SerializedName(\"room_id\")\n    val roomId: Int,\n    @SerializedName(\"title_mark\")\n    val titleMark: String,\n    @SerializedName(\"uid\")\n    val uid: Int,\n    @SerializedName(\"uname\")\n    val uname: String,\n    @SerializedName(\"uname_color\")\n    val unameColor: Int,\n    @SerializedName(\"user_level\")\n    val userLevel: Int,\n    @SerializedName(\"verify_type\")\n    val verifyType: Int,\n    @SerializedName(\"year_vip\")\n    val yearVip: Int\n)"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/MultiItemLiveData.java",
    "content": "package com.bilibili.lingxiao.home.live.model;\n\nimport java.util.List;\n\npublic class MultiItemLiveData {\n    public static final int RECOMMEND = 1;\n    public static final int PARTITION = 2;\n    public int itemType;\n\n    public MultiItemLiveData(int type){\n        this.itemType = type;\n    }\n\n    private List<LiveData.BannerBean> bannerList;\n    private LiveData.EntranceIconsBean entranceIconsBean;\n    private LiveData.PartitionsBean partitionsBean;\n    private List<LiveData.RecommendDataBean.LivesBean> liveList;\n\n    public List<LiveData.BannerBean> getBannerList() {\n        return bannerList;\n    }\n\n    public void setBannerList(List<LiveData.BannerBean> bannerList) {\n        this.bannerList = bannerList;\n    }\n\n    public LiveData.EntranceIconsBean getEntranceIconsBean() {\n        return entranceIconsBean;\n    }\n\n    public void setEntranceIconsBean(LiveData.EntranceIconsBean entranceIconsBean) {\n        this.entranceIconsBean = entranceIconsBean;\n    }\n\n    public LiveData.PartitionsBean getPartitionsBean() {\n        return partitionsBean;\n    }\n\n    public void setPartitionsBean(LiveData.PartitionsBean partitionsBean) {\n        this.partitionsBean = partitionsBean;\n    }\n\n    public List<LiveData.RecommendDataBean.LivesBean> getLiveList() {\n        return liveList;\n    }\n\n    public void setLiveList(List<LiveData.RecommendDataBean.LivesBean> lives) {\n        this.liveList = lives;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/model/UpInfoData.kt",
    "content": "package com.bilibili.lingxiao.home.live.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class UpInfoData(\n    @SerializedName(\"aid\")\n    val aid: Int,\n    @SerializedName(\"attribute\")\n    val attribute: Int,\n    @SerializedName(\"cid\")\n    val cid: Int,\n    @SerializedName(\"copyright\")\n    val copyright: Int,\n    @SerializedName(\"ctime\")\n    val ctime: Int,\n    @SerializedName(\"desc\")\n    val desc: String,\n    @SerializedName(\"dimension\")\n    val dimension: Dimension,\n    @SerializedName(\"duration\")\n    val duration: Int,\n    @SerializedName(\"dynamic\")\n    val `dynamic`: String,\n    @SerializedName(\"owner\")\n    val owner: Owner,\n    @SerializedName(\"pic\")\n    val pic: String,\n    @SerializedName(\"pubdate\")\n    val pubdate: Int,\n    @SerializedName(\"rights\")\n    val rights: Rights,\n    @SerializedName(\"stat\")\n    val stat: Stat,\n    @SerializedName(\"state\")\n    val state: Int,\n    @SerializedName(\"tid\")\n    val tid: Int,\n    @SerializedName(\"title\")\n    val title: String,\n    @SerializedName(\"tname\")\n    val tname: String,\n    @SerializedName(\"videos\")\n    val videos: Int\n) {\n    data class Stat(\n        @SerializedName(\"aid\")\n        val aid: Int,\n        @SerializedName(\"coin\")\n        val coin: Int,\n        @SerializedName(\"danmaku\")\n        val danmaku: Int,\n        @SerializedName(\"dislike\")\n        val dislike: Int,\n        @SerializedName(\"favorite\")\n        val favorite: Int,\n        @SerializedName(\"his_rank\")\n        val hisRank: Int,\n        @SerializedName(\"like\")\n        val like: Int,\n        @SerializedName(\"now_rank\")\n        val nowRank: Int,\n        @SerializedName(\"reply\")\n        val reply: Int,\n        @SerializedName(\"share\")\n        val share: Int,\n        @SerializedName(\"view\")\n        val view: Int\n    )\n\n    data class Owner(\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"mid\")\n        val mid: Int,\n        @SerializedName(\"name\")\n        val name: String\n    )\n\n    data class Rights(\n        @SerializedName(\"autoplay\")\n        val autoplay: Int,\n        @SerializedName(\"bp\")\n        val bp: Int,\n        @SerializedName(\"download\")\n        val download: Int,\n        @SerializedName(\"elec\")\n        val elec: Int,\n        @SerializedName(\"hd5\")\n        val hd5: Int,\n        @SerializedName(\"is_cooperation\")\n        val isCooperation: Int,\n        @SerializedName(\"movie\")\n        val movie: Int,\n        @SerializedName(\"no_reprint\")\n        val noReprint: Int,\n        @SerializedName(\"pay\")\n        val pay: Int,\n        @SerializedName(\"ugc_pay\")\n        val ugcPay: Int,\n        @SerializedName(\"ugc_pay_preview\")\n        val ugcPayPreview: Int\n    )\n\n    data class Dimension(\n        @SerializedName(\"height\")\n        val height: Int,\n        @SerializedName(\"rotate\")\n        val rotate: Int,\n        @SerializedName(\"width\")\n        val width: Int\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/FansDetailPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.ui.play.FansDetailFragment\nimport com.bilibili.lingxiao.home.live.model.FansGoldListData\nimport com.bilibili.lingxiao.home.live.view.FansDetailView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass FansDetailPresenter(view: FansDetailView, fragment: FansDetailFragment) :\n    BasePresenter<FansDetailView, FansDetailFragment>(view, fragment) {\n    var httpTrans:HttpTrans\n    init {\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getFansGoldList(roomId:Int,ruid:Int){\n        httpTrans.getLiveGoldList(roomId,ruid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetFansGoldList(lists[0] as FansGoldListData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n    fun getLiveToDayList(roomId:Int,ruid:Int){\n        httpTrans.getLiveToDayList(roomId,ruid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetFansGoldList(lists[0] as FansGoldListData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n    fun getLiveFansList(roomId:Int,ruid:Int){\n        httpTrans.getLiveFansList(roomId,ruid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetFansGoldList(lists[0] as FansGoldListData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/FleetPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.ui.play.FleetListFragment\nimport com.bilibili.lingxiao.home.live.model.FleetListData\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass FleetPresenter(view: LivePlayView, fragment: FleetListFragment) :\n    BasePresenter<LivePlayView, FleetListFragment>(view, fragment) {\n    var httpTrans:HttpTrans\n    init {\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getFleetList(page:Int,pageSize:Int,ruid:Int){\n        httpTrans.getLiveFleetList(page,pageSize,ruid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetFleetList(lists[0] as FleetListData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/InteractPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.model.LiveChatData\nimport com.bilibili.lingxiao.home.live.ui.play.InteractFragment\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass InteractPresenter(view: LivePlayView, fragment: InteractFragment) :\n    BasePresenter<LivePlayView, InteractFragment>(view, fragment) {\n    var httpTrans:HttpTrans\n    init {\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getChatHistory(roomId:Int){\n        httpTrans.getHistoryChat(roomId,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                var chatdata = lists[0] as LiveChatData\n                mView?.onGetUpChatHistory(chatdata.room)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n               mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/LiveAllPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.model.LiveAllData\nimport com.bilibili.lingxiao.home.live.ui.LiveAllFragment\nimport com.bilibili.lingxiao.home.live.view.LiveAllView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass LiveAllPresenter(view: LiveAllView, fragment: LiveAllFragment) :\n    BasePresenter<LiveAllView,LiveAllFragment>(view,fragment){\n    var httpTrans: HttpTrans\n    init {\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getLiveAllList(page:Int,type:String,areaId:Int,parentAreaId:Int){\n        httpTrans.getLiveAllList(page,30,type,areaId,parentAreaId, object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetHotList(lists[0] as LiveAllData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/LivePlayPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.model.LiveUpData\nimport com.bilibili.lingxiao.home.live.model.LiveUserData\nimport com.bilibili.lingxiao.home.live.ui.LivePlayActivity\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass LivePlayPresenter(view: LivePlayView, activity: LivePlayActivity) :\n    BasePresenter<LivePlayView, LivePlayActivity>(view, activity) {\n\n    var httpTrans: HttpTrans\n    init {\n        httpTrans = HttpTrans(activity)\n    }\n\n    fun getUpInfo(roomId:Int){\n        httpTrans.getLiveUpInfo(roomId,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetUpInfo(lists[0] as LiveUpData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n\n            }\n\n            override fun onCancel() {\n            }\n\n        })\n    }\n\n    fun getUserInfo(ruid:Int,uid:Int){\n        httpTrans.getLiveUserInfo(ruid,uid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetUserInfo(lists[0] as LiveUserData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/LivePresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.bilibili.lingxiao.home.live.ui.LiveFragment\nimport com.bilibili.lingxiao.home.live.view.LiveView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass LivePresenter : BasePresenter<LiveView, LiveFragment> {\n\n    private val TAG = LivePresenter::class.java.simpleName\n    var liveTrans : HttpTrans\n    //@Inject\n    constructor(view: LiveView, fragment: LiveFragment):super(view, fragment){\n        liveTrans = HttpTrans(fragment)\n    }\n\n    fun getLiveList(){\n        liveTrans.getLiveList(object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetLiveList(lists[0] as LiveData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/LiveTabPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.model.LiveTabData\nimport com.bilibili.lingxiao.home.live.ui.LiveMoreActivity\nimport com.bilibili.lingxiao.home.live.view.LiveTabView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass LiveTabPresenter(view: LiveTabView, fragment: LiveMoreActivity) :\n    BasePresenter<LiveTabView, LiveMoreActivity>(view, fragment) {\n    var httpTrans: HttpTrans\n    init {\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getTabList(parentId:Int){\n        httpTrans.getLiveTabList(parentId,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetTabList(lists[0] as List<LiveTabData.Tab>)\n            }\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/presenter/UpVideoPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.live.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.live.model.UpInfoData\nimport com.bilibili.lingxiao.home.live.ui.play.UpInfoFragment\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass UpVideoPresenter(view: LivePlayView, fragment: UpInfoFragment) :\n    BasePresenter<LivePlayView, UpInfoFragment>(view, fragment) {\n    var httpTrans: HttpTrans\n    init {\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getUpVideo(page:Int,pageSize:Int,ruid:Int){\n        httpTrans.getLiveUpVideoList(page,pageSize,ruid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetUpVideoList(lists[0] as List<UpInfoData>)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/LiveAllActivity.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.widget.RippleAnimation\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.rxbus.SkinChangedEvent\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport kotlinx.android.synthetic.main.activity_live_all.*\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass LiveAllActivity : BaseActivity() {\n    val tabArray by lazy {\n        resources.getStringArray(R.array.live_all)\n    }\n    override val contentLayoutId: Int\n        get() = R.layout.activity_live_all\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n    val searchDialogFragment = SearchDialogFragment()\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onSkinChanged(event : SkinChangedEvent){\n        UltimateBar.newColorBuilder()\n            .statusColor(event.color)   // 状态栏颜色\n            .applyNav(true)             // 是否应用到导航栏\n            .navColor(event.color)         // 导航栏颜色\n            .build(this)\n            .apply()\n\n    }\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(toolbar)\n        toolbar.title = resources.getString(R.string.live_all_title)\n        for (name in tabArray){\n            tabLayout.addTab(tabLayout.newTab().setText(name))\n        }\n        viewPager.adapter = PagerAdapter(supportFragmentManager)\n        viewPager.offscreenPageLimit = tabArray.size\n        tabLayout.setupWithViewPager(viewPager)\n        image_search.setOnClickListener {\n            searchDialogFragment.show(supportFragmentManager,LiveAllActivity::class.java.simpleName)\n        }\n    }\n\n    inner class PagerAdapter(fm: androidx.fragment.app.FragmentManager) : androidx.fragment.app.FragmentPagerAdapter(fm) {\n\n        override fun getCount(): Int {\n            return tabArray.size\n        }\n\n        override fun getItem(position: Int): androidx.fragment.app.Fragment {\n            val fragment = LiveAllFragment()\n            val bundle = Bundle()\n            if (position == 0){\n                bundle.putString(\"type\", \"online\")\n            }else{\n                bundle.putString(\"type\", \"live_time\")\n            }\n            fragment.setArguments(bundle)\n            return fragment\n        }\n\n        override fun getPageTitle(position: Int): CharSequence? {\n            return tabArray[position]\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/LiveAllFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.recyclerview.widget.GridLayoutManager\nimport android.view.View\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.LiveAllData\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.bilibili.lingxiao.home.live.presenter.LiveAllPresenter\nimport com.bilibili.lingxiao.home.live.view.LiveAllView\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport kotlinx.android.synthetic.main.normal_refresh_view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.view.*\nimport org.greenrobot.eventbus.EventBus\nimport com.flyco.tablayout.listener.CustomTabEntity\n\n\n\nclass LiveAllFragment :BaseFragment(),LiveAllView{\n    private var liveList = arrayListOf<LiveAllData.LiveInfo>()\n    lateinit var videoAdapter:VideoAdapter\n    private var presenter = LiveAllPresenter(this,this)\n    private val mTabEntities = arrayListOf<CustomTabEntity>()\n    var type = \"online\"\n    var areaId = 0\n    var parentAreaId = 0\n    var page = 1\n    override val contentLayoutId: Int\n        get() = R.layout.normal_refresh_view\n\n    override fun initArgs(bundle: Bundle?) {\n        super.initArgs(bundle)\n        bundle?.let {\n            type = it.getString(\"type\")\n            areaId = it.getInt(\"areaId\")\n            parentAreaId = it.getInt(\"parentAreaId\")\n        }\n    }\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        videoAdapter =\n            VideoAdapter(R.layout.item_live_video, liveList)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(context, 2)\n        root.recycerView.adapter = videoAdapter\n        root.recycerView.layoutManager = manager\n        root.refresh.setOnRefreshListener {\n            page = 1\n            liveList.clear()\n            presenter.getLiveAllList(1,type,areaId,parentAreaId)\n        }\n        root.refresh.setOnLoadMoreListener {\n            page++\n            presenter.getLiveAllList(page,type,areaId,parentAreaId)\n        }\n        videoAdapter.setOnItemClickListener { adapter, view, position ->\n            val intent = Intent(context, LivePlayActivity::class.java)\n            intent.putExtra(\"play_url\",liveList[position].playUrl)\n            intent.putExtra(\"room_id\",liveList[position].roomid)\n            startActivity(intent)\n            var live = LiveData.RecommendDataBean.LivesBean()\n            live.owner = LiveData.RecommendDataBean.LivesBean.OwnerBean()\n            live.owner.face = liveList[position].face\n            live.owner.name = liveList[position].uname\n            live.online = liveList[position].online\n            live.area = liveList[position].areaName\n            live.room_id = liveList[position].roomid\n            EventBus.getDefault().postSticky(live)\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n    override fun onGetHotList(data: LiveAllData) {\n        videoAdapter.addData(data.list)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n        if (data.newTags.size > 0 && areaId != 0 && parentAreaId != 0){\n            mTabEntities.clear()\n            tablayout.visibility = View.VISIBLE\n            for (tag in data.newTags){\n                mTabEntities.add(TabEntity(tag.name))\n            }\n            tablayout.setTabData(mTabEntities)\n        }\n    }\n\n    override fun onGetNewList(data: LiveAllData) {\n        videoAdapter.addData(data.list)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n\n    class VideoAdapter(layoutResId: Int, data: MutableList<LiveAllData.LiveInfo>) :\n        BaseQuickAdapter<LiveAllData.LiveInfo, BaseViewHolder>(layoutResId, data) {\n        override fun convert(helper: BaseViewHolder, item: LiveAllData.LiveInfo) {\n            var image : SimpleDraweeView = helper.getView(R.id.live_user_image)\n            image.setImageURI(Uri.parse(item.systemCover + GlobalProperties.IMAGE_RULE_240_150))\n            helper.setText(R.id.live_title,item.title)\n            helper.setText(R.id.live_category_name,item.areaName)\n            helper.setText(R.id.live_username,item.uname)\n            helper.setText(R.id.live_people_number, StringUtil.getBigDecimalNumber(item.online))\n        }\n    }\n    inner class TabEntity(var title:String): CustomTabEntity{\n        override fun getTabUnselectedIcon(): Int {\n            return R.mipmap.ic_launcher\n        }\n\n        override fun getTabSelectedIcon(): Int {\n            return R.mipmap.ic_launcher\n        }\n\n        override fun getTabTitle(): String {\n            return title\n        }\n\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/LiveFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\nimport android.content.Intent\nimport androidx.recyclerview.widget.LinearLayoutManager\n\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.utils.ToastUtil\n\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout\nimport kotlinx.android.synthetic.main.fragment_live.view.*\nimport kotlin.properties.Delegates\nimport androidx.recyclerview.widget.RecyclerView\nimport android.widget.Button\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.bilibili.lingxiao.home.live.BannerImageLoader\nimport com.bilibili.lingxiao.home.live.presenter.LivePresenter\nimport com.bilibili.lingxiao.home.live.view.LiveView\nimport com.bilibili.lingxiao.home.live.adapter.LiveRecyAdapter\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.bilibili.lingxiao.home.live.model.MultiItemLiveData\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.youth.banner.Banner\nimport com.youth.banner.BannerConfig\nimport com.youth.banner.Transformer\nimport com.youth.banner.listener.OnBannerListener\nimport kotlinx.android.synthetic.main.fragment_live.*\nimport kotlinx.android.synthetic.main.layout_banner.view.*\nimport org.greenrobot.eventbus.EventBus\n\n/**\n * 主页的main fragment\n */\nclass LiveFragment :BaseFragment() , LiveView {\n    var livePresenter: LivePresenter =\n        LivePresenter(this, this)\n    val TAG = LiveFragment::class.java.simpleName\n    var liveList = arrayListOf<MultiItemLiveData>()\n\n    private var liveAdapter: LiveRecyAdapter by Delegates.notNull()\n    private var refresh: SmartRefreshLayout by Delegates.notNull()\n\n    private val topView by lazy {\n        View.inflate(activity,R.layout.live_top_region,null)\n    }\n\n    private val footerShowAllView by lazy {\n        View.inflate(activity,R.layout.footer_live_showall,null)\n    }\n\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_live\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        var manager = LinearLayoutManager(context)\n        //让互相嵌套的RecyclerView的item都使用同一个共享池\n        val recycledViewPool = RecyclerView.RecycledViewPool()\n        root.live_recy.setRecycledViewPool(recycledViewPool)\n        liveAdapter = LiveRecyAdapter(liveList, recycledViewPool)\n        root.live_recy.adapter = liveAdapter\n        root.live_recy.layoutManager = manager\n        refresh = root.refresh\n        refresh.setOnRefreshListener {\n            livePresenter.getLiveList()\n        }\n        refresh.setEnableScrollContentWhenRefreshed(false)\n        liveAdapter.setMultiItemClickListener(object : LiveRecyAdapter.OnMultiItemClickListener{\n            override fun onRecommendClick(live: LiveData.RecommendDataBean.LivesBean, position: Int) {\n                val intent = Intent(context, LivePlayActivity::class.java)\n                intent.putExtra(\"play_url\",live.playurl)\n                intent.putExtra(\"room_id\",live.room_id)\n                startActivity(intent)\n                EventBus.getDefault().postSticky(live)\n            }\n\n            override fun onPartitionClick(live: LiveData.RecommendDataBean.LivesBean, position: Int) {\n                val intent = Intent(context, LivePlayActivity::class.java)\n                intent.putExtra(\"play_url\",live.playurl)\n                intent.putExtra(\"room_id\",live.room_id)\n                startActivity(intent)\n                EventBus.getDefault().postSticky(live)\n            }\n        })\n        liveAdapter.setOnItemChildClickListener { adapter, view, position ->\n            when(view.id){\n                R.id.live_look_more ->{\n                    var intent = Intent(context,LiveMoreActivity::class.java)\n                    intent.putExtra(\"parentId\",liveList[position].partitionsBean.partition.id)\n                    intent.putExtra(\"parentName\",liveList[position].partitionsBean.partition.name)\n                    startActivity(intent)\n                }\n                R.id.live_recommend_more -> startActivity(Intent(context,LiveAllActivity::class.java))\n            }\n        }\n        //floatingBtnToogle(root.live_recy, root.fab_live)\n        root.fab_live.setOnClickListener {\n          val intent = Intent(activity,StreamHomeActivity::class.java)\n            startActivity(intent)\n        }\n        initTopAndBottomView()\n    }\n\n    private fun initTopAndBottomView() {\n        liveAdapter.addHeaderView(topView)\n        liveAdapter.addFooterView(footerShowAllView)\n        var emptyView = View.inflate(context,R.layout.layout_empty,null)\n        var image = emptyView.findViewById<ImageView>(R.id.image_error)\n        image.setImageDrawable(resources.getDrawable(R.drawable.img_holder_error_style3))\n        liveAdapter.setEmptyView(emptyView)\n\n        var followText = topView.findViewById<TextView>(R.id.tv_live_follow)\n        followText.setOnClickListener {\n            var intent = Intent(context,LiveMoreActivity::class.java)\n            intent.putExtra(\"parentId\",5)\n            intent.putExtra(\"parentName\",followText.text)\n            startActivity(intent)\n        }\n        var videoText = topView.findViewById<TextView>(R.id.tv_live_happy)\n        videoText.setOnClickListener {\n            var intent = Intent(context,LiveMoreActivity::class.java)\n            intent.putExtra(\"parentId\",1)\n            intent.putExtra(\"parentName\",videoText.text)\n            startActivity(intent)\n        }\n        var gameText = topView.findViewById<TextView>(R.id.tv_live_video)\n        gameText.setOnClickListener {\n            var intent = Intent(context,LiveMoreActivity::class.java)\n            intent.putExtra(\"parentId\",2)\n            intent.putExtra(\"parentName\",gameText.text)\n            startActivity(intent)\n        }\n        var mobileGame = topView.findViewById<TextView>(R.id.tv_live_game)\n        mobileGame.setOnClickListener {\n            var intent = Intent(context,LiveMoreActivity::class.java)\n            intent.putExtra(\"parentId\",3)\n            intent.putExtra(\"parentName\",mobileGame.text)\n            startActivity(intent)\n        }\n        var drawText = topView.findViewById<TextView>(R.id.tv_live_draw)\n        drawText.setOnClickListener {\n            var intent = Intent(context,LiveMoreActivity::class.java)\n            intent.putExtra(\"parentId\",4)\n            intent.putExtra(\"parentName\",drawText.text)\n            startActivity(intent)\n        }\n        footerShowAllView.findViewById<Button>(R.id.button).setOnClickListener {\n            startActivity(Intent(context,LiveAllActivity::class.java))\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onVisiblityChanged(visiblity: Boolean) {\n        super.onVisiblityChanged(visiblity)\n        if (visiblity && liveAdapter.itemCount - liveAdapter.headerLayoutCount - liveAdapter.footerLayoutCount < 1){\n            refresh.autoRefresh()\n        }\n        //TODO: 在fragment中，当可见的时候，会存在自己添加的头布局自动上拉\n        //live_recy.smoothScrollToPosition(0)\n    }\n\n    //var bannerData = MultiItemLiveData(MultiItemLiveData.BANNER)\n    var recommendData = MultiItemLiveData(MultiItemLiveData.RECOMMEND)\n    override fun onGetLiveList(data: LiveData) {\n        liveList.clear()\n        initBanner(topView.live_banner,data.banner)\n        recommendData.liveList = data.recommend_data.lives\n        recommendData.partitionsBean = if (data.partitions.size > 0) data.partitions[0] else\n            LiveData.PartitionsBean()\n        recommendData.partitionsBean.partition = data.recommend_data.partition\n        liveList.add(recommendData)\n\n        for (partition in data.partitions){\n            var partitionData = MultiItemLiveData(MultiItemLiveData.PARTITION)\n            partitionData.partitionsBean = partition\n            liveList.add(partitionData)\n        }\n\n        liveAdapter.notifyDataSetChanged()\n        refresh.finishRefresh()\n    }\n\n\n    private var initBanner = false\n    private fun initBanner(banner : Banner, bannerData: List<LiveData.BannerBean>) {\n        if (initBanner) return\n        var images = ArrayList<String>()\n        for (image in bannerData){\n            images?.add(image.img)\n        }\n        banner.setImageLoader(BannerImageLoader())\n        //设置图片集合\n        banner.setImages(images)\n        //设置banner动画效果\n        banner.setBannerAnimation(Transformer.DepthPage)\n        //设置标题集合（当banner样式有显示title时）\n        //live_banner.setBannerTitles(banner.get(0).title);\n        //设置自动轮播，默认为true\n        banner.isAutoPlay(true)\n        //设置轮播时间\n        banner.setDelayTime(3000)\n        //设置指示器位置（当banner模式中有指示器时）\n        banner.setIndicatorGravity(BannerConfig.CENTER)\n        //banner设置方法全部调用完毕时最后调用\n        banner.start()\n        initBanner = true\n\n        banner.setOnBannerListener(object : OnBannerListener {\n            override fun OnBannerClick(position: Int) {\n                var intent = Intent(context, WebActivity::class.java)\n                intent.putExtra(\"uri\",bannerData[position].link)\n                intent.putExtra(\"title\",bannerData[position].title)\n                intent.putExtra(\"image\",bannerData[position].img)\n                startActivity(intent)\n            }\n\n        })\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/LiveMoreActivity.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.LiveTabData\nimport com.bilibili.lingxiao.home.live.presenter.LiveTabPresenter\nimport com.bilibili.lingxiao.home.live.view.LiveTabView\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.camera.lingxiao.common.app.BaseActivity\nimport kotlinx.android.synthetic.main.activity_live_more.*\nimport kotlinx.android.synthetic.main.title_bar.*\n\nclass LiveMoreActivity :BaseActivity(),LiveTabView{\n\n    private var presenter = LiveTabPresenter(this,this)\n    private var tabList = arrayListOf<LiveTabData.Tab>()\n    private lateinit var mAdapter:PagerAdapter\n    override val contentLayoutId: Int\n        get() = R.layout.activity_live_more\n\n    override fun initWidget() {\n        super.initWidget()\n        var intent = getIntent()\n        var parentId = intent.getIntExtra(\"parentId\",1)\n        var parentName = intent.getStringExtra(\"parentName\")\n        setToolbarBack(title_bar)\n        title_bar.title = parentName\n        mAdapter = PagerAdapter(supportFragmentManager)\n        viewpager.setAdapter(mAdapter)\n        tablayout.setViewPager(viewpager)\n        presenter.getTabList(parentId)\n    }\n\n    override fun onGetTabList(tabs: List<LiveTabData.Tab>) {\n        tabList.addAll(tabs)\n        mAdapter.notifyDataSetChanged()\n        tablayout.notifyDataSetChanged()\n    }\n\n    override fun showDialog() {\n    }\n\n    override fun diamissDialog() {\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n\n    inner class PagerAdapter(fm: androidx.fragment.app.FragmentManager) : androidx.fragment.app.FragmentPagerAdapter(fm) {\n\n        override fun getCount(): Int {\n            return tabList.size\n        }\n\n        override fun getItem(position: Int): androidx.fragment.app.Fragment {\n            val fragment = LiveAllFragment()\n            val bundle = Bundle()\n            bundle.putString(\"type\",\"online\")  //其他的分类暂时就不展示了\n            tabList[position].id?.toIntOrNull()?.let { bundle.putInt(\"areaId\", it) }\n            tabList[position].parentId?.toIntOrNull()?.let { bundle.putInt(\"parentAreaId\", it) }\n            fragment.setArguments(bundle)\n            return fragment\n        }\n\n        override fun getPageTitle(position: Int): CharSequence? {\n            return tabList[position].name\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/LivePlayActivity.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\nimport android.content.res.Configuration\nimport android.net.Uri\nimport android.view.Gravity\nimport android.view.View\nimport android.view.WindowManager\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.adapter.PlayPagerAdapter\nimport com.bilibili.lingxiao.home.live.DanMaKuTool\nimport com.bilibili.lingxiao.home.live.model.*\nimport com.bilibili.lingxiao.home.live.ui.play.FansFragment\nimport com.bilibili.lingxiao.home.live.presenter.LivePlayPresenter\nimport com.bilibili.lingxiao.home.live.ui.play.FleetListFragment\nimport com.bilibili.lingxiao.home.live.ui.play.InteractFragment\nimport com.bilibili.lingxiao.home.live.ui.play.UpInfoFragment\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport kotlinx.android.synthetic.main.activity_live_play.*\nimport org.greenrobot.eventbus.EventBus\nimport java.util.ArrayList\nimport javax.inject.Inject\nimport kotlin.properties.Delegates\n\nclass LivePlayActivity : BaseActivity() , LivePlayView {\n\n    @Inject\n    lateinit var interactFragment: InteractFragment\n    @Inject\n    lateinit var upInfoFragment: UpInfoFragment\n    @Inject\n    lateinit var fansFragment: FansFragment\n    @Inject\n    lateinit var fleetListFragment: FleetListFragment\n    var fragmentList: ArrayList<BaseFragment> = arrayListOf()\n    var  tabArray: Array<String> by Delegates.notNull()\n\n    public var livePresenter = LivePlayPresenter(this, this)\n    private var ruid = 0\n    override val contentLayoutId: Int\n        get() = R.layout.activity_live_play\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n    override fun initWidget() {\n        super.initWidget()\n        //屏幕常亮\n\n        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n        tabArray = resources.getStringArray(R.array.live_tab)\n        for (name in tabArray){\n            live_tablayout.addTab(live_tablayout.newTab().setText(name))\n        }\n\n        val play_url = intent.getStringExtra(\"play_url\")\n        live_play\n            .setLive(true)\n            .setVideoUrl(play_url)\n            .startPlay()\n        val roomId = intent.getIntExtra(\"room_id\",0)\n        livePresenter.getUpInfo(roomId)\n        DanMaKuTool.joinRoom(roomId)\n\n        fragmentList.add(interactFragment)\n        fragmentList.add(upInfoFragment)\n        fragmentList.add(fansFragment)\n        fragmentList.add(fleetListFragment)\n        live_viewpager.adapter =\n            PlayPagerAdapter(supportFragmentManager, tabArray, fragmentList)\n        live_tablayout.setupWithViewPager(live_viewpager)\n\n    }\n\n    fun getUserInfo(uid:Int){\n        showProgressDialog(\"请稍后\")\n        livePresenter.getUserInfo(ruid,uid)\n    }\n\n    override fun initBefore() {\n        UltimateBar.newTransparentBuilder()\n            .statusColor(resources.getColor(R.color.colorTrans))        // 状态栏颜色\n            .statusAlpha(100)               // 状态栏透明度\n            .applyNav(true)                // 是否应用到导航栏\n            .build(this)\n            .apply();\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        live_play.onConfigurationChang(newConfig)\n    }\n    override fun onResume() {\n        super.onResume()\n        live_play.onResume()\n    }\n\n    override fun onRestart() {\n        super.onRestart()\n        live_play.onRestart()\n    }\n    override fun onPause() {\n        super.onPause()\n        live_play.onPause()\n    }\n    override fun onDestroy() {\n        super.onDestroy()\n        live_play.onDestory()\n        DanMaKuTool.exitRoom()\n        fragmentList.clear()\n    }\n\n    override fun onBackPressed() {\n        super.onBackPressed()\n        live_play.onBackPressed()\n    }\n\n\n    override fun showDialog() {\n\n    }\n\n    override fun onGetUpInfo(liveUpData: LiveUpData) {\n        ruid = liveUpData.roomInfo.uid\n        EventBus.getDefault().postSticky(liveUpData)\n        LogUtils.d(\"获取到直播up主信息-->${liveUpData}\")\n    }\n    override fun onGetFleetList(fleetListData: FleetListData) {\n\n    }\n\n    override fun onGetUpVideoList(list: List<UpInfoData>) {\n\n    }\n\n    override fun onGetUpChatHistory(list: List<LiveChatData.Room>) {\n\n    }\n\n    override fun onGetUserInfo(liveUserData: LiveUserData) {\n        cancleProgressDialog()\n        val popwindowUtil = PopwindowUtil.PopupWindowBuilder(this@LivePlayActivity)\n            .setView(R.layout.pop_user_info)\n            .setElevation(10f)\n            .setFocusable(true)\n            .setAnimationStyle(R.style.contextMenuAnim)\n            .setTouchable(true)\n            .setOutsideTouchable(true)\n            .create()\n        popwindowUtil.showAtLocation(live_viewpager, 0,0,Gravity.CENTER)\n        popwindowUtil.getView<ImageView>(R.id.image_close)!!.setOnClickListener {\n            popwindowUtil.dissmiss()\n        }\n        popwindowUtil.getView<SimpleDraweeView>(R.id.image_header)!!.setImageURI(Uri.parse(liveUserData.face))\n        popwindowUtil.getView<TextView>(R.id.username)!!.text = liveUserData.uname\n        popwindowUtil.getView<TextView>(R.id.user_level)!!.text = \"UL \" + liveUserData.userLevel\n        popwindowUtil.getView<TextView>(R.id.follow_num)!!.text = \"关注：\"+ liveUserData.attentionNum + \"    粉丝：\" + liveUserData.followNum\n        popwindowUtil.getView<TextView>(R.id.text_user_space)!!.setOnClickListener {  }\n        popwindowUtil.getView<TextView>(R.id.text_user_follow)!!.setOnClickListener {  }\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/SearchDialogFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\nimport android.app.Dialog\nimport android.graphics.Color\nimport android.graphics.drawable.ColorDrawable\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.util.DisplayMetrics\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.play.adapter.CommentAdapter\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.bilibili.lingxiao.widget.RippleAnimation\nimport kotlinx.android.synthetic.main.fragment_comment_detail.*\nimport kotlinx.android.synthetic.main.fragment_dialog_search.*\nimport kotlinx.android.synthetic.main.fragment_fans_detail.*\nimport org.greenrobot.eventbus.EventBus\n\nclass SearchDialogFragment : androidx.fragment.app.DialogFragment(){\n    var height = 100\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.fragmentDialog)\n    }\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        dialog!!.window.setWindowAnimations(R.style.contextMenuAnim)\n        val root = inflater.inflate(R.layout.fragment_dialog_search, container, false)\n        return root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        image_exit.setOnClickListener {\n            dismiss()\n        }\n    }\n\n    override fun onStart() {\n        super.onStart()\n        //EventBus.getDefault().register(this)\n        var win = getDialog()!!.getWindow()\n        // 一定要设置Background，如果不设置，window属性设置无效\n        win.setBackgroundDrawable( ColorDrawable(Color.TRANSPARENT))\n        var  dm = DisplayMetrics()\n        getActivity()!!.getWindowManager().getDefaultDisplay().getMetrics(dm)\n        var params = win.getAttributes()\n        params.gravity = Gravity.TOP\n        //使用ViewGroup.LayoutParams，以便Dialog 宽度充满整个屏幕\n        params.width =  ViewGroup.LayoutParams.MATCH_PARENT\n        params.height = ViewGroup.LayoutParams.WRAP_CONTENT\n\n        win.setAttributes(params)\n    }\n\n    override fun onStop() {\n        super.onStop()\n        //EventBus.getDefault().unregister(this)\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/StreamHomeActivity.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui\n\nimport com.bilibili.lingxiao.R\nimport com.camera.lingxiao.common.app.BaseActivity\nimport kotlinx.android.synthetic.main.activity_stream_home.*\n\n\nclass StreamHomeActivity : BaseActivity() {\n    override val contentLayoutId: Int\n        get() = R.layout.activity_stream_home\n\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(toolbar)\n        toolbar.title = resources.getString(R.string.not_idcard_approve)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/play/FansDetailFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui.play\n\nimport android.animation.Animator\nimport android.animation.ObjectAnimator\nimport android.os.Bundle\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.view.View\nimport android.widget.ImageView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.adapter.FansAdapter\nimport com.bilibili.lingxiao.home.live.model.FansGoldListData\nimport com.bilibili.lingxiao.home.live.presenter.FansDetailPresenter\nimport com.bilibili.lingxiao.home.live.ui.LivePlayActivity\nimport com.bilibili.lingxiao.home.live.view.FansDetailView\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport kotlinx.android.synthetic.main.normal_refresh_view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.view.*\n\nclass FansDetailFragment :BaseFragment(), FansDetailView {\n    var position = 0\n    private var roomId = 0\n    private var uid = 0\n    private val presenter: FansDetailPresenter by lazy {\n        FansDetailPresenter(this, this)\n    }\n    private lateinit var fansAdapter : FansAdapter\n    private var fansList = arrayListOf<FansGoldListData.FansInfo>()\n    override val contentLayoutId: Int\n        get() = R.layout.normal_refresh_view\n\n\n    override fun initArgs(bundle: Bundle?) {\n        super.initArgs(bundle)\n        bundle?.let {\n            position = it.getInt(\"position\")\n            roomId = it.getInt(\"roomId\", 0)\n            uid = it.getInt(\"uid\", 0)\n        }\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        fansAdapter = FansAdapter(R.layout.item_fans_list, fansList)\n        fansAdapter.setDuration(800)\n        fansAdapter.openLoadAnimation({ view ->\n            arrayOf<Animator>(\n                ObjectAnimator.ofFloat(\n                    view,\n                    \"scaleY\",\n                    0f,\n                    1.05f,\n                    1f\n                ), ObjectAnimator.ofFloat(view, \"scaleX\", 0f, 1.05f, 1f)\n            )\n        })\n        var manager = androidx.recyclerview.widget.LinearLayoutManager(context)\n\n        root.recycerView.layoutManager = manager\n        root.recycerView.adapter = fansAdapter\n        //root.recycerView.setItemViewCacheSize(20)  //设置viewholder缓存大小，如果recyclerview数量太少，会存在数据错乱的问题\n        root.refresh.setOnRefreshListener {\n            if (position == 0){\n                presenter.getFansGoldList(roomId,uid)\n            }else if (position == 1){\n                presenter.getLiveToDayList(roomId,uid)\n            }else {\n                presenter.getLiveFansList(roomId,uid)\n            }\n        }\n        var emptyView = View.inflate(context,R.layout.layout_empty,null)\n        var image = emptyView.findViewById<ImageView>(R.id.image_error)\n        image.setImageDrawable(resources.getDrawable(R.drawable.ic_empty_cute_girl_box))\n        fansAdapter.setEmptyView(emptyView)\n        fansAdapter.setOnItemClickListener { adapter, view, position ->\n            var act = activity as LivePlayActivity\n            act.getUserInfo(fansList[position].uid)\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onGetFansGoldList(fansList: FansGoldListData) {\n        this.fansList.clear()\n        fansAdapter.addData(fansList.list)\n        refresh.finishRefresh()\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/play/FansFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui.play\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport androidx.viewpager.widget.ViewPager\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.LiveUpData\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.flyco.tablayout.listener.OnTabSelectListener\nimport kotlinx.android.synthetic.main.fragment_fans.*\nimport kotlinx.android.synthetic.main.fragment_fans.view.*\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass FansFragment :BaseFragment(){\n    private var roomId = 0\n    private var uid = 0\n    private val tabArray by lazy {\n        resources.getStringArray(R.array.live_fans)\n    }\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_fans\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        viewpager.adapter = PagerAdapter(childFragmentManager)\n        viewpager.offscreenPageLimit = tabArray.size\n        //tablayout和ViewPager的联动需要自己做\n        //root.fans_tablayout.setViewPager(root.viewpager)\n        fans_tablayout.setTabData(tabArray)\n    }\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n\n        root.viewpager.addOnPageChangeListener(object :\n            androidx.viewpager.widget.ViewPager.OnPageChangeListener{\n            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {\n\n            }\n\n            override fun onPageSelected(position: Int) {\n                root.fans_tablayout.currentTab = position\n            }\n\n            override fun onPageScrollStateChanged(position: Int) {\n\n            }\n        })\n        root.fans_tablayout.setOnTabSelectListener(object :OnTabSelectListener{\n            override fun onTabSelect(position: Int) {\n                root.viewpager.currentItem = position\n            }\n            override fun onTabReselect(position: Int) {\n\n            }\n        })\n    }\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetUpInfo(liveUpData: LiveUpData){\n        roomId = liveUpData.roomInfo.roomId\n        uid = liveUpData.roomInfo.uid\n    }\n\n    inner class PagerAdapter(fm: androidx.fragment.app.FragmentManager) : androidx.fragment.app.FragmentPagerAdapter(fm) {\n\n        override fun getCount(): Int {\n            return tabArray.size\n        }\n\n        override fun getItem(position: Int): androidx.fragment.app.Fragment {\n            val fragment = FansDetailFragment()\n            val bundle = Bundle()\n            bundle.putInt(\"position\", position)\n            bundle.putInt(\"roomId\", roomId)\n            bundle.putInt(\"uid\", uid)\n            fragment.setArguments(bundle)\n            return fragment\n        }\n\n        override fun getPageTitle(position: Int): CharSequence? {\n            return tabArray[position]\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/play/FleetListFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui.play\n\nimport android.net.Uri\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.adapter.FleetAdapter\nimport com.bilibili.lingxiao.home.live.model.*\nimport com.bilibili.lingxiao.home.live.presenter.FleetPresenter\nimport com.bilibili.lingxiao.home.live.ui.LivePlayActivity\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.facebook.drawee.view.SimpleDraweeView\nimport kotlinx.android.synthetic.main.fragment_fleet.*\nimport kotlinx.android.synthetic.main.fragment_fleet.view.*\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass FleetListFragment :BaseFragment(), LivePlayView {\n    private val fleetPresenter: FleetPresenter by lazy {\n        FleetPresenter(this, this)\n    }\n    private var uid = 0\n    private var fleetList = arrayListOf<FleetListData.UserInfo>()\n    private lateinit var mFleetAdapter: FleetAdapter\n    private val headerView:View by lazy {\n        View.inflate(activity,R.layout.item_fleet_header_top,null)\n    }\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_fleet\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        root.recycerView.layoutManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        mFleetAdapter = FleetAdapter(R.layout.item_fleet_list, fleetList)\n        root.recycerView.adapter = mFleetAdapter\n        mFleetAdapter.addHeaderView(headerView)\n        root.refresh.setOnRefreshListener {\n            fleetPresenter.getFleetList(1,20,uid)\n        }\n        var emptyView = View.inflate(context,R.layout.layout_empty,null)\n        var image = emptyView.findViewById<ImageView>(R.id.image_error)\n        image.setImageDrawable(resources.getDrawable(R.drawable.ic_empty_list_not_found))\n        mFleetAdapter.setEmptyView(emptyView)\n\n        mFleetAdapter.setOnItemClickListener { adapter, view, position ->\n            var act = activity as LivePlayActivity\n            act.getUserInfo(fleetList[position].uid)\n        }\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetUpInfoEvent(liveUpData: LiveUpData){\n        //roomId = liveUpData.roomId\n        uid = liveUpData.roomInfo.uid\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onGetUpInfo(liveUpData: LiveUpData) {\n\n    }\n\n    override fun onGetUpVideoList(list: List<UpInfoData>) {\n\n    }\n    override fun onGetFleetList(fleetListData: FleetListData) {\n        fleetList.clear()\n        mFleetAdapter.addData(fleetListData.list)\n        updateHeaderView(fleetListData.top3)\n        refresh.finishRefresh()\n    }\n\n    override fun onGetUserInfo(liveUpData: LiveUserData) {\n\n    }\n    private val topHeaders by lazy {\n        arrayOf<SimpleDraweeView>(\n            headerView.findViewById<SimpleDraweeView>(R.id.image_top1),\n            headerView.findViewById<SimpleDraweeView>(R.id.image_top2),\n            headerView.findViewById<SimpleDraweeView>(R.id.image_top3)\n            )\n    }\n    private val topTexts by lazy {\n        arrayOf<TextView>(\n            headerView.findViewById(R.id.text_top1),\n            headerView.findViewById(R.id.text_top2),\n            headerView.findViewById(R.id.text_top3)\n        )\n    }\n    private fun updateHeaderView(top3: List<FleetListData.Top3>) {\n       /*for ((index,value) in top3.withIndex()){\n\n       }*/\n        for (top in top3){\n            var rank = top.rank\n            if (rank < 1) rank = 1\n            if (rank > 3) rank = 3\n            topHeaders[rank - 1].setImageURI(Uri.parse(top.face))\n            topTexts[rank -1].setText(top.username)\n        }\n    }\n\n    override fun onGetUpChatHistory(list: List<LiveChatData.Room>) {\n    }\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/play/InteractFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui.play\n\nimport android.net.Uri\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.util.Log\nimport android.view.Gravity\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.*\nimport com.bilibili.lingxiao.home.live.presenter.InteractPresenter\nimport com.bilibili.lingxiao.home.live.ui.LivePlayActivity\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport kotlinx.android.synthetic.main.fragment_interact.*\nimport kotlinx.android.synthetic.main.fragment_interact.view.*\nimport kotlinx.android.synthetic.main.layout_header_room_info.*\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\nimport java.lang.Exception\n\n\nclass InteractFragment :BaseFragment(),LivePlayView{\n    private val TAG = InteractFragment::class.java.simpleName\n    private var chatList = arrayListOf<LiveChatData.Room>()\n    private lateinit var chatAdapter: ChatAdapter\n    private var presenter = InteractPresenter(this,this)\n    private var room_id = 0\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_interact\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        chatAdapter = ChatAdapter(R.layout.item_live_chat,chatList)\n        root.recycerView.layoutManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        root.recycerView.adapter = chatAdapter\n        root.refresh.setOnLoadMoreListener {\n            presenter.getChatHistory(room_id)\n        }\n        root.refresh.setHeaderHeight(0f)\n\n        chatAdapter.setOnItemClickListener { adapter, view, position ->\n            var act = activity as LivePlayActivity\n            act.getUserInfo(chatList[position].uid)\n        }\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetHomeInfo(live: LiveData.RecommendDataBean.LivesBean){\n        image_header.setImageURI(Uri.parse(live.owner.face))\n        up_name.text = live.owner.name\n        people_num.text = \"人气：\" + live.online\n        //fensi_num.text = \"粉丝：\" +\n        category.text = live.area\n        room_id = live.room_id\n        presenter.getChatHistory(room_id)\n    }\n\n    override fun onGetUpInfo(liveUpData: LiveUpData) {\n\n    }\n\n    override fun onGetFleetList(fleetListData: FleetListData) {\n\n    }\n\n    override fun onGetUpVideoList(list: List<UpInfoData>) {\n    }\n\n    override fun onGetUpChatHistory(list: List<LiveChatData.Room>) {\n        for (room in list){\n            if (chatList.contains(room)){\n                continue\n            }\n            chatAdapter.addData(room)\n        }\n        refresh.finishLoadMore()\n    }\n\n    override fun onGetUserInfo(liveUpData: LiveUserData) {\n\n    }\n    override fun showDialog() {\n    }\n\n    override fun diamissDialog() {\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n\n    inner class ChatAdapter(layoutResId: Int, data: MutableList<LiveChatData.Room>?) :\n        BaseQuickAdapter<LiveChatData.Room, BaseViewHolder>(layoutResId, data) {\n        override fun convert(helper: BaseViewHolder, item: LiveChatData.Room) {\n            helper.setText(R.id.user_level,\"UL \" + item.userLevel[0])\n            helper.setText(R.id.username, item.nickname + \": \")\n            helper.setText(R.id.message,item.text)\n            /*if (item.userLevel.size > 3){\n                try {\n                    printRGBA(item.userLevel[2] as Double)\n                }catch (ex :Exception){\n                    ex.printStackTrace()\n                }\n            }*/\n        }\n\n        @Throws\n        fun printRGBA(color: Int) {\n            val alpha = color.ushr(24)\n            val r = color and 0xff0000 shr 16\n            val g = color and 0xff00 shr 8\n            val b = color and 0xff\n            Log.e(TAG,\"颜色rgb值$alpha, $r, $g, $b\")\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/ui/play/UpInfoFragment.kt",
    "content": "package com.bilibili.lingxiao.home.live.ui.play\n\nimport android.net.Uri\nimport android.os.Build\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.recyclerview.widget.GridLayoutManager\nimport android.text.Html\nimport android.util.Log\nimport android.view.View\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.model.*\nimport com.bilibili.lingxiao.home.live.presenter.UpVideoPresenter\nimport com.bilibili.lingxiao.home.live.view.LivePlayView\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.home.recommend.ui.RecommendRecyAdapter\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.app.BaseView\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport kotlinx.android.synthetic.main.fragment_up_info.*\nimport kotlinx.android.synthetic.main.fragment_up_info.view.*\nimport kotlinx.android.synthetic.main.layout_header_room_info.*\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass UpInfoFragment :BaseFragment() , LivePlayView {\n    private val TAG = UpInfoFragment::class.java.simpleName\n    private var ruid = 0\n    private var videoList = arrayListOf<UpInfoData>()\n    private lateinit var mAdapter: VideoRecyAdapter\n    private val upVideoPresenter: UpVideoPresenter by lazy {\n        UpVideoPresenter(this,this)\n    }\n    private var mPage = 1\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_up_info\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(context, 2)\n        manager.setSpanSizeLookup(object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup(){\n            override fun getSpanSize(position: Int): Int {\n                if(position == 0 && mAdapter.itemCount == 1){\n                    return 2\n                }else{\n                    return 1\n                }\n\n            }\n        })\n        mAdapter = VideoRecyAdapter(R.layout.item_video,videoList)\n        root.recycerView.adapter = mAdapter\n        root.recycerView.layoutManager = manager\n        mAdapter.setEmptyView(View.inflate(context,R.layout.layout_empty,null))\n        root.refresh.setOnRefreshListener{\n            mPage = 1\n            videoList.clear()\n            upVideoPresenter.getUpVideo(mPage,20,ruid)\n        }\n        root.refresh.setOnLoadMoreListener{\n            mPage++\n            upVideoPresenter.getUpVideo(mPage,20,ruid)\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetHomeInfo(live: LiveData.RecommendDataBean.LivesBean){\n        image_header.setImageURI(Uri.parse(live.owner.face))\n        up_name.text = live.owner.name\n        //category.text = live.area\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetUpInfoEvent(liveUpData: LiveUpData){\n        ruid = liveUpData.roomInfo.uid\n        people_num.text = \"房间号：\" + liveUpData.roomInfo.roomId\n        fensi_num.text = \"粉丝：\" + StringUtil.getBigDecimalNumber(liveUpData.anchorInfo.relationInfo.attention)\n        Log.d(TAG,\"\")\n        certification.text = liveUpData.anchorInfo.baseInfo.officialInfo.title\n        text_broadcast.text = liveUpData.roomInfo.title\n        if (liveUpData.roomInfo.description != null){\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n                //FROM_HTML_MODE_COMPACT 块元素之间使用一个换行符分隔\n                text_broadcast.text = Html.fromHtml(liveUpData.roomInfo.description,Html.FROM_HTML_MODE_COMPACT)\n            }else{\n                //Bug，解析后的文本，块元素之间换行默认为两行，而且无法更改。\n                text_broadcast.text = Html.fromHtml(liveUpData.roomInfo.description)\n            }\n        }else{\n            text_broadcast.text = \"暂时没有\"\n        }\n    }\n\n    override fun onGetUpVideoList(list: List<UpInfoData>) {\n        mAdapter.addData(list)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    override fun onGetUserInfo(liveUpData: LiveUserData) {\n\n    }\n    override fun onGetFleetList(fleetListData: FleetListData) {\n    }\n    override fun onGetUpInfo(liveUpData: LiveUpData) {\n    }\n\n    override fun onGetUpChatHistory(list: List<LiveChatData.Room>) {\n    }\n    override fun showDialog() {\n    }\n\n    override fun diamissDialog() {\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    inner class VideoRecyAdapter(layoutResId: Int, data: List<UpInfoData>?) :\n        BaseQuickAdapter<UpInfoData, BaseViewHolder>(layoutResId, data) {\n        override fun convert(helper: BaseViewHolder, item: UpInfoData) {\n            helper.setText(R.id.play_title,item.title)\n            helper.setText(R.id.play_number,StringUtil.getBigDecimalNumber(item.stat.favorite))\n            helper.setText(R.id.comment_number,StringUtil.getBigDecimalNumber(item.stat.view))\n            helper.setText(R.id.category_name,\"\" + item.tname)\n            helper.getView<ConstraintLayout>(R.id.cons_category).visibility = View.GONE\n            helper.addOnClickListener(R.id.image_more)\n            var image : SimpleDraweeView = helper.getView(R.id.play_image)\n            try {\n                image.setImageURI(Uri.parse(item.pic + GlobalProperties.IMAGE_RULE_240_150))\n            }catch (ex:Exception){\n                ex.printStackTrace()\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/view/FansDetailView.kt",
    "content": "package com.bilibili.lingxiao.home.live.view\n\nimport com.bilibili.lingxiao.home.live.model.FansGoldListData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface FansDetailView :BaseView{\n    fun onGetFansGoldList(fansList: FansGoldListData)\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/view/LiveAllView.kt",
    "content": "package com.bilibili.lingxiao.home.live.view\n\nimport com.bilibili.lingxiao.home.live.model.LiveAllData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface LiveAllView :BaseView{\n    fun onGetHotList(data :LiveAllData)\n    fun onGetNewList(data :LiveAllData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/view/LivePlayView.kt",
    "content": "package com.bilibili.lingxiao.home.live.view\n\nimport com.bilibili.lingxiao.home.live.model.*\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface LivePlayView :BaseView{\n    fun onGetUpInfo(liveUpData: LiveUpData)\n    fun onGetUserInfo(liveUpData: LiveUserData)\n    fun onGetFleetList(fleetListData: FleetListData)\n    fun onGetUpVideoList(list: List<UpInfoData>)\n    fun onGetUpChatHistory(list: List<LiveChatData.Room>)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/view/LiveTabView.kt",
    "content": "package com.bilibili.lingxiao.home.live.view\n\nimport com.bilibili.lingxiao.home.live.model.LiveTabData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface LiveTabView :BaseView{\n    fun onGetTabList(tabs :List<LiveTabData.Tab>)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/live/view/LiveView.kt",
    "content": "package com.bilibili.lingxiao.home.live.view\n\nimport com.bilibili.lingxiao.home.live.model.LiveData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface LiveView :BaseView{\n    fun onGetLiveList(data: LiveData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/MiKanPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.mikan\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.mikan.model.MiKanFallData\nimport com.bilibili.lingxiao.home.mikan.model.MiKanRecommendData\nimport com.bilibili.lingxiao.home.mikan.ui.MikanFragment\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass MiKanPresenter(view: MikanView, fragment: MikanFragment) :\n    BasePresenter<MikanView, MikanFragment>(view, fragment) {\n    val httpTrans:HttpTrans by lazy { HttpTrans(fragment) }\n\n    fun getBanGuMiRecommend(){\n        httpTrans.getBanGumiRecommend(object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetMikanRecommend(lists[0] as MiKanRecommendData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n\n    fun getBanGuMiFall(cursor:Long){\n        httpTrans.getBanGumiFall(cursor,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetMikanFall(lists[0] as MiKanFallData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/MikanView.kt",
    "content": "package com.bilibili.lingxiao.home.mikan\n\nimport com.bilibili.lingxiao.home.mikan.model.MiKanFallData\nimport com.bilibili.lingxiao.home.mikan.model.MiKanRecommendData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface MikanView :BaseView{\n    fun onGetMikanRecommend(data: MiKanRecommendData)\n    fun onGetMikanFall(data: MiKanFallData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/adapter/MiKanFallAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.mikan.adapter\n\nimport android.net.Uri\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.mikan.model.MiKanFallData\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\n\nclass MiKanFallAdapter(layoutResId: Int, data: MutableList<MiKanFallData.Result>?) :\n    BaseQuickAdapter<MiKanFallData.Result, BaseViewHolder>(layoutResId, data) {\n    override fun convert(helper: BaseViewHolder, item: MiKanFallData.Result) {\n        var image:SimpleDraweeView = helper.getView(R.id.mikan_image)\n        image.setImageURI(Uri.parse(item.cover))\n        helper.setText(R.id.title,item.title)\n        helper.setText(R.id.content,item.desc)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/adapter/MikanAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.mikan.adapter\n\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.mikan.model.MiKanFallData\nimport com.bilibili.lingxiao.home.mikan.model.MiKanRecommendData\nimport com.bilibili.lingxiao.home.mikan.model.MikanData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.chad.library.adapter.base.util.MultiTypeDelegate\nimport com.facebook.drawee.view.SimpleDraweeView\n\nclass MikanAdapter(data: MutableList<MikanData>?) :\n    BaseQuickAdapter<MikanData, BaseViewHolder>(data) {\n\n    init {\n        multiTypeDelegate = object : MultiTypeDelegate<MikanData>() {\n            override fun getItemType(entity: MikanData): Int {\n                //根据你的实体类来判断布局类型\n                return entity.type\n            }\n        }\n        multiTypeDelegate\n            .registerItemType(MikanData.LOGIN_HEADER,R.layout.mikan_header)\n            .registerItemType(MikanData.TOP_BAR,R.layout.item_mikan_top_bar)\n            .registerItemType(MikanData.BANGUMI_ITEM,R.layout.item_mikan_video)\n            .registerItemType(MikanData.NEWS,R.layout.item_mikan_fall)\n    }\n\n    override fun convert(helper: BaseViewHolder, item: MikanData) {\n        when(helper.itemViewType){\n            MikanData.LOGIN_HEADER->{\n\n            }\n            MikanData.TOP_BAR->{\n                helper.setText(R.id.text_title,item.titleBar.title)\n                helper.setVisible(R.id.show_more,item.titleBar.showMore)\n                var drawable:Drawable? = null\n                when(item.titleBar.title){\n                    mContext.resources.getString(R.string.bangumi_cn)->{\n                        drawable = mContext.resources.getDrawable(R.drawable.bangumi_follow_home_ic_domestic)\n                    }\n                    mContext.resources.getString(R.string.bangumi_jp)->{\n                        drawable = mContext.resources.getDrawable(R.drawable.bangumi_follow_home_ic_bangumi)\n                    }\n                    mContext.resources.getString(R.string.bangumi_edit)->\n                        drawable = mContext.resources.getDrawable(R.drawable.bangumi_common_ic_editor_recommend)\n                }\n                if (drawable != null)\n                    helper.setImageDrawable(R.id.imageview, drawable)\n            }\n            MikanData.BANGUMI_ITEM->{\n                //中间的三个item\n                var image:SimpleDraweeView = helper.getView(R.id.image_cover)\n                image.setImageURI(Uri.parse(item.mikanRecommend.cover))\n                helper.setText(R.id.text_num,StringUtil.getBigDecimalNumber(item.mikanRecommend.favourites.toInt())+\"人追番\")\n                helper.setText(R.id.text_title,item.mikanRecommend.title)\n                helper.setText(R.id.text_cover,\"更新至第\" + item.mikanRecommend.totalCount +\"话\")\n                helper.getView<View>(R.id.mikan_video).setOnClickListener {\n                    listener?.onRecommendClick(item.mikanRecommend)\n                }\n            }\n            MikanData.NEWS->{\n                //下面的news\n                var image:SimpleDraweeView = helper.getView(R.id.mikan_image)\n                image.setImageURI(Uri.parse(item.mikanFall.cover))\n                helper.setText(R.id.title,item.mikanFall.title)\n                helper.setText(R.id.content,item.mikanFall.desc)\n                helper.getView<View>(R.id.mikan_foot).setOnClickListener {\n                    listener?.onFootFallClick(item.mikanFall)\n                }\n            }\n        }\n    }\n    private  var listener: OnMultiItemClickListener? = null\n    fun setMultiItemClickListener(listener: OnMultiItemClickListener){\n        this.listener = listener\n    }\n    interface OnMultiItemClickListener{\n        fun onRecommendClick(data: MiKanRecommendData.Result.Recommend.Info)\n        fun onFootFallClick(data: MiKanFallData.Result)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/model/MiKanFallData.kt",
    "content": "package com.bilibili.lingxiao.home.mikan.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class MiKanFallData(\n    @SerializedName(\"code\")\n    val code: Int,\n    @SerializedName(\"message\")\n    val message: String,\n    @SerializedName(\"result\")\n    val result: List<Result>\n) {\n    data class Result(\n        @SerializedName(\"cover\")\n        val cover: String,\n        @SerializedName(\"cursor\")\n        val cursor: Long?,\n        @SerializedName(\"desc\")\n        val desc: String?,\n        @SerializedName(\"id\")\n        val id: Int,\n        @SerializedName(\"is_new\")\n        val isNew: Int,\n        @SerializedName(\"link\")\n        val link: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"type\")\n        val type: Int,\n        @SerializedName(\"wid\")\n        val wid: Int\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/model/MiKanRecommendData.kt",
    "content": "package com.bilibili.lingxiao.home.mikan.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class MiKanRecommendData(\n    @SerializedName(\"code\")\n    val code: Int,\n    @SerializedName(\"message\")\n    val message: String,\n    @SerializedName(\"result\")\n    val result: Result\n) {\n    data class Result(\n        @SerializedName(\"ad\")\n        val ad: List<Any>,\n        @SerializedName(\"recommend_cn\")\n        val recommendCn: Recommend,\n        @SerializedName(\"recommend_jp\")\n        val recommendJp: Recommend,\n        @SerializedName(\"recommend_review\")\n        val recommendReview: List<Any>,\n        @SerializedName(\"timeline\")\n        val timeline: List<Timeline>\n    ) {\n        data class Recommend(\n            @SerializedName(\"foot\")\n            val foot: List<Foot>,\n            @SerializedName(\"recommend\")\n            val recommend: List<Info>\n        ) {\n            data class Foot(\n                @SerializedName(\"cover\")\n                val cover: String,\n                @SerializedName(\"desc\")\n                val desc: String?,\n                @SerializedName(\"id\")\n                val id: Int,\n                @SerializedName(\"is_auto\")\n                val isAuto: Int,\n                @SerializedName(\"link\")\n                val link: String,\n                @SerializedName(\"title\")\n                val title: String,\n                @SerializedName(\"wid\")\n                val wid: Int\n            )\n\n            data class Info(\n                @SerializedName(\"cover\")\n                val cover: String,\n                @SerializedName(\"favourites\")\n                val favourites: String,\n                @SerializedName(\"is_auto\")\n                val isAuto: Int,\n                @SerializedName(\"is_finish\")\n                val isFinish: Int,\n                @SerializedName(\"is_started\")\n                val isStarted: Int,\n                @SerializedName(\"last_time\")\n                val lastTime: Int,\n                @SerializedName(\"newest_ep_index\")\n                val newestEpIndex: String,\n                @SerializedName(\"pub_time\")\n                val pubTime: Int,\n                @SerializedName(\"season_id\")\n                val seasonId: Int,\n                @SerializedName(\"season_status\")\n                val seasonStatus: Int,\n                @SerializedName(\"title\")\n                val title: String,\n                @SerializedName(\"total_count\")\n                val totalCount: Int,\n                @SerializedName(\"watching_count\")\n                val watchingCount: Int,\n                @SerializedName(\"wid\")\n                val wid: Int\n            )\n        }\n\n        data class Timeline(\n            @SerializedName(\"area_id\")\n            val areaId: Int,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"delay\")\n            val delay: Int,\n            @SerializedName(\"ep_id\")\n            val epId: Int,\n            @SerializedName(\"favorites\")\n            val favorites: Int,\n            @SerializedName(\"follow\")\n            val follow: Int,\n            @SerializedName(\"is_published\")\n            val isPublished: Int,\n            @SerializedName(\"order\")\n            val order: Int,\n            @SerializedName(\"pub_date\")\n            val pubDate: String,\n            @SerializedName(\"pub_index\")\n            val pubIndex: String,\n            @SerializedName(\"pub_time\")\n            val pubTime: String,\n            @SerializedName(\"pub_ts\")\n            val pubTs: Int,\n            @SerializedName(\"season_id\")\n            val seasonId: Int,\n            @SerializedName(\"season_status\")\n            val seasonStatus: Int,\n            @SerializedName(\"square_cover\")\n            val squareCover: String,\n            @SerializedName(\"title\")\n            val title: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/model/MikanData.kt",
    "content": "package com.bilibili.lingxiao.home.mikan.model\n\ndata class MikanData(var type:Int){\n    companion object{\n        val LOGIN_HEADER = 0\n        val TOP_BAR = 1\n        val BANGUMI_ITEM = 2\n        val NEWS = 3\n    }\n    lateinit var mikanRecommend:MiKanRecommendData.Result.Recommend.Info\n    lateinit var mikanFall:MiKanFallData.Result\n    lateinit var titleBar:TitleBarData\n\n    data class TitleBarData(var title:String,var showMore:Boolean){\n        var imageId:Int = -1\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/mikan/ui/MikanFragment.kt",
    "content": "package com.bilibili.lingxiao.home.mikan.ui\n\nimport android.content.Intent\nimport android.net.Uri\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.util.Log\nimport android.view.View\nimport android.widget.ImageView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.mikan.adapter.MiKanFallAdapter\nimport com.bilibili.lingxiao.home.mikan.MiKanPresenter\nimport com.bilibili.lingxiao.home.mikan.adapter.MikanAdapter\nimport com.bilibili.lingxiao.home.mikan.MikanView\nimport com.bilibili.lingxiao.home.mikan.model.MiKanFallData\nimport com.bilibili.lingxiao.home.mikan.model.MiKanRecommendData\nimport com.bilibili.lingxiao.home.mikan.model.MikanData\nimport com.bilibili.lingxiao.home.region.ui.BangumiDetailActivity\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport kotlinx.android.synthetic.main.fragment_mikan.*\nimport kotlinx.android.synthetic.main.fragment_mikan.view.*\nimport kotlinx.android.synthetic.main.item_mikan_fall.*\nimport kotlinx.android.synthetic.main.mikan_content_cn.*\nimport kotlinx.android.synthetic.main.mikan_content_cn.view.*\nimport kotlinx.android.synthetic.main.mikan_content_jp.view.*\nimport kotlin.properties.Delegates\n\nclass MikanFragment :BaseFragment(), MikanView {\n    private var miKanPresenter: MiKanPresenter =\n        MiKanPresenter(this, this)\n    private var mMikanAdapter: MikanAdapter by Delegates.notNull()\n    private var mMikanList = arrayListOf<MikanData>()\n\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_mikan\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(activity, 3)\n        manager.setSpanSizeLookup(object :\n            androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup(){\n            override fun getSpanSize(position: Int): Int {\n                var type = 0\n                if (mMikanAdapter.data.size > 0){\n                    type = mMikanAdapter.data.get(position).type\n                }\n                when(type){\n                    MikanData.TOP_BAR,MikanData.NEWS,MikanData.LOGIN_HEADER\n                    -> return 3\n                    MikanData.BANGUMI_ITEM-> return 1\n                    else-> return 3\n                }\n\n            }\n        })\n        mMikanAdapter = MikanAdapter(mMikanList)\n        root.recyclerview_edit.adapter = mMikanAdapter\n        root.recyclerview_edit.layoutManager = manager\n        root.refresh.setOnRefreshListener({\n            mMikanList.clear()\n            miKanPresenter.getBanGuMiRecommend()\n        })\n        root.refresh.setOnLoadMoreListener {\n            var cursor:Long? = mMikanAdapter.data.get(mMikanAdapter.itemCount -1).mikanFall.cursor\n            if (cursor != null && cursor != 0L)\n                miKanPresenter.getBanGuMiFall(cursor)\n        }\n        mMikanAdapter.setMultiItemClickListener(object :MikanAdapter.OnMultiItemClickListener{\n            override fun onRecommendClick(data: MiKanRecommendData.Result.Recommend.Info) {\n                val intent = Intent(\n                    context,\n                    BangumiDetailActivity::class.java\n                )\n                intent.putExtra(\"id\",data.seasonId.toString())\n                intent.putExtra(\"type\",\"bangumi\")\n                startActivity(intent)\n            }\n\n            override fun onFootFallClick(data: MiKanFallData.Result) {\n                var intent = Intent(context, WebActivity::class.java)\n                intent.putExtra(\"uri\",data.link)\n                intent.putExtra(\"title\",data.title)\n                intent.putExtra(\"image\",data.cover)\n                startActivity(intent)\n            }\n        })\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onVisiblityChanged(visiblity: Boolean) {\n        super.onVisiblityChanged(visiblity)\n        if (visiblity && mMikanAdapter.itemCount - mMikanAdapter.headerLayoutCount - mMikanAdapter.footerLayoutCount < 1){\n            refresh.autoRefresh()\n        }\n    }\n\n    override fun onGetMikanRecommend(data: MiKanRecommendData) {\n        var loginData = MikanData(MikanData.LOGIN_HEADER)\n        mMikanAdapter.addData(loginData)\n        assembleData(resources.getString(R.string.bangumi_cn),data.result.recommendCn.recommend,data.result.recommendCn.foot)\n        assembleData(resources.getString(R.string.bangumi_jp),data.result.recommendJp.recommend,data.result.recommendJp.foot)\n\n        var editTopBarData = MikanData(MikanData.TOP_BAR)\n        editTopBarData.titleBar = MikanData.TitleBarData(resources.getString(R.string.bangumi_edit),false)\n        mMikanAdapter.addData(editTopBarData)\n        miKanPresenter.getBanGuMiFall(0L)\n    }\n\n    override fun onGetMikanFall(data: MiKanFallData) {\n        for (item in data.result){\n            var newsData = MikanData(MikanData.NEWS)\n            newsData.mikanFall = item\n            mMikanAdapter.addData(newsData)\n        }\n\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    fun assembleData(type:String,recommend:List<MiKanRecommendData.Result.Recommend.Info>,\n                     foots:List<MiKanRecommendData.Result.Recommend.Foot>){\n        var cnTopBarData = MikanData(MikanData.TOP_BAR)\n        cnTopBarData.titleBar = MikanData.TitleBarData(type,true)\n        mMikanAdapter.addData(cnTopBarData)\n        for (item in recommend){\n            var cnData = MikanData(MikanData.BANGUMI_ITEM)\n            cnData.mikanRecommend = item\n            mMikanAdapter.addData(cnData)\n        }\n        if (foots.size > 0){\n            var cnNewsData = MikanData(MikanData.NEWS)\n            cnNewsData.mikanFall = MiKanFallData.Result(\n                foots[0].cover,\n                0L,foots[0].desc,\n                foots[0].id,0,\n                foots[0].link,\n                foots[0].title,0,\n                foots[0].wid)\n            mMikanAdapter.addData(cnNewsData)\n        }\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/navigation/SettingActivity.kt",
    "content": "package com.bilibili.lingxiao.home.navigation\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.View\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.camera.lingxiao.common.app.BaseActivity\nimport kotlinx.android.synthetic.main.activity_setting.*\nimport kotlinx.android.synthetic.main.title_bar.*\n\nclass SettingActivity : BaseActivity(), View.OnClickListener{\n    override val contentLayoutId: Int\n        get() = R.layout.activity_setting\n\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(title_bar)\n        title_bar.title = \"设置\"\n        initOnclickListener()\n    }\n\n    private fun initOnclickListener() {\n        my_service.setOnClickListener(this)\n    }\n\n    override fun onClick(v: View) {\n        when(v.id){\n            R.id.my_service -> {\n                var intent = Intent(this@SettingActivity, WebActivity::class.java)\n                intent.putExtra(\"uri\",GlobalProperties.MY_SERVICE_HELP)\n                intent.putExtra(\"title\",\"联系客客服\")\n                startActivity(intent)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/navigation/ThemeActivity.kt",
    "content": "package com.bilibili.lingxiao.home.navigation\n\nimport com.google.android.material.snackbar.Snackbar\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.appcompat.widget.Toolbar\nimport android.view.View\nimport android.widget.TextView\nimport android.widget.Toast\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.widget.RippleAnimation\nimport com.camera.lingxiao.common.Common\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.rxbus.SkinChangedEvent\nimport com.camera.lingxiao.common.utills.SpUtils\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport com.lingxiao.skinlibrary.SkinLib\nimport kotlinx.android.synthetic.main.activity_theme.*\nimport kotlinx.android.synthetic.main.title_bar.*\n\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass ThemeActivity : BaseActivity() {\n    private var themeList = arrayListOf<ThemeData>()\n    override val contentLayoutId: Int\n        get() = R.layout.activity_theme\n\n    override fun initWidget() {\n        super.initWidget()\n        //toolbar是include进来的，include标签的id会覆盖toolbar的原来标签导致空指针\n        var toolbar = bar as Toolbar\n        setToolbarBack(toolbar)\n        toolbar.title = \"主题颜色\"\n\n        initThemeData()\n        var colums = SpUtils.getInt(this,GlobalProperties.HOME_COLUMNS,2)\n        changeColum(colums)\n        ll_single.setOnClickListener {\n            changeColum(1)\n            Snackbar.make(it,getString(R.string.reset_app_change),\n                Snackbar.LENGTH_SHORT).show()\n        }\n        ll_double.setOnClickListener {\n            changeColum(2)\n            Snackbar.make(it,getString(R.string.reset_app_change),\n                Snackbar.LENGTH_SHORT).show()\n        }\n    }\n\n    private fun initThemeData() {\n        var names = resources.getStringArray(R.array.theme_name)\n        var colors = resources.getIntArray(R.array.theme_color)\n        var tags = resources.getStringArray(R.array.theme_tag)\n        var checkedColor = SpUtils.getInt(this@ThemeActivity, Common.SKIN_ID,0)\n        for ((index,name) in names.withIndex()){\n            if (index < 3){\n                themeList.add(ThemeData(colors[index],name,tags[index],false,false))\n            }else{\n                themeList.add(ThemeData(colors[index],name,tags[index],true,false))\n            }\n            if (checkedColor == colors[index])\n                checkedColor = index\n        }\n        themeList[checkedColor].choose = true\n        var adapter = ThemeAdapter(R.layout.item_theme,themeList)\n        recycerView.adapter = adapter\n        recycerView.layoutManager =\n            androidx.recyclerview.widget.LinearLayoutManager(this)\n        adapter.setOnItemClickListener { adapter, view, position ->\n            RippleAnimation.create(view).setDuration(1000).start()\n            for ((index,item) in themeList.withIndex()){\n                item.choose = false\n                if (index == position)\n                    item.choose = true\n            }\n            adapter.notifyDataSetChanged()\n            if (position == 0) {\n                SkinLib.resetSkin()\n            } else {\n                SkinLib.loadSkin(tags.get(position))\n            }\n            SpUtils.putInt(this@ThemeActivity, Common.SKIN_ID,themeList[position].color)\n            EventBus.getDefault().postSticky(SkinChangedEvent(themeList[position].color))\n        }\n    }\n\n    private fun changeColum(colum :Int){\n        if (colum == 1){\n            image_choose_single.visibility = View.VISIBLE\n            image_choose_double.visibility = View.GONE\n        }else{\n            image_choose_single.visibility = View.GONE\n            image_choose_double.visibility = View.VISIBLE\n        }\n        SpUtils.putInt(this,GlobalProperties.HOME_COLUMNS,colum)\n    }\n\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onSkinChanged(event : SkinChangedEvent){\n        UltimateBar.newColorBuilder()\n            .statusColor(event.color)   // 状态栏颜色\n            .applyNav(true)             // 是否应用到导航栏\n            .navColor(event.color)         // 导航栏颜色\n            .build(this)\n            .apply()\n\n    }\n\n    data class ThemeData(var color:Int,var name:String,var tag:String,var pay:Boolean,var choose:Boolean){\n\n    }\n\n    inner class ThemeAdapter(layoutResId: Int, data: MutableList<ThemeData>?) :\n    BaseQuickAdapter<ThemeData,BaseViewHolder>(layoutResId,data){\n        override fun convert(helper: BaseViewHolder, item: ThemeData) {\n            helper.setBackgroundColor(R.id.image_color,item.color)\n            helper.setText(R.id.text_theme_name,item.name)\n            if (item.pay){\n                helper.setVisible(R.id.text_theme_price,true)\n                helper.setVisible(R.id.button_pay,true)\n            }else{\n                //需要GONE而不是INVISIBLE\n                //helper.setVisible(R.id.text_theme_price,false)\n                helper.getView<TextView>(R.id.text_theme_price).visibility = View.GONE\n                helper.setVisible(R.id.button_pay,false)\n            }\n            if (item.choose){\n                helper.setVisible(R.id.image_choose,true)\n            }else{\n                helper.setVisible(R.id.image_choose,false)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/recommend/RecommendPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.recommend\n\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.home.recommend.ui.RecommendFragment\nimport com.bilibili.lingxiao.home.recommend.view.RecommendView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass RecommendPresenter :BasePresenter<RecommendView, RecommendFragment>{\n    var liveTrans : RecommendTrans\n    constructor(view: RecommendView, fragment: RecommendFragment):super(view, fragment){\n        liveTrans = RecommendTrans(fragment)\n    }\n\n    fun getRecommendList(operationState :Int){\n        liveTrans.getRecommendList(operationState,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                val lists = res as Array<*>\n                var list = lists[0] as List<RecommendData>\n                mView?.onGetRecommendData(list)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/recommend/RecommendTrans.kt",
    "content": "package com.bilibili.lingxiao.home.recommend\n\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.camera.lingxiao.common.app.BaseTransation\nimport com.camera.lingxiao.common.http.ParseHelper\nimport com.camera.lingxiao.common.http.request.HttpRequest\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.google.gson.Gson\nimport com.google.gson.JsonElement\nimport com.google.gson.reflect.TypeToken\nimport com.trello.rxlifecycle2.LifecycleProvider\n\nclass RecommendTrans(mLifecycle: LifecycleProvider<*>) :BaseTransation(mLifecycle){\n    private val STYLE = 2\n    private var loginEvent: Int = 0\n    private var openEvent: String = \"\"\n    private var pull: Boolean = false\n    private var idx: Int = 0\n    val STATE_NORMAL = 0\n    val STATE_INITIAL = 1  //初始化\n    val STATE_REFRESHING = 2  //下拉刷新\n    val STATE_LOAD_MORE = 3  //上拉加载   没有轮播图\n    private val LOGIN_EVENT_NORMAL = 0\n    private val LOGIN_EVENT_INITIAL = 1\n    private val OPEN_EVENT_NULL = \"\"\n    private val OPEN_EVENT_COLD = \"cold\"\n    fun getRecommendList(operationState:Int,callback : HttpRxCallback<Any>){\n        when (operationState) {\n            STATE_INITIAL -> {\n                loginEvent = LOGIN_EVENT_INITIAL\n                openEvent = OPEN_EVENT_COLD\n                pull = true\n                idx = 0\n            }\n            STATE_REFRESHING -> {\n                loginEvent = LOGIN_EVENT_NORMAL\n                openEvent = OPEN_EVENT_NULL\n                pull = true\n                idx = 1499589063\n            }\n            STATE_LOAD_MORE -> {\n                loginEvent = LOGIN_EVENT_NORMAL\n                openEvent = OPEN_EVENT_NULL\n                pull = false\n                idx = 1499655142\n            }\n        }\n        request.clear()\n        request.put(\"appkey\", GlobalProperties.APP_KEY)\n        request.put(\"build\", GlobalProperties.BUILD)\n        request.put(\"idx\",idx)\n        request.put(\"login_event\",loginEvent)\n        request.put(\"mobi_app\", GlobalProperties.MOBI_APP)\n        request.put(\"network\", GlobalProperties.NETWORK_WIFI)\n        request.put(\"open_event\", openEvent)\n        request.put(\"platform\", GlobalProperties.PLATFORM)\n        request.put(\"pull\",pull)\n        request.put(\"style\",STYLE)\n        request.put(\"ts\", GlobalProperties.getSystemTime())\n\n\n        callback.setParseHelper(object : ParseHelper {\n            override fun parse(element: JsonElement): Any? {\n\n                val type = object : TypeToken<List<RecommendData>>() {}.getType()\n                var gson = Gson()\n                var modle = gson.fromJson<List<RecommendData>>(element,type)\n                //var modle = Gson().fromJson(element, type)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        var url = GlobalProperties.COMMEND_HOST + GlobalProperties.getUrlParamsByMap(request)\n        LogUtils.d(\"拼接的url---->\" + url)\n        getRequest().requestFullPath(HttpRequest.Method.GET,GlobalProperties.COMMEND_HOST,request, mLifecycle,callback)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/recommend/model/RecommendData.kt",
    "content": "package com.bilibili.lingxiao.home.recommend.model\ndata class RecommendData(\n    val autoplay: Int,\n    val autoplay_card: Int,\n    val banner_item: List<BannerItem>,\n    val cid: Int,\n    val coin: Int,\n    var cover: String,\n    val ctime: Int,\n    var danmaku: Int,\n    var desc: String,\n    val dislike_reasons: List<DislikeReason>,\n    val duration: Int,\n    var face: String,\n    var favorite: Int,\n    val goto: String,\n    val hash: String,\n    val idx: Int,\n    var like: Int,\n    val mid: Int,\n    var name: String,\n    val official: Official,\n    var `param`: String,\n    var play: Int,\n    var reply: Int,\n    var share: Int,\n    val tag: Tag,\n    val tid: Int,\n    var title: String?,\n    val tname: String?,\n    val uri: String?\n) {\n    data class BannerItem(\n        val ad_cb: String,\n        var click_url: String,\n        val client_ip: String,\n        val cm_mark: Int,\n        val creative_id: Int,\n        val extra: Extra,\n        val hash: String,\n        val id: Int,\n        var image: String,\n        val index: Int,\n        val is_ad: Boolean,\n        val is_ad_loc: Boolean,\n        val request_id: String,\n        val resource_id: Int,\n        val server_type: Int,\n        val src_id: Int,\n        var title: String,\n        var uri: String\n    ){\n        data class Extra(\n            val card: Card,\n            val click_urls: List<String>,\n            val open_whitelist: List<String>,\n            val preload_landingpage: Int,\n            val report_time: Int,\n            val sales_type: Int,\n            val show_urls: List<Any>,\n            val special_industry: Boolean,\n            val special_industry_tips: String,\n            val use_ad_web_v2: Boolean\n        ) {\n            data class Card(\n                val ad_tag: String,\n                val ad_tag_style: AdTagStyle,\n                val button: Button,\n                val callup_url: String,\n                val card_type: Int,\n                val covers: List<Cover>,\n                val desc: String,\n                val extra_desc: String,\n                val jump_url: String,\n                val long_desc: String,\n                val title: String\n            ) {\n                data class Button(\n                    val dlsuc_callup_url: String,\n                    val jump_url: String,\n                    val report_urls: List<Any>,\n                    val text: String,\n                    val type: Int\n                )\n\n                data class Cover(\n                    val url: String\n                )\n\n                data class AdTagStyle(\n                    val bg_border_color: String,\n                    val text: String,\n                    val text_color: String,\n                    val type: Int\n                )\n            }\n        }\n    }\n\n    data class Tag(\n        val count: Count,\n        val tag_id: Int,\n        val tag_name: String\n    ) {\n        data class Count(\n            val atten: Int\n        )\n    }\n\n    data class Official(\n        val role: Int,\n        val title: String\n    )\n\n    data class DislikeReason(\n        val reason_id: Int,\n        val reason_name: String\n    )\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/recommend/ui/RecommendFragment.kt",
    "content": "package com.bilibili.lingxiao.home.recommend.ui\n\nimport android.animation.ObjectAnimator\nimport android.content.Intent\nimport android.net.Uri\nimport androidx.recyclerview.widget.GridLayoutManager\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.BannerImageLoader\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.home.recommend.RecommendPresenter\nimport com.bilibili.lingxiao.home.recommend.view.RecommendView\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.play.model.VideoDetailData\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.youth.banner.Banner\nimport com.youth.banner.BannerConfig\nimport com.youth.banner.Transformer\nimport kotlinx.android.synthetic.main.fragment_recommend.*\nimport kotlinx.android.synthetic.main.fragment_recommend.view.*\nimport org.greenrobot.eventbus.EventBus\nimport kotlin.properties.Delegates\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.widget.TextView\nimport android.widget.LinearLayout\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.youth.banner.listener.OnBannerListener\nimport android.animation.Animator\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport com.camera.lingxiao.common.utills.SpUtils\nimport kotlin.collections.ArrayList\n\n\nclass RecommendFragment :BaseFragment(), RecommendView {\n\n    private var recommendPresenter = RecommendPresenter(this, this)\n    private var mRecommendList: List<RecommendData> = arrayListOf()\n    private var mAdapter:RecommendRecyAdapter by Delegates.notNull()\n    private var banner:Banner by Delegates.notNull()\n    private var operationState = 1  //1表示首次请求数据，有轮播图返回，2代表下拉刷新  3代表上拉加载更多\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_recommend\n\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        mAdapter = RecommendRecyAdapter(R.layout.item_video,mRecommendList)\n        var view = View.inflate(context,R.layout.layout_banner,null)\n        banner = view.findViewById(R.id.live_banner)\n        mAdapter.addHeaderView(view)\n        var colum = SpUtils.getInt(activity, GlobalProperties.HOME_COLUMNS,2)\n        var manager =\n            androidx.recyclerview.widget.GridLayoutManager(context, colum)\n        if (colum == 2){\n            manager.setSpanSizeLookup(object :\n                androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup(){\n                override fun getSpanSize(position: Int): Int {\n                    if(position == 0){\n                        return 2\n                    }else{\n                        return 1\n                    }\n                }\n            })\n        }\n\n        root.recycerView.adapter = mAdapter\n        root.recycerView.layoutManager = manager\n        //root.recycerView.showShimmerAdapter()\n        //root.recycerView.isNestedScrollingEnabled = false\n\n        root.refresh.setOnRefreshListener {\n            recommendPresenter.getRecommendList(operationState)\n        }\n        root.refresh.setOnLoadMoreListener {\n            operationState = 3\n            recommendPresenter.getRecommendList(operationState)\n        }\n        mAdapter.setDuration(1000)\n        mAdapter.openLoadAnimation({ view ->\n            arrayOf<Animator>(\n                ObjectAnimator.ofFloat(\n                    view,\n                    \"scaleY\",\n                    0f,\n                    1.05f,\n                    1f\n                ), ObjectAnimator.ofFloat(view, \"scaleX\", 0f, 1.05f, 1f)\n            )\n        })\n        mAdapter.isFirstOnly(false)\n        mAdapter.setOnItemClickListener(object :BaseQuickAdapter.OnItemClickListener{\n            override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {\n                //val intent = Intent(context,PlayActivity::class.java)\n                mRecommendList.get(position).let {\n                    EventBus.getDefault().postSticky(it)\n                    val intent = Intent(\n                        Intent.ACTION_VIEW,\n                        Uri.parse(it.uri)\n                    )\n                    intent.putExtra(\"play_url\",it.uri)\n                    startActivity(intent)\n                }\n\n            }\n        })\n        mAdapter.setOnItemChildClickListener { adapter, view, position ->\n            when(view.id){\n                R.id.image_more-> showPopupWindow(mRecommendList.get(position))\n            }\n        }\n        mAdapter.setOnItemLongClickListener { adapter, view, position ->\n            showPopupWindow(mRecommendList.get(position))\n            true\n        }\n        mAdapter.setEmptyView(View.inflate(context,R.layout.layout_empty,null))\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onVisiblityChanged(visiblity: Boolean) {\n        super.onVisiblityChanged(visiblity)\n        if (visiblity && mAdapter.itemCount - mAdapter.headerLayoutCount - mAdapter.footerLayoutCount < 1){\n            refresh.autoRefresh()\n        }\n    }\n\n    override fun onGetRecommendData(recommendData: List<RecommendData>) {\n        if (operationState == 1){\n            var banner = recommendData.get(0)\n            for (data in recommendData.subList(1,recommendData.size)){\n                mAdapter.addData(data)\n            }\n            initBanner(banner.banner_item)\n            operationState = 2\n        }else if (operationState == 2){\n            mAdapter.setNewData(recommendData)\n        }else{\n            for (data in recommendData){\n                if (data.title != null){\n                    mAdapter.addData(data)\n                }\n            }\n        }\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n        //recycerView.hideShimmerAdapter()\n    }\n    override fun onGetVideoDetail(videoDetailData: VideoDetailData) {\n\n    }\n    override fun onGetVideoRecommend(videoRecoData: VideoRecoData) {\n\n    }\n    override fun onGetVideoComment(commentData: CommentData) {\n\n    }\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    private fun initBanner(bannerData: List<RecommendData.BannerItem>) {\n        var images = ArrayList<String>()\n        bannerData?.let {\n            for (image in it){\n                images?.add(image.image)\n            }\n        }\n        banner.setImageLoader(BannerImageLoader())\n        //设置图片集合\n        banner.setImages(images)\n        //设置banner动画效果\n        banner.setBannerAnimation(Transformer.DepthPage)\n        //设置标题集合（当banner样式有显示title时）\n        //live_banner.setBannerTitles(banner.get(0).title);\n        //设置自动轮播，默认为true\n        banner.isAutoPlay(true)\n        //设置轮播时间\n        banner.setDelayTime(3000)\n        //设置指示器位置（当banner模式中有指示器时）\n        banner.setIndicatorGravity(BannerConfig.CENTER)\n        //banner设置方法全部调用完毕时最后调用\n        banner.start()\n\n        banner.setOnBannerListener(object :OnBannerListener{\n            override fun OnBannerClick(position: Int) {\n                var intent = Intent(context,WebActivity::class.java)\n                intent.putExtra(\"uri\",bannerData[position].uri)\n                intent.putExtra(\"title\",bannerData[position].title)\n                intent.putExtra(\"image\",bannerData[position].image)\n                startActivity(intent)\n            }\n\n        })\n    }\n\n    private fun showPopupWindow(data : RecommendData) {\n        val popwindowUtil = PopwindowUtil.PopupWindowBuilder(activity!!)\n            .setView(R.layout.pop_detail_menu)\n            .size(LinearLayout.LayoutParams.MATCH_PARENT.toFloat(), LinearLayout.LayoutParams.WRAP_CONTENT.toFloat())\n            .setAnimationStyle(R.style.contextMenuAnim)\n            .setFocusable(true)\n            .setTouchable(true)\n            .setOutsideTouchable(true)\n            .create()\n        val rootview = LayoutInflater.from(activity)\n            .inflate(R.layout.fragment_recommend, null)\n        popwindowUtil.showAtLocation(rootview,0,0,Gravity.BOTTOM,0.6f)\n        popwindowUtil.getView<TextView>(R.id.pop_up_name)!!.text = data.dislike_reasons[0].reason_name\n        popwindowUtil.getView<TextView>(R.id.pop_cancel)!!.setOnClickListener({\n            popwindowUtil.dissmiss()\n        })\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/recommend/ui/RecommendRecyAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.recommend.ui\n\nimport android.graphics.Color\nimport android.net.Uri\nimport android.view.View\nimport android.widget.ImageView\nimport com.bilibili.lingxiao.GlobalProperties\n\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport java.lang.Exception\n\nclass RecommendRecyAdapter(layoutResId: Int, data: List<RecommendData>?) :\n    BaseQuickAdapter<RecommendData, BaseViewHolder>(layoutResId, data) {\n    override fun convert(helper: BaseViewHolder, item: RecommendData) {\n        helper.setText(R.id.play_title,item.title)\n        helper.setText(R.id.play_number,StringUtil.getBigDecimalNumber(item.play))\n        helper.setText(R.id.comment_number,StringUtil.getBigDecimalNumber(item.reply))\n        var category_name = item.tname\n        if (category_name == null){\n            category_name = \"广告\"\n            helper.setTextColor(R.id.category_name,mContext.resources.getColor(R.color.yellow_300))\n            helper.getView<ImageView>(R.id.image_more).visibility = View.INVISIBLE\n        }else{\n            helper.setTextColor(R.id.category_name,mContext.resources.getColor(R.color.black_alpha_112))\n            helper.getView<ImageView>(R.id.image_more).visibility = View.VISIBLE\n        }\n        helper.setText(R.id.category_name,\"\" + category_name)\n\n        helper.addOnClickListener(R.id.image_more)\n        var image : SimpleDraweeView = helper.getView(R.id.play_image)\n        try {\n            image.setImageURI(Uri.parse(item.cover + GlobalProperties.IMAGE_RULE_240_150))\n        }catch (ex:Exception){\n            ex.printStackTrace()\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/recommend/view/RecommendView.kt",
    "content": "package com.bilibili.lingxiao.home.recommend.view\n\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.play.model.VideoDetailData\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface RecommendView :BaseView{\n    fun onGetRecommendData(recommendData: List<RecommendData>)\n    fun onGetVideoDetail(videoDetailData: VideoDetailData)\n    fun onGetVideoRecommend(videoRecoData: VideoRecoData)\n    fun onGetVideoComment(commentData: CommentData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/RegionAdapter.kt",
    "content": "package com.bilibili.lingxiao.home.region\n\nimport android.net.Uri\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport android.util.Log\nimport android.view.View\nimport android.widget.Button\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.region.model.MultiRegionData\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.home.region.model.RegionRecommendData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.chad.library.adapter.base.util.MultiTypeDelegate\nimport com.facebook.drawee.view.SimpleDraweeView\nimport java.util.*\nimport kotlin.properties.Delegates\n\nclass RegionAdapter :BaseQuickAdapter<MultiRegionData, BaseViewHolder> {\n    var recycledViewPool: androidx.recyclerview.widget.RecyclerView.RecycledViewPool by Delegates.notNull()\n\n    constructor(data:MutableList<MultiRegionData>, recycledViewPool: androidx.recyclerview.widget.RecyclerView.RecycledViewPool) :super(data){\n        this.recycledViewPool = recycledViewPool\n        multiTypeDelegate = object : MultiTypeDelegate<MultiRegionData>() {\n            override fun getItemType(entity: MultiRegionData): Int {\n                //根据你的实体类来判断布局类型\n                return entity.itemType\n            }\n        }\n        multiTypeDelegate\n            .registerItemType(MultiRegionData.REGION_ITEM,R.layout.item_live_category)\n            .registerItemType(MultiRegionData.REGION_RECOMMEND,R.layout.item_video)\n            .registerItemType(MultiRegionData.REGION_TOP_BAR,R.layout.item_region_top_bar)\n            .registerItemType(MultiRegionData.REGION_BOTTOM_BAR,R.layout.item_region_bottom_bar)\n    }\n\n    override fun convert(helper: BaseViewHolder, item: MultiRegionData) {\n        when(helper.itemViewType){\n            MultiRegionData.REGION_ITEM ->{\n                helper.setText(R.id.item_live_title,item.regionData?.name)\n                var image :SimpleDraweeView = helper.getView(R.id.item_live_image)\n                image.setImageURI(Uri.parse(item.regionData?.logo + GlobalProperties.IMAGE_RULE_90_90))\n                //helper.addOnClickListener(R.id.item_live_image)\n                this.setOnItemClickListener { adapter, view, position ->\n                    listener?.onGridClick(item.regionData,position)\n                }\n            }\n            MultiRegionData.REGION_TOP_BAR ->{\n                helper.setText(R.id.region_name,item.recommendData?.title)\n                var image_region:ImageView = helper.getView(R.id.image_logo)\n                var logo = UIUtil.getMipMapId(mContext,\"ic_category_t${item.recommendData?.param}\")\n                if (logo > 0){\n                    image_region.setImageResource(logo)\n                }\n                helper.addOnClickListener(R.id.button_goto)\n            }\n            MultiRegionData.REGION_RECOMMEND ->{\n                var image :SimpleDraweeView = helper.getView(R.id.play_image)\n                image.setImageURI(Uri.parse(item.bangumiItemData.cover + GlobalProperties.IMAGE_RULE_240_150))\n                helper.setText(R.id.play_title,item.bangumiItemData.title)\n                helper.setText(R.id.play_number,StringUtil.getBigDecimalNumber(item.bangumiItemData.play))\n                helper.setText(R.id.comment_number,StringUtil.getBigDecimalNumber(item.bangumiItemData.danmaku))\n                helper.getView<ConstraintLayout>(R.id.cons_category).visibility = View.GONE\n                helper.getView<LinearLayout>(R.id.ll_info).visibility = View.GONE\n                helper.getView<View>(R.id.item_video).setOnClickListener {\n                    listener?.onVideoClick(item.bangumiItemData,\"bangumi\")\n                }\n            }\n            MultiRegionData.REGION_BOTTOM_BAR ->{\n                helper.setText(R.id.text_new_number,\"${Random().nextInt(2000)}条新动态，点击刷新！\")\n                var button_more:Button = helper.getView(R.id.button_more)\n                button_more.setText(\"更多${item.recommendData?.title}\")\n                helper.addOnClickListener(R.id.button_more)\n                helper.getView<View>(R.id.ll_refresh).setOnClickListener {\n                    listener?.onRefreshClick(helper,item.recommendData,helper.position)\n                }\n            }\n        }\n    }\n\n\n\n    inner class RegionRecommendAdapter(layout:Int,data: List<RegionRecommendData.Data.Body>?) :\n        BaseQuickAdapter<RegionRecommendData.Data.Body, BaseViewHolder>(layout,data) {\n        override fun convert(helper: BaseViewHolder, item: RegionRecommendData.Data.Body) {\n            var image :SimpleDraweeView = helper.getView(R.id.play_image)\n            image.setImageURI(Uri.parse(item.cover + GlobalProperties.IMAGE_RULE_240_150))\n            helper.setText(R.id.play_title,item.title)\n            helper.setText(R.id.play_number,StringUtil.getBigDecimalNumber(item.play))\n            helper.setText(R.id.comment_number,StringUtil.getBigDecimalNumber(item.danmaku))\n            helper.getView<ConstraintLayout>(R.id.cons_category).visibility = View.GONE\n            helper.getView<LinearLayout>(R.id.ll_info).visibility = View.GONE\n        }\n    }\n\n    private  var listener: OnMultiItemClickListener? = null\n    fun setMultiItemClickListener(listener: OnMultiItemClickListener){\n        this.listener = listener\n    }\n    interface OnMultiItemClickListener{\n        fun onGridClick(data: RegionData.Data?, position:Int)\n        fun onVideoClick(data: RegionRecommendData.Data.Body?,type:String)\n        fun onRefreshClick(data: BaseViewHolder, recommendData: RegionRecommendData.Data?,position:Int)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/model/BangumiDetailData.kt",
    "content": "package com.bilibili.lingxiao.home.region.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class BangumiDetailData(\n    @SerializedName(\"code\")\n    val code: Int,\n    @SerializedName(\"message\")\n    val message: String,\n    @SerializedName(\"result\")\n    val result: Result?\n) {\n    data class Result(\n        @SerializedName(\"actor\")\n        val actor: List<Actor>,\n        @SerializedName(\"alias\")\n        val alias: String,\n        @SerializedName(\"allow_bp\")\n        val allowBp: String,\n        @SerializedName(\"allow_download\")\n        val allowDownload: String,\n        @SerializedName(\"area\")\n        val area: String,\n        @SerializedName(\"arealimit\")\n        val arealimit: Int,\n        @SerializedName(\"bangumi_id\")\n        val bangumiId: String,\n        @SerializedName(\"bangumi_title\")\n        val bangumiTitle: String,\n        @SerializedName(\"brief\")\n        val brief: String,\n        @SerializedName(\"business_type\")\n        val businessType: Int,\n        @SerializedName(\"coins\")\n        val coins: String,\n        @SerializedName(\"copyright\")\n        val copyright: String,\n        @SerializedName(\"cover\")\n        val cover: String,\n        @SerializedName(\"danmaku_count\")\n        val danmakuCount: String,\n        @SerializedName(\"dm_seg\")\n        val dmSeg: Int,\n        @SerializedName(\"ed_jump\")\n        val edJump: Int,\n        @SerializedName(\"episodes\")\n        val episodes: List<Episode>?,\n        @SerializedName(\"evaluate\")\n        val evaluate: String,\n        @SerializedName(\"favorites\")\n        val favorites: String,\n        @SerializedName(\"has_unfollow\")\n        val hasUnfollow: Int,\n        @SerializedName(\"is_finish\")\n        val isFinish: String,\n        @SerializedName(\"is_guide_follow\")\n        val isGuideFollow: Int,\n        @SerializedName(\"jp_title\")\n        val jpTitle: String,\n        @SerializedName(\"limit_info\")\n        val limitInfo: LimitInfo,\n        @SerializedName(\"media\")\n        val media: Media,\n        @SerializedName(\"newest_ep_id\")\n        val newestEpId: String,\n        @SerializedName(\"newest_ep_index\")\n        val newestEpIndex: String,\n        @SerializedName(\"origin_name\")\n        val originName: String,\n        @SerializedName(\"play_count\")\n        val playCount: String,\n        @SerializedName(\"pub_string\")\n        val pubString: String,\n        @SerializedName(\"pub_time\")\n        val pubTime: String,\n        @SerializedName(\"pub_time_show\")\n        val pubTimeShow: String,\n        @SerializedName(\"rank\")\n        val rank: Rank,\n        @SerializedName(\"related_seasons\")\n        val relatedSeasons: List<Any>,\n        @SerializedName(\"rights\")\n        val rights: Rights,\n        @SerializedName(\"season_id\")\n        val seasonId: String,\n        @SerializedName(\"season_status\")\n        val seasonStatus: Int,\n        @SerializedName(\"season_title\")\n        val seasonTitle: String,\n        @SerializedName(\"seasons\")\n        val seasons: List<Season>?,\n        @SerializedName(\"share_url\")\n        val shareUrl: String,\n        @SerializedName(\"spid\")\n        val spid: String,\n        @SerializedName(\"squareCover\")\n        val squareCover: String,\n        @SerializedName(\"staff\")\n        val staff: String,\n        @SerializedName(\"tag2s\")\n        val tag2s: List<Any>,\n        @SerializedName(\"tags\")\n        val tags: List<Tag>,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"total_count\")\n        val totalCount: String,\n        @SerializedName(\"update_pattern\")\n        val updatePattern: String,\n        @SerializedName(\"user_season\")\n        val userSeason: UserSeason,\n        @SerializedName(\"viewRank\")\n        val viewRank: Int,\n        @SerializedName(\"vip_quality\")\n        val vipQuality: Int,\n        @SerializedName(\"watchingCount\")\n        val watchingCount: String,\n        @SerializedName(\"weekday\")\n        val weekday: String\n    ) {\n        data class Episode(\n            @SerializedName(\"av_id\")\n            val avId: String,\n            @SerializedName(\"coins\")\n            val coins: String,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"danmaku\")\n            val danmaku: String,\n            @SerializedName(\"episode_id\")\n            val episodeId: String,\n            @SerializedName(\"episode_status\")\n            val episodeStatus: Int,\n            @SerializedName(\"from\")\n            val from: String,\n            @SerializedName(\"index\")\n            val index: String,\n            @SerializedName(\"index_title\")\n            val indexTitle: String,\n            @SerializedName(\"is_webplay\")\n            val isWebplay: String,\n            @SerializedName(\"mid\")\n            val mid: String,\n            @SerializedName(\"page\")\n            val page: String,\n            @SerializedName(\"up\")\n            val up: Up,\n            @SerializedName(\"update_time\")\n            val updateTime: String\n        ) {\n            class Up(\n            )\n        }\n\n        data class LimitInfo(\n            @SerializedName(\"code\")\n            val code: Int,\n            @SerializedName(\"data\")\n            val `data`: Data,\n            @SerializedName(\"message\")\n            val message: String\n        ) {\n            data class Data(\n                @SerializedName(\"down\")\n                val down: Int,\n                @SerializedName(\"play\")\n                val play: Int\n            )\n        }\n\n        data class Rights(\n            @SerializedName(\"arealimit\")\n            val arealimit: Int,\n            @SerializedName(\"is_started\")\n            val isStarted: Int\n        )\n\n        data class UserSeason(\n            @SerializedName(\"attention\")\n            val attention: String,\n            @SerializedName(\"bp\")\n            val bp: Int,\n            @SerializedName(\"last_ep_index\")\n            val lastEpIndex: String,\n            @SerializedName(\"last_time\")\n            val lastTime: String,\n            @SerializedName(\"report_ts\")\n            val reportTs: Int\n        )\n\n        data class Actor(\n            @SerializedName(\"actor\")\n            val actor: String,\n            @SerializedName(\"actor_id\")\n            val actorId: Int,\n            @SerializedName(\"role\")\n            val role: String\n        )\n\n        data class Media(\n            @SerializedName(\"area\")\n            val area: List<Area>,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"episode_index\")\n            val episodeIndex: EpisodeIndex,\n            @SerializedName(\"media_id\")\n            val mediaId: Int,\n            @SerializedName(\"publish\")\n            val publish: Publish,\n            @SerializedName(\"rating\")\n            val rating: Rating,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"type_id\")\n            val typeId: Int,\n            @SerializedName(\"type_name\")\n            val typeName: String\n        ) {\n            data class EpisodeIndex(\n                @SerializedName(\"index_show\")\n                val indexShow: String\n            )\n\n            data class Rating(\n                @SerializedName(\"count\")\n                val count: Int,\n                @SerializedName(\"score\")\n                val score: Double\n            )\n\n            data class Publish(\n                @SerializedName(\"is_finish\")\n                val isFinish: Int,\n                @SerializedName(\"is_started\")\n                val isStarted: Int\n            )\n\n            data class Area(\n                @SerializedName(\"id\")\n                val id: Int,\n                @SerializedName(\"name\")\n                val name: String\n            )\n        }\n\n        data class Season(\n            @SerializedName(\"bangumi_id\")\n            val bangumiId: String,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"is_finish\")\n            val isFinish: String,\n            @SerializedName(\"newest_ep_id\")\n            val newestEpId: String,\n            @SerializedName(\"newest_ep_index\")\n            val newestEpIndex: String,\n            @SerializedName(\"season_id\")\n            val seasonId: String,\n            @SerializedName(\"season_status\")\n            val seasonStatus: Int,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"total_count\")\n            val totalCount: String\n        )\n\n        data class Rank(\n            @SerializedName(\"list\")\n            val list: List<X>,\n            @SerializedName(\"total_bp_count\")\n            val totalBpCount: Int,\n            @SerializedName(\"week_bp_count\")\n            val weekBpCount: Int\n        ) {\n            data class X(\n                @SerializedName(\"face\")\n                val face: String,\n                @SerializedName(\"uid\")\n                val uid: String,\n                @SerializedName(\"uname\")\n                val uname: String,\n                @SerializedName(\"vip\")\n                val vip: Vip\n            ) {\n                data class Vip(\n                    @SerializedName(\"accessStatus\")\n                    val accessStatus: Int,\n                    @SerializedName(\"dueRemark\")\n                    val dueRemark: String,\n                    @SerializedName(\"themeType\")\n                    val themeType: Int,\n                    @SerializedName(\"vipStatus\")\n                    val vipStatus: Int,\n                    @SerializedName(\"vipStatusWarn\")\n                    val vipStatusWarn: String,\n                    @SerializedName(\"vipType\")\n                    val vipType: Int\n                )\n            }\n        }\n\n        data class Tag(\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"tag_id\")\n            val tagId: String,\n            @SerializedName(\"tag_name\")\n            val tagName: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/model/BangumiRecommendData.kt",
    "content": "package com.bilibili.lingxiao.home.region.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class BangumiRecommendData(\n    @SerializedName(\"code\")\n    val code: Int,\n    @SerializedName(\"message\")\n    val message: String,\n    @SerializedName(\"result\")\n    val result: Result?\n) {\n    data class Result(\n        @SerializedName(\"from\")\n        val from: Int,\n        @SerializedName(\"list\")\n        val list: List<BangumiInfo>?,\n        @SerializedName(\"season_id\")\n        val seasonId: String,\n        @SerializedName(\"title\")\n        val title: String\n    ) {\n        data class BangumiInfo(\n            @SerializedName(\"bangumi_id\")\n            val bangumiId: String,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"follow\")\n            val follow: String,\n            @SerializedName(\"isfinish\")\n            val isfinish: String,\n            @SerializedName(\"newest_ep_cover\")\n            val newestEpCover: String,\n            @SerializedName(\"newest_ep_index\")\n            val newestEpIndex: String,\n            @SerializedName(\"pub_time\")\n            val pubTime: String,\n            @SerializedName(\"season_id\")\n            val seasonId: String,\n            @SerializedName(\"season_status\")\n            val seasonStatus: Int,\n            @SerializedName(\"tags\")\n            val tags: List<Tag>,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"total_count\")\n            val totalCount: String\n        ) {\n            data class Tag(\n                @SerializedName(\"tag_name\")\n                val tagName: String\n            )\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/model/MultiRegionData.kt",
    "content": "package com.bilibili.lingxiao.home.region.model\n\ndata class MultiRegionData(val itemType:Int) {\n    companion object {\n        val REGION_ITEM = 1\n        val REGION_RECOMMEND = 2\n        val REGION_TOP_BAR = 3\n        val REGION_BOTTOM_BAR = 4\n    }\n    var regionData: RegionData.Data? = null\n    var recommendData: RegionRecommendData.Data? = null\n    lateinit var bangumiItemData: RegionRecommendData.Data.Body\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/model/RegionData.kt",
    "content": "package com.bilibili.lingxiao.home.region.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class RegionData(\n    @SerializedName(\"data\")\n    var `data`: List<Data>\n){\n    /*@OneToMany(oneToManyMethods = [OneToManyMethod.ALL], variableName = \"data\")\n    fun getList(): List<Data> {\n        if (data == null || data.isEmpty()) {\n            data = (select from(Data::class.java)).list\n        }\n        return data\n    }*/\n    data class Data(\n        @SerializedName(\"children\")\n        var children: List<Children>,\n        @SerializedName(\"goto\")\n        var goto: String,\n        @SerializedName(\"is_bangumi\")\n        var isBangumi: Int,\n        @SerializedName(\"logo\")\n        var logo: String,\n        @SerializedName(\"name\")\n        var name: String,\n        @SerializedName(\"param\")\n        var `param`: String,\n        @SerializedName(\"reid\")\n        val reid: Int,\n        @SerializedName(\"tid\")\n        var tid: Int,\n        @SerializedName(\"type\")\n        var type: Int,\n        @SerializedName(\"uri\")\n        var uri: String\n    ) {\n        data class Children(\n            @SerializedName(\"goto\")\n            var goto: String,\n            @SerializedName(\"logo\")\n            var logo: String,\n            @SerializedName(\"name\")\n            var name: String,\n            @SerializedName(\"param\")\n            var `param`: String,\n            @SerializedName(\"reid\")\n            var reid: Int,\n            @SerializedName(\"tid\")\n            var tid: Int,\n            @SerializedName(\"type\")\n            var type: Int\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/model/RegionDetailData.kt",
    "content": "package com.bilibili.lingxiao.home.region.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class RegionDetailData(\n    @SerializedName(\"banner\")\n    val banner: Banner?,\n    @SerializedName(\"cbottom\")\n    val cbottom: Int,\n    @SerializedName(\"ctop\")\n    val ctop: Int,\n    @SerializedName(\"new\")\n    val new: List<Info>?,\n    @SerializedName(\"recommend\")\n    val recommend: List<Info>?\n) {\n    data class Info(\n        @SerializedName(\"cover\")\n        val cover: String,\n        @SerializedName(\"danmaku\")\n        val danmaku: Int,\n        @SerializedName(\"duration\")\n        val duration: Int,\n        @SerializedName(\"face\")\n        val face: String,\n        @SerializedName(\"favourite\")\n        val favourite: Int,\n        @SerializedName(\"goto\")\n        val goto: String,\n        @SerializedName(\"like\")\n        val like: Int,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"param\")\n        val `param`: String,\n        @SerializedName(\"play\")\n        val play: Int,\n        @SerializedName(\"pubdate\")\n        val pubdate: Int,\n        @SerializedName(\"reply\")\n        val reply: Int,\n        @SerializedName(\"rid\")\n        val rid: Int,\n        @SerializedName(\"rname\")\n        val rname: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"uri\")\n        val uri: String\n    )\n\n    data class Banner(\n        @SerializedName(\"top\")\n        val top: List<Top>?\n    ) {\n        data class Top(\n            @SerializedName(\"cm_mark\")\n            val cmMark: Int,\n            @SerializedName(\"hash\")\n            val hash: String,\n            @SerializedName(\"id\")\n            val id: Int,\n            @SerializedName(\"image\")\n            val image: String,\n            @SerializedName(\"index\")\n            val index: Int,\n            @SerializedName(\"is_ad\")\n            val isAd: Boolean,\n            @SerializedName(\"request_id\")\n            val requestId: String,\n            @SerializedName(\"resource_id\")\n            val resourceId: Int,\n            @SerializedName(\"server_type\")\n            val serverType: Int,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"uri\")\n            val uri: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/model/RegionRecommendData.kt",
    "content": "package com.bilibili.lingxiao.home.region.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class RegionRecommendData(\n    @SerializedName(\"data\")\n    val `data`: List<Data>\n) {\n    data class Data(\n        @SerializedName(\"banner\")\n        val banner: Banner,\n        @SerializedName(\"body\")\n        val body: List<Body>,\n        @SerializedName(\"param\")\n        val `param`: String,\n        @SerializedName(\"style\")\n        val style: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"type\")\n        val type: String\n    ) {\n        data class Banner(\n            @SerializedName(\"top\")\n            val top: List<Top>\n        ) {\n            data class Top(\n                @SerializedName(\"client_ip\")\n                val clientIp: String,\n                @SerializedName(\"cm_mark\")\n                val cmMark: Int,\n                @SerializedName(\"hash\")\n                val hash: String,\n                @SerializedName(\"id\")\n                val id: Int,\n                @SerializedName(\"image\")\n                val image: String,\n                @SerializedName(\"index\")\n                val index: Int,\n                @SerializedName(\"is_ad\")\n                val isAd: Boolean,\n                @SerializedName(\"is_ad_loc\")\n                val isAdLoc: Boolean,\n                @SerializedName(\"request_id\")\n                val requestId: String,\n                @SerializedName(\"resource_id\")\n                val resourceId: Int,\n                @SerializedName(\"server_type\")\n                val serverType: Int,\n                @SerializedName(\"src_id\")\n                val srcId: Int,\n                @SerializedName(\"title\")\n                val title: String,\n                @SerializedName(\"uri\")\n                val uri: String\n            )\n        }\n\n        data class Body(\n            @SerializedName(\"cm_mark\")\n            val cmMark: Int,\n            @SerializedName(\"cover\")\n            val cover: String,\n            @SerializedName(\"danmaku\")\n            val danmaku: Int,\n            @SerializedName(\"goto\")\n            val goto: String,\n            @SerializedName(\"is_ad\")\n            val isAd: Boolean,\n            @SerializedName(\"like\")\n            val like: Int,\n            @SerializedName(\"param\")\n            val `param`: String,\n            @SerializedName(\"play\")\n            val play: Int,\n            @SerializedName(\"title\")\n            val title: String,\n            @SerializedName(\"uri\")\n            val uri: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/presenter/BangumiDetailPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.region.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.region.model.BangumiDetailData\nimport com.bilibili.lingxiao.home.region.model.BangumiRecommendData\nimport com.bilibili.lingxiao.home.region.ui.BangumiDetailActivity\nimport com.bilibili.lingxiao.home.region.view.BangumiView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass BangumiDetailPresenter (view: BangumiView, activity :BangumiDetailActivity) :\n    BasePresenter<BangumiView, BangumiDetailActivity>(view, activity) {\n    private val httpTrans: HttpTrans by lazy {\n        HttpTrans(activity)\n    }\n    fun getBangumiDetail(season_id:String,type:String){\n        mView?.showDialog()\n        httpTrans.getBangumiDetail(season_id,type,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetBangumiDetail(lists[0] as BangumiDetailData)\n                mView?.diamissDialog()\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n                mView?.diamissDialog()\n            }\n\n            override fun onCancel() {\n                mView?.diamissDialog()\n            }\n\n        })\n    }\n\n    fun getBangumiRecommend(season_id:String){\n        httpTrans.getBangumiDetailRecommend(season_id,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetBangumiRecommend(lists[0] as BangumiRecommendData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/presenter/RegionDetailPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.region.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.region.model.RegionDetailData\nimport com.bilibili.lingxiao.home.region.ui.RegionDetailFragment\nimport com.bilibili.lingxiao.home.region.view.RegionDetailView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass RegionDetailPresenter(view: RegionDetailView, fragment: RegionDetailFragment) :\n    BasePresenter<RegionDetailView, RegionDetailFragment>(view, fragment) {\n    private val httpTrans: HttpTrans by lazy {\n        HttpTrans(fragment)\n    }\n\n    fun getRegionDetail(tid:Int){\n        httpTrans.getRegionList(tid,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetRegionDetail(lists[0] as RegionDetailData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n    fun getRegionMore(rid:Int){\n        httpTrans.getRegionMoreList(rid,object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetRegionMore(lists[0] as RegionDetailData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/presenter/RegionPresenter.kt",
    "content": "package com.bilibili.lingxiao.home.region.presenter\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.database.RegionTable\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.home.region.model.RegionRecommendData\nimport com.bilibili.lingxiao.home.region.ui.RegionFragment\nimport com.bilibili.lingxiao.home.region.view.RegionView\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass RegionPresenter(view: RegionView, fragment: RegionFragment) :\n    BasePresenter<RegionView, RegionFragment>(view, fragment) {\n    private val httpTrans:HttpTrans by lazy {\n        HttpTrans(fragment)\n    }\n    fun getRegion(){\n        httpTrans.getRegion(object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                var list = lists[0] as List<RegionData.Data>\n                mView?.onGetRegion(list)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n    fun getRegionRecommend(){\n        httpTrans.getRegionRecommend(object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetRegionRecommend(lists[0] as List<RegionRecommendData.Data>)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n\n    fun refreshRegion(type:String,rand:Int,rid:Int){\n        httpTrans.refreshRegionLocality(type,rand,rid,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onRefreshRegion(lists[0] as List<RegionRecommendData.Data.Body>)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/ui/BangumiDetailActivity.kt",
    "content": "package com.bilibili.lingxiao.home.region.ui\n\nimport android.content.Intent\nimport android.net.Uri\nimport com.bilibili.lingxiao.R\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.facebook.drawee.backends.pipeline.Fresco\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.facebook.imagepipeline.postprocessors.IterativeBoxBlurPostProcessor\nimport com.facebook.imagepipeline.request.ImageRequestBuilder\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport kotlinx.android.synthetic.main.activity_bangumi_detail.*\nimport android.graphics.drawable.AnimationDrawable\nimport com.google.android.material.snackbar.Snackbar\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.util.Log\nimport android.view.View\nimport android.widget.TextView\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.home.region.model.BangumiDetailData\nimport com.bilibili.lingxiao.home.region.model.BangumiRecommendData\nimport com.bilibili.lingxiao.home.region.presenter.BangumiDetailPresenter\nimport com.bilibili.lingxiao.home.region.view.BangumiView\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport kotlinx.android.synthetic.main.content_bangumi_detail.*\n\n\nclass BangumiDetailActivity : BaseActivity(), BangumiView{\n    private var presenter = BangumiDetailPresenter(this,this)\n    override val contentLayoutId: Int\n        get() = R.layout.activity_bangumi_detail\n\n    override fun initWidget() {\n        super.initWidget()\n        UltimateBar.newTransparentBuilder()\n            .statusColor(getResources().getColor(R.color.colorTrans))        // 状态栏颜色\n            .statusAlpha(100)               // 状态栏透明度\n            .applyNav(false)                // 是否应用到导航栏\n            .build(this)\n            .apply();\n        setToolbarBack(toolbar)\n        var id = intent.getStringExtra(\"id\")\n        var type = intent.getStringExtra(\"type\")\n        presenter.getBangumiDetail(id,type)\n\n\n    }\n\n\n\n    override fun showDialog() {\n        showProgressDialog(\"获取数据中...\")\n    }\n\n    @Throws(Exception::class)\n    override fun onGetBangumiDetail(data: BangumiDetailData) {\n        if (data.result == null){\n            return\n        }\n        data.result.episodes?.let {\n            showUrlBlur(\n                image_bar, it[0].cover,\n                6, 10\n            )\n            //Collections.reverse(it)\n            var tvAdapter = BangumiTvAdapter(R.layout.item_bangumi_tv, it)\n            recycler_select_set.layoutManager =\n                androidx.recyclerview.widget.LinearLayoutManager(\n                    this@BangumiDetailActivity\n                    ,\n                    androidx.recyclerview.widget.LinearLayoutManager.HORIZONTAL,\n                    true\n                )  //最后一个参数 ，逆序排列\n            recycler_select_set.smoothScrollToPosition(0)\n            recycler_select_set.adapter = tvAdapter\n            recycler_select_set.isNestedScrollingEnabled = false\n            recycler_select_set.isVerticalScrollBarEnabled = false\n            tvAdapter.setOnItemClickListener { adapter, view, position ->\n                LogUtils.d(\"点击了番剧的播放: ${adapter.data[position]}\")\n                //Snackbar.make(view,\"通过扫码查找\", Snackbar.LENGTH_SHORT).show()\n            }\n        }\n        image_cover.setImageURI(Uri.parse(data.result.cover + GlobalProperties.IMAGE_RULE_200_266))\n        toolbar.title = data.result.bangumiTitle\n        text_count.text = \"${data.result.totalCount}话全\"\n        text_status.text = data.result.media.episodeIndex.indexShow\n        text_play_count.text = \"播放：${StringUtil.getBigDecimalNumber(data.result.playCount.toInt())}\"\n        text_favorites.text = \"追番：${StringUtil.getBigDecimalNumber(data.result.favorites.toInt())}\"\n        text_evaluate.text = data.result.evaluate\n\n        presenter.getBangumiRecommend(data.result.seasonId)\n    }\n\n    var recommendAdapter:BangumiRecommendAdapter? = null\n    var recommendList = arrayListOf<BangumiRecommendData.Result.BangumiInfo>()\n    var random = 0\n    override fun onGetBangumiRecommend(data: BangumiRecommendData) {\n        if (data.result == null){\n            return\n        }\n        recommendAdapter = BangumiRecommendAdapter(R.layout.item_mikan_video, recommendList)\n        recycler_recommend.layoutManager =\n            androidx.recyclerview.widget.GridLayoutManager(\n                this@BangumiDetailActivity, 3\n            )\n        recycler_recommend.adapter = recommendAdapter\n        recycler_recommend.setHasFixedSize(true)\n        recycler_recommend.isNestedScrollingEnabled = false\n        recycler_recommend.isVerticalScrollBarEnabled = false\n        data.result.list?.let {\n            if (it.size > 6){\n                recommendAdapter?.addData(it.subList(0,6))\n            }else{\n                recommendAdapter?.addData(it)\n            }\n        }\n        text_refresh_recommend.setOnClickListener {\n            data.result.list?.let {\n                if (it.size > 6){\n                    random += 6\n                    if (random + 6 > it.size) random = 0\n                    recommendList.clear()\n                    recommendList.addAll(it.subList(random, random + 6))\n                    recommendAdapter?.notifyDataSetChanged()\n                }\n            }\n            Log.d(BangumiDetailActivity::class.java.simpleName,\"数据大小: ${recommendList.size}\")\n        }\n        recommendAdapter?.setOnItemClickListener { adapter, view, position ->\n            val intent = Intent(\n                this@BangumiDetailActivity,\n                BangumiDetailActivity::class.java\n            )\n            intent.putExtra(\"id\",recommendList[position].seasonId)\n            intent.putExtra(\"type\",\"bangumi\")\n            startActivity(intent)\n        }\n    }\n\n    override fun diamissDialog() {\n        cancleProgressDialog()\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n\n    @Throws(ClassCastException::class)\n    override fun onWindowFocusChanged(hasFocus: Boolean) {\n        super.onWindowFocusChanged(hasFocus)\n        var animationDrawables = tv_chasing.compoundDrawables\n        var drawable = animationDrawables[1] as AnimationDrawable\n        drawable.start()\n    }\n    /**\n     * @param iterations 迭代次数，越大越魔化。\n     * @param blurRadius 模糊图半径，必须大于0，越大越模糊。\n     */\n    fun showUrlBlur(draweeView: SimpleDraweeView, url:String, iterations:Int, blurRadius:Int) {\n        try {\n            var uri = Uri.parse(url);\n            var  request = ImageRequestBuilder.newBuilderWithSource(uri)\n                .setPostprocessor(IterativeBoxBlurPostProcessor(iterations, blurRadius))\n            .build();\n            var controller = Fresco.newDraweeControllerBuilder()\n                .setOldController(draweeView.getController())\n                .setImageRequest(request)\n                .build();\n            draweeView.setController(controller);\n        } catch (e:Exception) {\n            e.printStackTrace();\n        }\n    }\n\n    inner class BangumiTvAdapter(layout:Int,data: List<BangumiDetailData.Result.Episode>?) :\n        BaseQuickAdapter<BangumiDetailData.Result.Episode, BaseViewHolder>(layout,data) {\n        override fun convert(helper: BaseViewHolder, item: BangumiDetailData.Result.Episode?) {\n            helper.setText(R.id.text_title,\"第${item?.index}话\")\n            helper.setText(R.id.text_message,item?.indexTitle)\n        }\n    }\n\n    inner class BangumiRecommendAdapter(layout:Int,data: List<BangumiRecommendData.Result.BangumiInfo>?) :\n        BaseQuickAdapter<BangumiRecommendData.Result.BangumiInfo, BaseViewHolder>(layout,data) {\n        override fun convert(helper: BaseViewHolder, item: BangumiRecommendData.Result.BangumiInfo) {\n            var image:SimpleDraweeView = helper.getView(R.id.image_cover)\n            image.setImageURI(Uri.parse(item.cover + GlobalProperties.IMAGE_RULE_200_266))\n            helper.setText(R.id.text_num,StringUtil.getBigDecimalNumber(item.follow.toInt())+\"人追番\")\n            helper.setText(R.id.text_title,item.title)\n            helper.getView<TextView>(R.id.text_cover).visibility = View.GONE\n            //helper.setText(R.id.text_cover,\"更新至第\" + item.totalCount +\"话\")\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/ui/RegionDetailFragment.kt",
    "content": "package com.bilibili.lingxiao.home.region.ui\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.recyclerview.widget.GridLayoutManager\nimport android.view.View\nimport android.widget.FrameLayout\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.region.model.RegionDetailData\nimport com.bilibili.lingxiao.home.region.presenter.RegionDetailPresenter\nimport com.bilibili.lingxiao.home.region.view.RegionDetailView\nimport com.bilibili.lingxiao.home.live.BannerImageLoader\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.bilibili.lingxiao.web.WebActivity\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport com.youth.banner.Banner\nimport com.youth.banner.BannerConfig\nimport com.youth.banner.Transformer\nimport com.youth.banner.listener.OnBannerListener\nimport kotlinx.android.synthetic.main.normal_refresh_view.*\nimport kotlinx.android.synthetic.main.normal_refresh_view.view.*\n\nclass RegionDetailFragment :BaseFragment(),RegionDetailView{\n    private var presenter = RegionDetailPresenter(this,this)\n    private var regionList = arrayListOf<RegionDetailData.Info>()\n    private var tid = 1\n    private var rid = 1\n    private lateinit var videoAdapter:VideoAdapter\n    override val contentLayoutId: Int\n        get() = R.layout.normal_refresh_view    //fragment_region_detail\n\n    override fun initArgs(bundle: Bundle?) {\n        super.initArgs(bundle)\n        bundle?.let {\n            tid = it.getInt(\"tid\")\n        }\n    }\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        videoAdapter =\n            VideoAdapter(R.layout.item_video, regionList)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(context, 2)\n        manager.setSpanSizeLookup(object :\n            androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup(){\n            override fun getSpanSize(position: Int): Int {\n                if (videoAdapter.headerLayoutCount > 0){\n                    if(position == 0){\n                        return 2\n                    }else{\n                        return 1\n                    }\n                }\n                return 1\n            }\n        })\n        root.recycerView.adapter = videoAdapter\n        root.recycerView.layoutManager = manager\n        root.refresh.setOnRefreshListener {\n            regionList.clear()\n            presenter.getRegionDetail(tid)\n        }\n        root.refresh.setOnLoadMoreListener {\n            presenter.getRegionMore(rid)\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onGetRegionDetail(data: RegionDetailData) {\n        data.banner?.top?.let {\n            initBanner(it)\n        }\n        data.recommend?.let {\n            videoAdapter.addData(it)\n            if (it.size > 0){\n                rid = it[0].rid\n            }\n        }\n        data.new?.let {\n            videoAdapter.addData(it)\n        }\n        refresh.finishRefresh()\n\n    }\n\n    override fun onGetRegionMore(data: RegionDetailData) {\n        data.new?.let {\n            videoAdapter.addData(it)\n        }\n        refresh.finishLoadMore()\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n\n    class VideoAdapter(layoutResId: Int, data: MutableList<RegionDetailData.Info>?) :\n        BaseQuickAdapter<RegionDetailData.Info, BaseViewHolder>(layoutResId, data) {\n        override fun convert(helper: BaseViewHolder, item: RegionDetailData.Info) {\n            var image : SimpleDraweeView = helper.getView(R.id.play_image)\n            image.setImageURI(Uri.parse(item.cover + GlobalProperties.IMAGE_RULE_240_150))\n            helper.setText(R.id.play_title,item.title)\n            helper.setText(R.id.play_number,StringUtil.getBigDecimalNumber(item.play))\n            helper.setText(R.id.comment_number,StringUtil.getBigDecimalNumber(item.reply))\n            //helper.setText(R.id.category_name,item.rname)\n            helper.addOnClickListener(R.id.image_more)\n            helper.getView<ConstraintLayout>(R.id.cons_category).visibility = View.GONE\n        }\n    }\n\n    private var banner:Banner? = null\n    private fun initBanner(bannerData: List<RegionDetailData.Banner.Top>) {\n        if (banner != null){\n            return\n        }\n        banner = Banner(context)\n        var layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,\n            UIUtil.getDimen(R.dimen.banner_height))\n        banner?.layoutParams = layoutParams\n        var images = ArrayList<String>()\n        for (image in bannerData){\n            images.add(image.image)\n        }\n        banner?.setImageLoader(BannerImageLoader())\n        //设置图片集合\n        banner?.setImages(images)\n        //设置banner动画效果\n        banner?.setBannerAnimation(Transformer.ZoomOutSlide)\n        //设置标题集合（当banner样式有显示title时）\n        //banner?.setBannerTitles(titles)\n        //设置自动轮播，默认为true\n        banner?.isAutoPlay(true)\n        //设置轮播时间\n        banner?.setDelayTime(3000)\n        //设置指示器位置（当banner模式中有指示器时）\n        banner?.setBannerStyle(BannerConfig.CIRCLE_INDICATOR)\n        banner?.setIndicatorGravity(BannerConfig.RIGHT)\n        //banner设置方法全部调用完毕时最后调用\n        banner?.start()\n        banner?.setOnBannerListener(object : OnBannerListener {\n            override fun OnBannerClick(position: Int) {\n                var intent = Intent(context, WebActivity::class.java)\n                intent.putExtra(\"uri\",bannerData[position].uri)\n                intent.putExtra(\"title\",bannerData[position].title)\n                intent.putExtra(\"image\",bannerData[position].image)\n                startActivity(intent)\n            }\n        })\n        videoAdapter.addHeaderView(banner)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/ui/RegionFragment.kt",
    "content": "package com.bilibili.lingxiao.home.region.ui\n\nimport android.content.Intent\nimport android.hardware.usb.UsbManager\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport android.view.View\nimport android.widget.ImageView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.region.RegionAdapter\nimport com.bilibili.lingxiao.home.region.presenter.RegionPresenter\nimport com.bilibili.lingxiao.home.region.view.RegionView\nimport com.bilibili.lingxiao.home.region.model.MultiRegionData\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.home.region.model.RegionRecommendData\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.chad.library.adapter.base.BaseViewHolder\nimport kotlinx.android.synthetic.main.fragment_region.*\nimport kotlinx.android.synthetic.main.fragment_region.view.*\nimport org.greenrobot.eventbus.EventBus\nimport java.util.*\n\nclass RegionFragment :BaseFragment() , RegionView {\n    private var regionPresenter: RegionPresenter =\n        RegionPresenter(this, this)\n    private var regionList = arrayListOf<MultiRegionData>()\n    private lateinit var regionAdapter: RegionAdapter\n    private val TAG = RegionFragment::class.java.simpleName\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_region\n    override fun initInject() {\n        super.initInject()\n        UIUtil.getUiComponent().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(activity, 4)\n        manager.setSpanSizeLookup(object :\n            androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup(){\n            override fun getSpanSize(position: Int): Int {\n                //先设置adapter 再设置manager才会调用\n                var type = 0\n                if (regionAdapter.data.size > 0){\n                    type = regionAdapter.data.get(position).itemType\n                }\n                when(type){\n                    MultiRegionData.REGION_ITEM-> return 1\n                    MultiRegionData.REGION_TOP_BAR,MultiRegionData.REGION_BOTTOM_BAR-> return 4\n                    MultiRegionData.REGION_RECOMMEND-> return 2\n                    else-> return 4\n                }\n            }\n        })\n        val recycledViewPool = androidx.recyclerview.widget.RecyclerView.RecycledViewPool()\n        regionAdapter = RegionAdapter(regionList, recycledViewPool)\n        root.category_recyclerview.adapter = regionAdapter\n        root.category_recyclerview.layoutManager = manager\n        root.category_recyclerview.setItemViewCacheSize(200)\n        root.refresh.setOnRefreshListener({\n            regionPresenter.getRegion()\n        })\n        //root.refresh.setEnableAutoLoadMore(false)\n        var emptyView = View.inflate(context,R.layout.layout_empty,null)\n        var image = emptyView.findViewById<ImageView>(R.id.image_error)\n        image.setImageDrawable(resources.getDrawable(R.drawable.bilipay_common_error_tip))\n        regionAdapter.setEmptyView(emptyView)\n        regionAdapter.setMultiItemClickListener(object :RegionAdapter.OnMultiItemClickListener{\n            override fun onRefreshClick(\n                holde: BaseViewHolder,\n                data: RegionRecommendData.Data?,\n                position:Int\n            ) {\n                data?.let {\n                    regionPresenter.refreshRegion(it.type,Random().nextInt(10),it.param.toInt())\n                    regionPosition = position\n                }\n            }\n\n            override fun onVideoClick(data: RegionRecommendData.Data.Body?, type:String) {\n                if (\"bangumi\".equals(type)){\n                    //分区是番剧\n                    val intent = Intent(\n                        context,\n                        BangumiDetailActivity::class.java\n                    )\n                    intent.putExtra(\"id\",data?.param)\n                    //regionList[position].recommendData?.type\n                    intent.putExtra(\"type\",type)\n                    startActivity(intent)\n                }else{\n\n                }\n            }\n\n            override fun onGridClick(data: RegionData.Data?, position: Int) {\n                regionList[position].regionData?.let {\n                    var intent = Intent(context,RegionTabActivity::class.java)\n                    intent.putExtra(\"title\",it.name)\n                    startActivity(intent)\n                    EventBus.getDefault().postSticky(it)\n                }\n            }\n\n        })\n        regionAdapter.setOnItemChildClickListener { adapter, view, position ->\n            when(view.id){\n                R.id.item_live_image ->{\n                    var intent = Intent(context,RegionTabActivity::class.java)\n                    intent.putExtra(\"title\",regionList[position].regionData?.name)\n                    startActivity(intent)\n                    EventBus.getDefault().postSticky(regionList[position].regionData)\n                }\n                R.id.button_goto, R.id.button_more -> {\n                    regionList[position].recommendData?.let {\n                        var intent = Intent(context,RegionTabActivity::class.java)\n                        intent.putExtra(\"title\",it.title)\n                        startActivity(intent)\n                        EventBus.getDefault().postSticky(it)\n                    }\n                }\n                R.id.ll_refresh ->{\n                    regionList[position].recommendData?.let {\n                        regionPresenter.refreshRegion(it.type,Random().nextInt(10),it.param.toInt())\n                    }\n\n                }\n            }\n        }\n    }\n\n    override fun onFirstVisiblity() {\n        super.onFirstVisiblity()\n        refresh.autoRefresh()\n    }\n\n    override fun onVisiblityChanged(visiblity: Boolean) {\n        super.onVisiblityChanged(visiblity)\n        if (visiblity && regionAdapter.itemCount - regionAdapter.headerLayoutCount - regionAdapter.footerLayoutCount < 1){\n            refresh.autoRefresh()\n        }\n        //category_recyclerview.smoothScrollToPosition(0)\n    }\n\n\n    override fun onGetRegion(regions: List<RegionData.Data>) {\n        regionList.clear()\n        var list = regions\n        if (regions.size > 16){\n            list = regions.subList(0,16)\n        }\n        var multiData =\n            MultiRegionData(MultiRegionData.REGION_ITEM)\n        for (region in list){\n            var data = multiData.copy(MultiRegionData.REGION_ITEM)\n            data.regionData = region\n            regionAdapter.addData(data)\n        }\n        regionPresenter.getRegionRecommend()\n    }\n\n    override fun onGetRegionRecommend(recommendList: List<RegionRecommendData.Data>) {\n        for (recommend in recommendList){\n            var topData =\n                MultiRegionData(MultiRegionData.REGION_TOP_BAR)\n            topData.recommendData = recommend\n            regionAdapter.addData(topData)\n            for (bangumi in recommend.body){\n                var data =\n                    MultiRegionData(MultiRegionData.REGION_RECOMMEND)\n                data.bangumiItemData = bangumi\n                regionAdapter.addData(data)\n            }\n            var bottomData = topData.copy(MultiRegionData.REGION_BOTTOM_BAR)\n            bottomData.recommendData = recommend\n            regionAdapter.addData(bottomData)\n        }\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n        regionAdapter.loadMoreEnd()\n        category_recyclerview.smoothScrollToPosition(0)\n    }\n\n    private var regionPosition = 0\n    override fun onRefreshRegion(list: List<RegionRecommendData.Data.Body>) {\n        //这里获取到的list为4条 regionPosition是bottombar的position，需要更新的是bottombar的上面的四宫格\n        regionPosition = regionPosition - list.size\n        if (regionPosition < 0) return\n        for (item in list){\n            var recommendData =\n                MultiRegionData(MultiRegionData.REGION_RECOMMEND)\n            recommendData.bangumiItemData = item\n            //regionAdapter.setData(regionPosition++,recommendData)\n            regionAdapter.data.set(regionPosition,recommendData)\n            regionAdapter.notifyItemChanged(regionPosition++)\n        }\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/ui/RegionTabActivity.kt",
    "content": "package com.bilibili.lingxiao.home.region.ui\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentStatePagerAdapter\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.home.region.model.RegionRecommendData\nimport com.camera.lingxiao.common.app.BaseActivity\nimport kotlinx.android.synthetic.main.activity_live_more.*\nimport kotlinx.android.synthetic.main.title_bar.*\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\nimport java.lang.NumberFormatException\n\nclass RegionTabActivity : BaseActivity() {\n    private var tabList = arrayListOf<RegionData.Data.Children>()\n    private lateinit var mAdapter: PagerAdapter\n    override val contentLayoutId: Int\n        get() = R.layout.activity_live_more\n\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(title_bar)\n        title_bar.title = intent.getStringExtra(\"title\")\n        mAdapter = PagerAdapter(supportFragmentManager)\n        viewpager.setAdapter(mAdapter)\n        viewpager.offscreenPageLimit = 1\n        tablayout.setViewPager(viewpager)\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetRegionInfo(info :RegionData.Data){\n        tabList.addAll(info.children)\n        mAdapter.notifyDataSetChanged()\n        tablayout.notifyDataSetChanged()\n        EventBus.getDefault().removeStickyEvent(info)\n    }\n\n    @Throws(NumberFormatException::class)\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetRegionRecommendInfo(data :RegionRecommendData.Data){\n        var regionData = RegionData.Data.Children(\"\",\n            \"\",\"\",\"\",0,data.param.toInt(),0)\n        tabList.add(regionData)\n        mAdapter.notifyDataSetChanged()\n        tablayout.notifyDataSetChanged()\n        tablayout.visibility = View.GONE\n        EventBus.getDefault().removeStickyEvent(data)\n    }\n\n    inner class PagerAdapter(fm: androidx.fragment.app.FragmentManager) : androidx.fragment.app.FragmentStatePagerAdapter(fm) {\n\n        override fun getCount(): Int {\n            return tabList.size\n        }\n\n        override fun getItem(position: Int): androidx.fragment.app.Fragment {\n            val fragment = RegionDetailFragment()\n            val bundle = Bundle()\n            bundle.putInt(\"tid\",tabList[position].tid)  //其他的分类暂时就不展示了\n            fragment.setArguments(bundle)\n            return fragment\n        }\n\n        override fun getPageTitle(position: Int): CharSequence? {\n            return tabList[position].name\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/view/BangumiView.kt",
    "content": "package com.bilibili.lingxiao.home.region.view\n\nimport com.bilibili.lingxiao.home.region.model.BangumiDetailData\nimport com.bilibili.lingxiao.home.region.model.BangumiRecommendData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface BangumiView :BaseView{\n    fun onGetBangumiDetail(data :BangumiDetailData)\n    fun onGetBangumiRecommend(data: BangumiRecommendData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/view/RegionDetailView.kt",
    "content": "package com.bilibili.lingxiao.home.region.view\n\nimport com.bilibili.lingxiao.home.region.model.RegionDetailData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface RegionDetailView :BaseView{\n    fun onGetRegionDetail(data :RegionDetailData)\n    fun onGetRegionMore(data :RegionDetailData)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/home/region/view/RegionView.kt",
    "content": "package com.bilibili.lingxiao.home.region.view\n\nimport com.bilibili.lingxiao.home.region.model.RegionData\nimport com.bilibili.lingxiao.home.region.model.RegionRecommendData\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface RegionView :BaseView{\n    fun onGetRegion(regionData: List<RegionData.Data>)\n    fun onGetRegionRecommend(recommendList: List<RegionRecommendData.Data>)\n    fun onRefreshRegion(list: List<RegionRecommendData.Data.Body>)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/DoubleCommentView.kt",
    "content": "package com.bilibili.lingxiao.play\n\nimport com.bilibili.lingxiao.play.model.CommentData\n\ninterface DoubleCommentView {\n    fun onGetComment(reply: CommentData.Reply)\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/VideoPresenter.kt",
    "content": "package com.bilibili.lingxiao.play\n\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.home.recommend.view.RecommendView\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.play.model.VideoDetailData\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\n\nclass VideoPresenter : BasePresenter<RecommendView, BaseFragment>{\n    var httpTrans : HttpTrans\n\n    constructor(view: RecommendView, fragment: BaseFragment):super(view, fragment){\n        httpTrans = HttpTrans(fragment)\n    }\n\n    fun getDetailInfo(page:Int,id:String){\n        httpTrans.getDetailInfo(page,id,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetVideoDetail(lists[0] as VideoDetailData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n    fun getRecommendList(tid:Int,page:Int){\n        httpTrans.getRecommendList(tid,page,30,\"default\",object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetVideoRecommend(lists[0] as VideoRecoData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n    /**\n     * @param oid  视频av号\n     */\n    fun getComment(oid:String,next: Int){\n        httpTrans.getComment(oid,next,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                mView?.onGetVideoComment(lists[0] as CommentData)\n            }\n\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n            }\n\n            override fun onCancel() {\n\n            }\n\n        })\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/adapter/CommentAdapter.kt",
    "content": "package com.bilibili.lingxiao.play.adapter\n\nimport android.net.Uri\nimport android.text.SpannableString\nimport android.text.Spanned.SPAN_INCLUSIVE_INCLUSIVE\nimport android.text.style.ForegroundColorSpan\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.utils.DateUtil\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.chad.library.adapter.base.BaseMultiItemQuickAdapter\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport java.lang.Exception\n\nclass CommentAdapter : BaseMultiItemQuickAdapter<CommentData.Reply, BaseViewHolder> {\n    private val levelImages = arrayOf(\n        R.drawable.mall_mine_vip_level_0,\n        R.drawable.mall_mine_vip_level_1,\n        R.drawable.mall_mine_vip_level_2,\n        R.drawable.mall_mine_vip_level_3,\n        R.drawable.mall_mine_vip_level_4,\n        R.drawable.mall_mine_vip_level_5,\n        R.drawable.mall_mine_vip_level_6\n    )\n    private val replies by lazy {\n        arrayOf(\n            R.id.comment_hot1,\n            R.id.comment_hot2,\n            R.id.comment_hot3\n        )\n    }\n    var hotSegmentPosition:Int = 0  //需要隐藏分割线的位置\n    constructor(data: List<CommentData.Reply>):super(data){\n        addItemType(CommentData.Reply.REPLIE,R.layout.item_comment)\n        addItemType(CommentData.Reply.SEGMENT,R.layout.item_hot_segment)\n    }\n    override fun convert(helper: BaseViewHolder, item: CommentData.Reply) {\n        when(helper.itemViewType){\n            CommentData.Reply.REPLIE ->{\n                var header:SimpleDraweeView = helper.getView(R.id.header)\n                header.setImageURI(Uri.parse(item.member.avatar + GlobalProperties.IMAGE_RULE_60_60))\n                helper.setText(R.id.username,item.member.uname)\n\n                helper.setText(R.id.comment_desc,item.content.message)\n                helper.setText(R.id.recommend_num,StringUtil.getBigDecimalNumber(item.like))\n                var levelImage:SimpleDraweeView = helper.getView(R.id.image_level)\n                var level = item.member.levelInfo.currentLevel\n                if (level > 6 || level < 0) level = 0\n                levelImage.setImageResource(levelImages[level])\n\n                var floor = \"#\" +item.floor + \"  \" + DateUtil.convertTimeToFormat(item.ctime)\n                helper.setText(R.id.build_num,floor)\n\n                if (helper.position == hotSegmentPosition){\n                    var segment:ImageView = helper.getView(R.id.segment)\n                    segment.visibility = View.GONE\n                }\n                helper.addOnClickListener(R.id.more)\n                    .addOnClickListener(R.id.ll_comment_replie)\n                var more = helper.getView<TextView>(R.id.comment_hot_more)\n                var ll_replie = helper.getView<LinearLayout>(R.id.ll_comment_replie)\n                more.text = \"共${item.rcount}条回复 >\"\n                if (item.rcount > 0){\n                    ll_replie.visibility = View.VISIBLE\n                }else{\n                    ll_replie.visibility = View.GONE\n                }\n                item.replies?.let {\n\n                    if (it.size > 3){\n                        for ((index,id) in replies.withIndex()){\n                            var name = it[index].member.uname + \": \"\n                            var message = it[index].content.message\n                            helper\n                                .setText(id,getColorText(name,message))\n                                .setVisible(id,true)\n                        }\n                        more.visibility = View.VISIBLE\n                    }else{\n                        more.visibility = View.GONE\n                        for ((index,reply) in it.withIndex()){\n                            var name = reply.member.uname + \": \"\n                            var message = reply.content.message\n                            helper\n                                .setText(replies[index],getColorText(name,message))\n                                .setVisible(replies[index],true)\n                        }\n                    }\n                }\n            }\n            CommentData.Reply.SEGMENT ->{\n\n            }\n        }\n    }\n\n\n    fun getColorText(name:String,message:String) :SpannableString{\n        var spannableString = SpannableString(name + message)\n        var foregroundColorSpan = ForegroundColorSpan(mContext.resources.getColor(R.color.blue300))\n        spannableString.setSpan(foregroundColorSpan,0,name.length,SPAN_INCLUSIVE_INCLUSIVE)\n        return spannableString\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/adapter/EndPageAdapter.kt",
    "content": "package com.bilibili.lingxiao.play.adapter\n\nimport android.widget.ImageView\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.play.ui.IntroduceFragment\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\n\nclass EndPageAdapter :BaseQuickAdapter<IntroduceFragment.EndPageData,BaseViewHolder>{\n    constructor(layoutResId: Int, data: List<IntroduceFragment.EndPageData>):super(layoutResId,data)\n    override fun convert(helper: BaseViewHolder, item: IntroduceFragment.EndPageData) {\n        helper.setText(R.id.item_title,item.message)\n        var image : ImageView = helper.getView(R.id.item_image)\n        image.setImageDrawable(item.icon)\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/adapter/VideoDetailAdapter.kt",
    "content": "package com.bilibili.lingxiao.play.adapter\n\nimport android.net.Uri\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.facebook.drawee.view.SimpleDraweeView\nimport java.net.URI\n\nclass VideoDetailAdapter : BaseQuickAdapter<VideoRecoData.VideoInfo, BaseViewHolder> {\n    constructor(layoutResId: Int, data: List<VideoRecoData.VideoInfo>):super(layoutResId,data)\n    override fun convert(helper: BaseViewHolder, item: VideoRecoData.VideoInfo) {\n        helper.setText(R.id.title,item.title)\n        helper.setText(R.id.up_name,item.author)\n        helper.setText(R.id.play_num,StringUtil.getBigDecimalNumber(item.play))\n        helper.setText(R.id.damku_num,StringUtil.getBigDecimalNumber(item.videoReview))\n        var image : SimpleDraweeView = helper.getView(R.id.cover_image)\n        image.setImageURI(Uri.parse(item.pic + GlobalProperties.IMAGE_RULE_240_150))\n        helper.addOnClickListener(R.id.more)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/model/CommentData.kt",
    "content": "package com.bilibili.lingxiao.play.model\n\nimport com.chad.library.adapter.base.entity.MultiItemEntity\nimport com.google.gson.annotations.SerializedName\n\ndata class CommentData(\n    @SerializedName(\"assist\")\n    val assist: Int,\n    @SerializedName(\"blacklist\")\n    val blacklist: Int,\n    @SerializedName(\"config\")\n    val config: Config,\n    @SerializedName(\"cursor\")\n    val cursor: Cursor,\n    @SerializedName(\"folder\")\n    val folder: Folder,\n    @SerializedName(\"hots\")\n    val hots: List<Reply>?,\n    @SerializedName(\"notice\")\n    val notice: Any,\n    @SerializedName(\"replies\")\n    val replies: List<Reply>?,\n    @SerializedName(\"top\")\n    val top: Top,\n    @SerializedName(\"upper\")\n    val upper: Upper,\n    @SerializedName(\"vote\")\n    val vote: Int\n) {\n    data class Config(\n        @SerializedName(\"read_only\")\n        val readOnly: Boolean,\n        @SerializedName(\"show_del_log\")\n        val showDelLog: Boolean,\n        @SerializedName(\"show_up_flag\")\n        val showUpFlag: Boolean,\n        @SerializedName(\"showadmin\")\n        val showadmin: Int,\n        @SerializedName(\"showentry\")\n        val showentry: Int,\n        @SerializedName(\"showfloor\")\n        val showfloor: Int,\n        @SerializedName(\"showtopic\")\n        val showtopic: Int\n    )\n\n    data class Cursor(\n        @SerializedName(\"all_count\")\n        val allCount: Int,\n        @SerializedName(\"is_begin\")\n        val isBegin: Boolean,\n        @SerializedName(\"is_end\")\n        val isEnd: Boolean,\n        @SerializedName(\"mode\")\n        val mode: Int,\n        @SerializedName(\"name\")\n        val name: String,\n        @SerializedName(\"next\")\n        val next: Int,\n        @SerializedName(\"prev\")\n        val prev: Int,\n        @SerializedName(\"support_mode\")\n        val supportMode: List<Int>\n    )\n\n    data class Reply(\n        @SerializedName(\"action\")\n        val action: Int,\n        @SerializedName(\"assist\")\n        val assist: Int,\n        @SerializedName(\"attr\")\n        val attr: Int,\n        @SerializedName(\"content\")\n        val content: Content,\n        @SerializedName(\"count\")\n        val count: Int,\n        @SerializedName(\"ctime\")\n        val ctime: Long,\n        @SerializedName(\"dialog\")\n        val dialog: Int,\n        @SerializedName(\"fansgrade\")\n        val fansgrade: Int,\n        @SerializedName(\"floor\")\n        val floor: Int,\n        @SerializedName(\"folder\")\n        val folder: Folder,\n        @SerializedName(\"like\")\n        val like: Int,\n        @SerializedName(\"member\")\n        val member: Member,\n        @SerializedName(\"mid\")\n        val mid: Int,\n        @SerializedName(\"oid\")\n        val oid: Int,\n        @SerializedName(\"parent\")\n        val parent: Int,\n        @SerializedName(\"parent_str\")\n        val parentStr: String,\n        @SerializedName(\"rcount\")\n        val rcount: Int,\n        @SerializedName(\"replies\")\n        val replies: List<Reply>?,\n        @SerializedName(\"root\")\n        val root: Int,\n        @SerializedName(\"root_str\")\n        val rootStr: String,\n        @SerializedName(\"rpid\")\n        val rpid: Int,\n        @SerializedName(\"rpid_str\")\n        val rpidStr: String,\n        @SerializedName(\"state\")\n        val state: Int,\n        @SerializedName(\"type\")\n        val type: Int,\n        @SerializedName(\"up_action\")\n        val upAction: UpAction,\n        val viewType:Int\n    ) : MultiItemEntity {\n        companion object {\n            val REPLIE = 0\n            val SEGMENT = 1\n        }\n\n        override fun getItemType(): Int {\n            return viewType\n        }\n        data class Content(\n            @SerializedName(\"device\")\n            val device: String,\n            @SerializedName(\"members\")\n            val members: List<Any>,\n            @SerializedName(\"message\")\n            val message: String,\n            @SerializedName(\"plat\")\n            val plat: Int\n        )\n\n        data class Member(\n            @SerializedName(\"DisplayRank\")\n            val displayRank: String,\n            @SerializedName(\"avatar\")\n            val avatar: String,\n            @SerializedName(\"fans_detail\")\n            val fansDetail: Any,\n            @SerializedName(\"following\")\n            val following: Int,\n            @SerializedName(\"level_info\")\n            val levelInfo: LevelInfo,\n            @SerializedName(\"mid\")\n            val mid: String,\n            @SerializedName(\"nameplate\")\n            val nameplate: Nameplate,\n            @SerializedName(\"official_verify\")\n            val officialVerify: OfficialVerify,\n            @SerializedName(\"pendant\")\n            val pendant: Pendant,\n            @SerializedName(\"rank\")\n            val rank: String,\n            @SerializedName(\"sex\")\n            val sex: String,\n            @SerializedName(\"sign\")\n            val sign: String,\n            @SerializedName(\"uname\")\n            val uname: String,\n            @SerializedName(\"vip\")\n            val vip: Vip\n        ) {\n            data class Nameplate(\n                @SerializedName(\"condition\")\n                val condition: String,\n                @SerializedName(\"image\")\n                val image: String,\n                @SerializedName(\"image_small\")\n                val imageSmall: String,\n                @SerializedName(\"level\")\n                val level: String,\n                @SerializedName(\"name\")\n                val name: String,\n                @SerializedName(\"nid\")\n                val nid: Int\n            )\n\n            data class OfficialVerify(\n                @SerializedName(\"desc\")\n                val desc: String,\n                @SerializedName(\"type\")\n                val type: Int\n            )\n\n            data class Pendant(\n                @SerializedName(\"expire\")\n                val expire: Int,\n                @SerializedName(\"image\")\n                val image: String,\n                @SerializedName(\"name\")\n                val name: String,\n                @SerializedName(\"pid\")\n                val pid: Int\n            )\n\n            data class LevelInfo(\n                @SerializedName(\"current_exp\")\n                val currentExp: Int,\n                @SerializedName(\"current_level\")\n                val currentLevel: Int,\n                @SerializedName(\"current_min\")\n                val currentMin: Int,\n                @SerializedName(\"next_exp\")\n                val nextExp: Int\n            )\n\n            data class Vip(\n                @SerializedName(\"accessStatus\")\n                val accessStatus: Int,\n                @SerializedName(\"dueRemark\")\n                val dueRemark: String,\n                @SerializedName(\"themeType\")\n                val themeType: Int,\n                @SerializedName(\"vipDueDate\")\n                val vipDueDate: Long,\n                @SerializedName(\"vipStatus\")\n                val vipStatus: Int,\n                @SerializedName(\"vipStatusWarn\")\n                val vipStatusWarn: String,\n                @SerializedName(\"vipType\")\n                val vipType: Int\n            )\n        }\n\n        data class Folder(\n            @SerializedName(\"has_folded\")\n            val hasFolded: Boolean,\n            @SerializedName(\"is_folded\")\n            val isFolded: Boolean,\n            @SerializedName(\"rule\")\n            val rule: String\n        )\n\n        data class UpAction(\n            @SerializedName(\"like\")\n            val like: Boolean,\n            @SerializedName(\"reply\")\n            val reply: Boolean\n        )\n    }\n\n    data class Hot(\n        @SerializedName(\"action\")\n        val action: Int,\n        @SerializedName(\"assist\")\n        val assist: Int,\n        @SerializedName(\"attr\")\n        val attr: Int,\n        @SerializedName(\"content\")\n        val content: Content,\n        @SerializedName(\"count\")\n        val count: Int,\n        @SerializedName(\"ctime\")\n        val ctime: Int,\n        @SerializedName(\"dialog\")\n        val dialog: Int,\n        @SerializedName(\"fansgrade\")\n        val fansgrade: Int,\n        @SerializedName(\"floor\")\n        val floor: Int,\n        @SerializedName(\"folder\")\n        val folder: Folder,\n        @SerializedName(\"like\")\n        val like: Int,\n        @SerializedName(\"member\")\n        val member: Member,\n        @SerializedName(\"mid\")\n        val mid: Int,\n        @SerializedName(\"oid\")\n        val oid: Int,\n        @SerializedName(\"parent\")\n        val parent: Int,\n        @SerializedName(\"parent_str\")\n        val parentStr: String,\n        @SerializedName(\"rcount\")\n        val rcount: Int,\n        @SerializedName(\"replies\")\n        val replies: List<Reply>,\n        @SerializedName(\"root\")\n        val root: Int,\n        @SerializedName(\"root_str\")\n        val rootStr: String,\n        @SerializedName(\"rpid\")\n        val rpid: Int,\n        @SerializedName(\"rpid_str\")\n        val rpidStr: String,\n        @SerializedName(\"state\")\n        val state: Int,\n        @SerializedName(\"type\")\n        val type: Int,\n        @SerializedName(\"up_action\")\n        val upAction: UpAction\n    ) {\n        data class Reply(\n            @SerializedName(\"action\")\n            val action: Int,\n            @SerializedName(\"assist\")\n            val assist: Int,\n            @SerializedName(\"attr\")\n            val attr: Int,\n            @SerializedName(\"content\")\n            val content: Content,\n            @SerializedName(\"count\")\n            val count: Int,\n            @SerializedName(\"ctime\")\n            val ctime: Int,\n            @SerializedName(\"dialog\")\n            val dialog: Int,\n            @SerializedName(\"fansgrade\")\n            val fansgrade: Int,\n            @SerializedName(\"floor\")\n            val floor: Int,\n            @SerializedName(\"folder\")\n            val folder: Folder,\n            @SerializedName(\"like\")\n            val like: Int,\n            @SerializedName(\"member\")\n            val member: Member,\n            @SerializedName(\"mid\")\n            val mid: Int,\n            @SerializedName(\"oid\")\n            val oid: Int,\n            @SerializedName(\"parent\")\n            val parent: Int,\n            @SerializedName(\"parent_str\")\n            val parentStr: String,\n            @SerializedName(\"rcount\")\n            val rcount: Int,\n            @SerializedName(\"replies\")\n            val replies: List<Any>,\n            @SerializedName(\"root\")\n            val root: Int,\n            @SerializedName(\"root_str\")\n            val rootStr: String,\n            @SerializedName(\"rpid\")\n            val rpid: Int,\n            @SerializedName(\"rpid_str\")\n            val rpidStr: String,\n            @SerializedName(\"state\")\n            val state: Int,\n            @SerializedName(\"type\")\n            val type: Int,\n            @SerializedName(\"up_action\")\n            val upAction: UpAction\n        ) {\n            data class Member(\n                @SerializedName(\"DisplayRank\")\n                val displayRank: String,\n                @SerializedName(\"avatar\")\n                val avatar: String,\n                @SerializedName(\"fans_detail\")\n                val fansDetail: Any,\n                @SerializedName(\"following\")\n                val following: Int,\n                @SerializedName(\"level_info\")\n                val levelInfo: LevelInfo,\n                @SerializedName(\"mid\")\n                val mid: String,\n                @SerializedName(\"nameplate\")\n                val nameplate: Nameplate,\n                @SerializedName(\"official_verify\")\n                val officialVerify: OfficialVerify,\n                @SerializedName(\"pendant\")\n                val pendant: Pendant,\n                @SerializedName(\"rank\")\n                val rank: String,\n                @SerializedName(\"sex\")\n                val sex: String,\n                @SerializedName(\"sign\")\n                val sign: String,\n                @SerializedName(\"uname\")\n                val uname: String,\n                @SerializedName(\"vip\")\n                val vip: Vip\n            ) {\n                data class Nameplate(\n                    @SerializedName(\"condition\")\n                    val condition: String,\n                    @SerializedName(\"image\")\n                    val image: String,\n                    @SerializedName(\"image_small\")\n                    val imageSmall: String,\n                    @SerializedName(\"level\")\n                    val level: String,\n                    @SerializedName(\"name\")\n                    val name: String,\n                    @SerializedName(\"nid\")\n                    val nid: Int\n                )\n\n                data class OfficialVerify(\n                    @SerializedName(\"desc\")\n                    val desc: String,\n                    @SerializedName(\"type\")\n                    val type: Int\n                )\n\n                data class Pendant(\n                    @SerializedName(\"expire\")\n                    val expire: Int,\n                    @SerializedName(\"image\")\n                    val image: String,\n                    @SerializedName(\"name\")\n                    val name: String,\n                    @SerializedName(\"pid\")\n                    val pid: Int\n                )\n\n                data class LevelInfo(\n                    @SerializedName(\"current_exp\")\n                    val currentExp: Int,\n                    @SerializedName(\"current_level\")\n                    val currentLevel: Int,\n                    @SerializedName(\"current_min\")\n                    val currentMin: Int,\n                    @SerializedName(\"next_exp\")\n                    val nextExp: Int\n                )\n\n                data class Vip(\n                    @SerializedName(\"accessStatus\")\n                    val accessStatus: Int,\n                    @SerializedName(\"dueRemark\")\n                    val dueRemark: String,\n                    @SerializedName(\"themeType\")\n                    val themeType: Int,\n                    @SerializedName(\"vipDueDate\")\n                    val vipDueDate: Int,\n                    @SerializedName(\"vipStatus\")\n                    val vipStatus: Int,\n                    @SerializedName(\"vipStatusWarn\")\n                    val vipStatusWarn: String,\n                    @SerializedName(\"vipType\")\n                    val vipType: Int\n                )\n            }\n\n            data class Folder(\n                @SerializedName(\"has_folded\")\n                val hasFolded: Boolean,\n                @SerializedName(\"is_folded\")\n                val isFolded: Boolean,\n                @SerializedName(\"rule\")\n                val rule: String\n            )\n\n            data class Content(\n                @SerializedName(\"device\")\n                val device: String,\n                @SerializedName(\"members\")\n                val members: List<Member>,\n                @SerializedName(\"message\")\n                val message: String,\n                @SerializedName(\"plat\")\n                val plat: Int\n            ) {\n                data class Member(\n                    @SerializedName(\"DisplayRank\")\n                    val displayRank: String,\n                    @SerializedName(\"avatar\")\n                    val avatar: String,\n                    @SerializedName(\"level_info\")\n                    val levelInfo: LevelInfo,\n                    @SerializedName(\"mid\")\n                    val mid: String,\n                    @SerializedName(\"nameplate\")\n                    val nameplate: Nameplate,\n                    @SerializedName(\"official_verify\")\n                    val officialVerify: OfficialVerify,\n                    @SerializedName(\"pendant\")\n                    val pendant: Pendant,\n                    @SerializedName(\"rank\")\n                    val rank: String,\n                    @SerializedName(\"sex\")\n                    val sex: String,\n                    @SerializedName(\"sign\")\n                    val sign: String,\n                    @SerializedName(\"uname\")\n                    val uname: String,\n                    @SerializedName(\"vip\")\n                    val vip: Vip\n                ) {\n                    data class Nameplate(\n                        @SerializedName(\"condition\")\n                        val condition: String,\n                        @SerializedName(\"image\")\n                        val image: String,\n                        @SerializedName(\"image_small\")\n                        val imageSmall: String,\n                        @SerializedName(\"level\")\n                        val level: String,\n                        @SerializedName(\"name\")\n                        val name: String,\n                        @SerializedName(\"nid\")\n                        val nid: Int\n                    )\n\n                    data class OfficialVerify(\n                        @SerializedName(\"desc\")\n                        val desc: String,\n                        @SerializedName(\"type\")\n                        val type: Int\n                    )\n\n                    data class Pendant(\n                        @SerializedName(\"expire\")\n                        val expire: Int,\n                        @SerializedName(\"image\")\n                        val image: String,\n                        @SerializedName(\"name\")\n                        val name: String,\n                        @SerializedName(\"pid\")\n                        val pid: Int\n                    )\n\n                    data class LevelInfo(\n                        @SerializedName(\"current_exp\")\n                        val currentExp: Int,\n                        @SerializedName(\"current_level\")\n                        val currentLevel: Int,\n                        @SerializedName(\"current_min\")\n                        val currentMin: Int,\n                        @SerializedName(\"next_exp\")\n                        val nextExp: Int\n                    )\n\n                    data class Vip(\n                        @SerializedName(\"accessStatus\")\n                        val accessStatus: Int,\n                        @SerializedName(\"dueRemark\")\n                        val dueRemark: String,\n                        @SerializedName(\"themeType\")\n                        val themeType: Int,\n                        @SerializedName(\"vipDueDate\")\n                        val vipDueDate: Long,\n                        @SerializedName(\"vipStatus\")\n                        val vipStatus: Int,\n                        @SerializedName(\"vipStatusWarn\")\n                        val vipStatusWarn: String,\n                        @SerializedName(\"vipType\")\n                        val vipType: Int\n                    )\n                }\n            }\n\n            data class UpAction(\n                @SerializedName(\"like\")\n                val like: Boolean,\n                @SerializedName(\"reply\")\n                val reply: Boolean\n            )\n        }\n\n        data class Content(\n            @SerializedName(\"device\")\n            val device: String,\n            @SerializedName(\"members\")\n            val members: List<Any>,\n            @SerializedName(\"message\")\n            val message: String,\n            @SerializedName(\"plat\")\n            val plat: Int\n        )\n\n        data class Member(\n            @SerializedName(\"DisplayRank\")\n            val displayRank: String,\n            @SerializedName(\"avatar\")\n            val avatar: String,\n            @SerializedName(\"fans_detail\")\n            val fansDetail: Any,\n            @SerializedName(\"following\")\n            val following: Int,\n            @SerializedName(\"level_info\")\n            val levelInfo: LevelInfo,\n            @SerializedName(\"mid\")\n            val mid: String,\n            @SerializedName(\"nameplate\")\n            val nameplate: Nameplate,\n            @SerializedName(\"official_verify\")\n            val officialVerify: OfficialVerify,\n            @SerializedName(\"pendant\")\n            val pendant: Pendant,\n            @SerializedName(\"rank\")\n            val rank: String,\n            @SerializedName(\"sex\")\n            val sex: String,\n            @SerializedName(\"sign\")\n            val sign: String,\n            @SerializedName(\"uname\")\n            val uname: String,\n            @SerializedName(\"vip\")\n            val vip: Vip\n        ) {\n            data class Nameplate(\n                @SerializedName(\"condition\")\n                val condition: String,\n                @SerializedName(\"image\")\n                val image: String,\n                @SerializedName(\"image_small\")\n                val imageSmall: String,\n                @SerializedName(\"level\")\n                val level: String,\n                @SerializedName(\"name\")\n                val name: String,\n                @SerializedName(\"nid\")\n                val nid: Int\n            )\n\n            data class OfficialVerify(\n                @SerializedName(\"desc\")\n                val desc: String,\n                @SerializedName(\"type\")\n                val type: Int\n            )\n\n            data class Pendant(\n                @SerializedName(\"expire\")\n                val expire: Int,\n                @SerializedName(\"image\")\n                val image: String,\n                @SerializedName(\"name\")\n                val name: String,\n                @SerializedName(\"pid\")\n                val pid: Int\n            )\n\n            data class LevelInfo(\n                @SerializedName(\"current_exp\")\n                val currentExp: Int,\n                @SerializedName(\"current_level\")\n                val currentLevel: Int,\n                @SerializedName(\"current_min\")\n                val currentMin: Int,\n                @SerializedName(\"next_exp\")\n                val nextExp: Int\n            )\n\n            data class Vip(\n                @SerializedName(\"accessStatus\")\n                val accessStatus: Int,\n                @SerializedName(\"dueRemark\")\n                val dueRemark: String,\n                @SerializedName(\"themeType\")\n                val themeType: Int,\n                @SerializedName(\"vipDueDate\")\n                val vipDueDate: Long,\n                @SerializedName(\"vipStatus\")\n                val vipStatus: Int,\n                @SerializedName(\"vipStatusWarn\")\n                val vipStatusWarn: String,\n                @SerializedName(\"vipType\")\n                val vipType: Int\n            )\n        }\n\n        data class Folder(\n            @SerializedName(\"has_folded\")\n            val hasFolded: Boolean,\n            @SerializedName(\"is_folded\")\n            val isFolded: Boolean,\n            @SerializedName(\"rule\")\n            val rule: String\n        )\n\n        data class UpAction(\n            @SerializedName(\"like\")\n            val like: Boolean,\n            @SerializedName(\"reply\")\n            val reply: Boolean\n        )\n    }\n\n    data class Folder(\n        @SerializedName(\"has_folded\")\n        val hasFolded: Boolean,\n        @SerializedName(\"is_folded\")\n        val isFolded: Boolean,\n        @SerializedName(\"rule\")\n        val rule: String\n    )\n\n    data class Upper(\n        @SerializedName(\"mid\")\n        val mid: Int\n    )\n\n    data class Top(\n        @SerializedName(\"admin\")\n        val admin: Any,\n        @SerializedName(\"upper\")\n        val upper: Upper,\n        @SerializedName(\"vote\")\n        val vote: Any\n    ) {\n        data class Upper(\n            @SerializedName(\"action\")\n            val action: Int,\n            @SerializedName(\"assist\")\n            val assist: Int,\n            @SerializedName(\"attr\")\n            val attr: Int,\n            @SerializedName(\"content\")\n            val content: Content,\n            @SerializedName(\"count\")\n            val count: Int,\n            @SerializedName(\"ctime\")\n            val ctime: Int,\n            @SerializedName(\"dialog\")\n            val dialog: Int,\n            @SerializedName(\"fansgrade\")\n            val fansgrade: Int,\n            @SerializedName(\"floor\")\n            val floor: Int,\n            @SerializedName(\"folder\")\n            val folder: Folder,\n            @SerializedName(\"like\")\n            val like: Int,\n            @SerializedName(\"member\")\n            val member: Member,\n            @SerializedName(\"mid\")\n            val mid: Int,\n            @SerializedName(\"oid\")\n            val oid: Int,\n            @SerializedName(\"parent\")\n            val parent: Int,\n            @SerializedName(\"parent_str\")\n            val parentStr: String,\n            @SerializedName(\"rcount\")\n            val rcount: Int,\n            @SerializedName(\"replies\")\n            val replies: List<Reply>,\n            @SerializedName(\"root\")\n            val root: Int,\n            @SerializedName(\"root_str\")\n            val rootStr: String,\n            @SerializedName(\"rpid\")\n            val rpid: Int,\n            @SerializedName(\"rpid_str\")\n            val rpidStr: String,\n            @SerializedName(\"state\")\n            val state: Int,\n            @SerializedName(\"type\")\n            val type: Int,\n            @SerializedName(\"up_action\")\n            val upAction: UpAction\n        ) {\n            data class Reply(\n                @SerializedName(\"action\")\n                val action: Int,\n                @SerializedName(\"assist\")\n                val assist: Int,\n                @SerializedName(\"attr\")\n                val attr: Int,\n                @SerializedName(\"content\")\n                val content: Content,\n                @SerializedName(\"count\")\n                val count: Int,\n                @SerializedName(\"ctime\")\n                val ctime: Int,\n                @SerializedName(\"dialog\")\n                val dialog: Int,\n                @SerializedName(\"fansgrade\")\n                val fansgrade: Int,\n                @SerializedName(\"floor\")\n                val floor: Int,\n                @SerializedName(\"folder\")\n                val folder: Folder,\n                @SerializedName(\"like\")\n                val like: Int,\n                @SerializedName(\"member\")\n                val member: Member,\n                @SerializedName(\"mid\")\n                val mid: Int,\n                @SerializedName(\"oid\")\n                val oid: Int,\n                @SerializedName(\"parent\")\n                val parent: Int,\n                @SerializedName(\"parent_str\")\n                val parentStr: String,\n                @SerializedName(\"rcount\")\n                val rcount: Int,\n                @SerializedName(\"replies\")\n                val replies: List<Any>,\n                @SerializedName(\"root\")\n                val root: Int,\n                @SerializedName(\"root_str\")\n                val rootStr: String,\n                @SerializedName(\"rpid\")\n                val rpid: Int,\n                @SerializedName(\"rpid_str\")\n                val rpidStr: String,\n                @SerializedName(\"state\")\n                val state: Int,\n                @SerializedName(\"type\")\n                val type: Int,\n                @SerializedName(\"up_action\")\n                val upAction: UpAction\n            ) {\n                data class Member(\n                    @SerializedName(\"DisplayRank\")\n                    val displayRank: String,\n                    @SerializedName(\"avatar\")\n                    val avatar: String,\n                    @SerializedName(\"fans_detail\")\n                    val fansDetail: Any,\n                    @SerializedName(\"following\")\n                    val following: Int,\n                    @SerializedName(\"level_info\")\n                    val levelInfo: LevelInfo,\n                    @SerializedName(\"mid\")\n                    val mid: String,\n                    @SerializedName(\"nameplate\")\n                    val nameplate: Nameplate,\n                    @SerializedName(\"official_verify\")\n                    val officialVerify: OfficialVerify,\n                    @SerializedName(\"pendant\")\n                    val pendant: Pendant,\n                    @SerializedName(\"rank\")\n                    val rank: String,\n                    @SerializedName(\"sex\")\n                    val sex: String,\n                    @SerializedName(\"sign\")\n                    val sign: String,\n                    @SerializedName(\"uname\")\n                    val uname: String,\n                    @SerializedName(\"vip\")\n                    val vip: Vip\n                ) {\n                    data class Nameplate(\n                        @SerializedName(\"condition\")\n                        val condition: String,\n                        @SerializedName(\"image\")\n                        val image: String,\n                        @SerializedName(\"image_small\")\n                        val imageSmall: String,\n                        @SerializedName(\"level\")\n                        val level: String,\n                        @SerializedName(\"name\")\n                        val name: String,\n                        @SerializedName(\"nid\")\n                        val nid: Int\n                    )\n\n                    data class OfficialVerify(\n                        @SerializedName(\"desc\")\n                        val desc: String,\n                        @SerializedName(\"type\")\n                        val type: Int\n                    )\n\n                    data class Pendant(\n                        @SerializedName(\"expire\")\n                        val expire: Int,\n                        @SerializedName(\"image\")\n                        val image: String,\n                        @SerializedName(\"name\")\n                        val name: String,\n                        @SerializedName(\"pid\")\n                        val pid: Int\n                    )\n\n                    data class LevelInfo(\n                        @SerializedName(\"current_exp\")\n                        val currentExp: Int,\n                        @SerializedName(\"current_level\")\n                        val currentLevel: Int,\n                        @SerializedName(\"current_min\")\n                        val currentMin: Int,\n                        @SerializedName(\"next_exp\")\n                        val nextExp: Int\n                    )\n\n                    data class Vip(\n                        @SerializedName(\"accessStatus\")\n                        val accessStatus: Int,\n                        @SerializedName(\"dueRemark\")\n                        val dueRemark: String,\n                        @SerializedName(\"themeType\")\n                        val themeType: Int,\n                        @SerializedName(\"vipDueDate\")\n                        val vipDueDate: Int,\n                        @SerializedName(\"vipStatus\")\n                        val vipStatus: Int,\n                        @SerializedName(\"vipStatusWarn\")\n                        val vipStatusWarn: String,\n                        @SerializedName(\"vipType\")\n                        val vipType: Int\n                    )\n                }\n\n                data class Content(\n                    @SerializedName(\"device\")\n                    val device: String,\n                    @SerializedName(\"members\")\n                    val members: List<Any>,\n                    @SerializedName(\"message\")\n                    val message: String,\n                    @SerializedName(\"plat\")\n                    val plat: Int\n                )\n\n                data class Folder(\n                    @SerializedName(\"has_folded\")\n                    val hasFolded: Boolean,\n                    @SerializedName(\"is_folded\")\n                    val isFolded: Boolean,\n                    @SerializedName(\"rule\")\n                    val rule: String\n                )\n\n                data class UpAction(\n                    @SerializedName(\"like\")\n                    val like: Boolean,\n                    @SerializedName(\"reply\")\n                    val reply: Boolean\n                )\n            }\n\n            data class Content(\n                @SerializedName(\"device\")\n                val device: String,\n                @SerializedName(\"members\")\n                val members: List<Any>,\n                @SerializedName(\"message\")\n                val message: String,\n                @SerializedName(\"plat\")\n                val plat: Int\n            )\n\n            data class Member(\n                @SerializedName(\"DisplayRank\")\n                val displayRank: String,\n                @SerializedName(\"avatar\")\n                val avatar: String,\n                @SerializedName(\"fans_detail\")\n                val fansDetail: Any,\n                @SerializedName(\"following\")\n                val following: Int,\n                @SerializedName(\"level_info\")\n                val levelInfo: LevelInfo,\n                @SerializedName(\"mid\")\n                val mid: String,\n                @SerializedName(\"nameplate\")\n                val nameplate: Nameplate,\n                @SerializedName(\"official_verify\")\n                val officialVerify: OfficialVerify,\n                @SerializedName(\"pendant\")\n                val pendant: Pendant,\n                @SerializedName(\"rank\")\n                val rank: String,\n                @SerializedName(\"sex\")\n                val sex: String,\n                @SerializedName(\"sign\")\n                val sign: String,\n                @SerializedName(\"uname\")\n                val uname: String,\n                @SerializedName(\"vip\")\n                val vip: Vip\n            ) {\n                data class Nameplate(\n                    @SerializedName(\"condition\")\n                    val condition: String,\n                    @SerializedName(\"image\")\n                    val image: String,\n                    @SerializedName(\"image_small\")\n                    val imageSmall: String,\n                    @SerializedName(\"level\")\n                    val level: String,\n                    @SerializedName(\"name\")\n                    val name: String,\n                    @SerializedName(\"nid\")\n                    val nid: Int\n                )\n\n                data class OfficialVerify(\n                    @SerializedName(\"desc\")\n                    val desc: String,\n                    @SerializedName(\"type\")\n                    val type: Int\n                )\n\n                data class Pendant(\n                    @SerializedName(\"expire\")\n                    val expire: Int,\n                    @SerializedName(\"image\")\n                    val image: String,\n                    @SerializedName(\"name\")\n                    val name: String,\n                    @SerializedName(\"pid\")\n                    val pid: Int\n                )\n\n                data class LevelInfo(\n                    @SerializedName(\"current_exp\")\n                    val currentExp: Int,\n                    @SerializedName(\"current_level\")\n                    val currentLevel: Int,\n                    @SerializedName(\"current_min\")\n                    val currentMin: Int,\n                    @SerializedName(\"next_exp\")\n                    val nextExp: Int\n                )\n\n                data class Vip(\n                    @SerializedName(\"accessStatus\")\n                    val accessStatus: Int,\n                    @SerializedName(\"dueRemark\")\n                    val dueRemark: String,\n                    @SerializedName(\"themeType\")\n                    val themeType: Int,\n                    @SerializedName(\"vipDueDate\")\n                    val vipDueDate: Long,\n                    @SerializedName(\"vipStatus\")\n                    val vipStatus: Int,\n                    @SerializedName(\"vipStatusWarn\")\n                    val vipStatusWarn: String,\n                    @SerializedName(\"vipType\")\n                    val vipType: Int\n                )\n            }\n\n            data class Folder(\n                @SerializedName(\"has_folded\")\n                val hasFolded: Boolean,\n                @SerializedName(\"is_folded\")\n                val isFolded: Boolean,\n                @SerializedName(\"rule\")\n                val rule: String\n            )\n\n            data class UpAction(\n                @SerializedName(\"like\")\n                val like: Boolean,\n                @SerializedName(\"reply\")\n                val reply: Boolean\n            )\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/model/VideoData.kt",
    "content": "package com.bilibili.lingxiao.play.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class VideoData(\n    val cid: Int,\n    val expire_time: Int,\n    val file_info: FileInfo,\n    val fnval: Int,\n    val fnver: Int,\n    val quality: Int,\n    val support_description: List<String>,\n    val support_formats: List<String>,\n    val support_quality: List<Int>,\n    val url: String,\n    val video_codecid: Int,\n    val video_project: Boolean\n) {\n    data class FileInfo(\n        @SerializedName(\"112\")\n        val x_112: List<X112>,\n        @SerializedName(\"16\")\n        val x_16: List<X16>,\n        @SerializedName(\"32\")\n        val x_32: List<X32>,\n        @SerializedName(\"64\")\n        val x_64: List<X64>,\n        @SerializedName(\"80\")\n        val x_80: List<X80>\n    ) {\n        data class X32(\n            val filesize: Long,\n            val timelength: Int\n        )\n\n        data class X16(\n            val filesize: Long,\n            val timelength: Int\n        )\n\n        data class X112(\n            val filesize: Int,\n            val timelength: Int\n        )\n\n        data class X64(\n            val filesize: Long,\n            val timelength: Int\n        )\n\n        data class X80(\n            val filesize: Long,\n            val timelength: Int\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/model/VideoDetailData.kt",
    "content": "package com.bilibili.lingxiao.play.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class VideoDetailData(\n    val allow_bp: Int,\n    val allow_download: Int,\n    val allow_feed: Int,\n    val arctype: String,\n    val author: String,\n    val cid: Int,\n    val coins: Int,\n    val created: Int,\n    val created_at: String?,\n    val credit: String,\n    val description: String?,\n    val face: String,\n    val favorites: Int,\n    val from: String,\n    val instant_server: String,\n    val list: List,\n    val mid: Int,\n    val offsite: String,\n    val pages: Int,\n    val part: String,\n    val partname: String,\n    val pic: String,\n    val play: Int,\n    val review: Int,\n    val spid: Any,\n    val src: String,\n    val tag: Any,\n    val tid: Int,\n    val title: String,\n    val type: String,\n    val typename: String,\n    val vid: String,\n    val video_review: Int\n) {\n    data class List(\n        @SerializedName(\"0\")\n        val x: X0\n    ) {\n        data class X0(\n            val cid: Int,\n            val has_alias: Boolean,\n            val page: Int,\n            val part: String,\n            val type: String,\n            val vid: String,\n            val weblink: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/model/VideoRecoData.kt",
    "content": "package com.bilibili.lingxiao.play.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class VideoRecoData(\n    @SerializedName(\"code\")\n    val code: Int,\n    @SerializedName(\"list\")\n    val list: List<VideoInfo>,\n    @SerializedName(\"num\")\n    val num: Int,\n    @SerializedName(\"pages\")\n    val pages: Int\n) {\n    data class VideoInfo(\n        @SerializedName(\"aid\")\n        val aid: Int,\n        @SerializedName(\"author\")\n        val author: String,\n        @SerializedName(\"coins\")\n        val coins: Int,\n        @SerializedName(\"create\")\n        val create: String,\n        @SerializedName(\"credit\")\n        val credit: Int,\n        @SerializedName(\"description\")\n        val description: String,\n        @SerializedName(\"duration\")\n        val duration: String,\n        @SerializedName(\"favorites\")\n        val favorites: Int,\n        @SerializedName(\"last_recommend\")\n        val lastRecommend: List<LastRecommend>,\n        @SerializedName(\"mid\")\n        val mid: Int,\n        @SerializedName(\"pic\")\n        val pic: String,\n        @SerializedName(\"play\")\n        val play: Int,\n        @SerializedName(\"review\")\n        val review: Int,\n        @SerializedName(\"rights\")\n        val rights: Rights,\n        @SerializedName(\"subtitle\")\n        val subtitle: String,\n        @SerializedName(\"title\")\n        val title: String,\n        @SerializedName(\"typeid\")\n        val typeid: Int,\n        @SerializedName(\"typename\")\n        val typename: String,\n        @SerializedName(\"video_review\")\n        val videoReview: Int\n    ) {\n        data class Rights(\n            @SerializedName(\"autoplay\")\n            val autoplay: Int,\n            @SerializedName(\"bp\")\n            val bp: Int,\n            @SerializedName(\"download\")\n            val download: Int,\n            @SerializedName(\"elec\")\n            val elec: Int,\n            @SerializedName(\"hd5\")\n            val hd5: Int,\n            @SerializedName(\"is_cooperation\")\n            val isCooperation: Int,\n            @SerializedName(\"movie\")\n            val movie: Int,\n            @SerializedName(\"no_reprint\")\n            val noReprint: Int,\n            @SerializedName(\"pay\")\n            val pay: Int,\n            @SerializedName(\"ugc_pay\")\n            val ugcPay: Int,\n            @SerializedName(\"ugc_pay_preview\")\n            val ugcPayPreview: Int\n        )\n\n        data class LastRecommend(\n            @SerializedName(\"face\")\n            val face: String,\n            @SerializedName(\"mid\")\n            val mid: Int,\n            @SerializedName(\"msg\")\n            val msg: String,\n            @SerializedName(\"time\")\n            val time: Int,\n            @SerializedName(\"uname\")\n            val uname: String\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/ui/CommentDetailFragment.kt",
    "content": "package com.bilibili.lingxiao.play.ui\n\nimport android.graphics.Color\nimport android.graphics.drawable.ColorDrawable\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.util.DisplayMetrics\nimport android.util.Log\nimport android.view.*\nimport com.bilibili.lingxiao.HttpTrans\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.play.DoubleCommentView\nimport com.bilibili.lingxiao.play.adapter.CommentAdapter\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.utils.DateUtil\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.facebook.drawee.view.SimpleDraweeView\nimport kotlinx.android.synthetic.main.fragment_comment.view.*\nimport kotlinx.android.synthetic.main.fragment_comment_detail.*\nimport kotlinx.android.synthetic.main.fragment_fans_detail.*\nimport kotlinx.android.synthetic.main.item_comment.*\nimport kotlinx.android.synthetic.main.item_comment.view.*\nimport kotlinx.android.synthetic.main.layout_header_comment_detail.view.*\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass CommentDetailFragment : androidx.fragment.app.DialogFragment(){\n    var height = 100\n    private val levelImages = arrayOf(\n        R.drawable.mall_mine_vip_level_0,\n        R.drawable.mall_mine_vip_level_1,\n        R.drawable.mall_mine_vip_level_2,\n        R.drawable.mall_mine_vip_level_3,\n        R.drawable.mall_mine_vip_level_4,\n        R.drawable.mall_mine_vip_level_5,\n        R.drawable.mall_mine_vip_level_6\n    )\n    private lateinit var mAdapter: CommentAdapter\n    private var mCommentList = arrayListOf<CommentData.Reply>()\n    private lateinit var headerRootView:View\n    private var oid = 0\n    private var rootId = 0\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setStyle(androidx.fragment.app.DialogFragment.STYLE_NO_TITLE, R.style.fragmentDialog)\n    }\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        dialog!!.window.setWindowAnimations(R.style.contextMenuAnim)\n        //UIUtil.getUiComponent().inject(this)\n        val root = inflater.inflate(R.layout.fragment_comment_detail, container, false)\n        return root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        var recommendManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        recycerView.layoutManager = recommendManager\n        mAdapter = CommentAdapter(mCommentList)\n        headerRootView = View.inflate(context,R.layout.layout_header_comment_detail,null)\n        mAdapter.addHeaderView(headerRootView)\n        recycerView.adapter = mAdapter\n        image_close.setOnClickListener {\n            dismiss()\n        }\n        refresh.setOnRefreshListener {\n            getDoubleComment()\n        }\n    }\n\n    override fun onStart() {\n        super.onStart()\n        EventBus.getDefault().register(this)\n        var win = getDialog()!!.getWindow();\n        // 一定要设置Background，如果不设置，window属性设置无效\n        win.setBackgroundDrawable( ColorDrawable(Color.WHITE))\n        var  dm = DisplayMetrics()\n        getActivity()!!.getWindowManager().getDefaultDisplay().getMetrics(dm)\n        var params = win.getAttributes()\n        params.gravity = Gravity.BOTTOM\n        //使用ViewGroup.LayoutParams，以便Dialog 宽度充满整个屏幕\n        params.width =  ViewGroup.LayoutParams.MATCH_PARENT\n        params.height = height\n        win.setAttributes(params)\n    }\n\n    override fun onStop() {\n        super.onStop()\n        EventBus.getDefault().unregister(this)\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onGetCommentEvent(reply : CommentData.Reply){\n        EventBus.getDefault().removeStickyEvent(reply)\n        this.oid = reply.oid\n        this.rootId = reply.rpid\n        refresh.autoRefresh()\n    }\n\n    fun getDoubleComment(){\n        if (oid == 0 || rootId == 0){\n            refresh.finishRefresh()\n            refresh.finishLoadMoreWithNoMoreData()\n            return\n        }\n        var httpTrans :HttpTrans = HttpTrans(parentFragment!! as CommentFragment)\n        httpTrans.getDoubleComment(oid,rootId,20,object :HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                mCommentList.clear()\n                var lists = res as Array<*>\n                var reply = lists[0] as CommentData.Reply\n                //LogUtils.d(\"获取到的楼中楼回复${reply}\")\n                headerRootView.header.setImageURI(Uri.parse(reply.member.avatar))\n                headerRootView.username.setText(reply.member.uname)\n                headerRootView.comment_desc.setText(reply.content.message)\n                headerRootView.recommend_num.setText(StringUtil.getBigDecimalNumber(reply.like))\n                var level = reply.member.levelInfo.currentLevel\n                if (level > 6 || level < 0) level = 0\n                headerRootView.image_level.setImageResource(levelImages[level])\n                var floor = \"#\" +reply.floor + \"  \" + DateUtil.convertTimeToFormat(reply.ctime)\n                headerRootView.build_num.setText(floor)\n                headerRootView.text_count.setText(\"相关回复共${reply.rcount}条\")\n                reply.replies?.let {\n                    mAdapter.addData(it)\n                }\n                refresh.finishRefresh()\n                refresh.finishLoadMoreWithNoMoreData()\n            }\n\n            override fun onError(code: Int, desc: String?) {\n\n            }\n\n            override fun onCancel() {\n\n            }\n        })\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/ui/CommentFragment.kt",
    "content": "package com.bilibili.lingxiao.play.ui\n\nimport com.google.android.material.tabs.TabLayout\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.RelativeLayout\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.dagger.DaggerUiComponent\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.home.recommend.view.RecommendView\nimport com.bilibili.lingxiao.play.adapter.CommentAdapter\nimport com.bilibili.lingxiao.play.VideoPresenter\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.play.model.VideoDetailData\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.camera.lingxiao.common.app.BaseFragment\n\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport kotlinx.android.synthetic.main.fragment_comment.*\nimport kotlinx.android.synthetic.main.fragment_comment.view.*\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\nclass CommentFragment :BaseFragment(), RecommendView {\n    private var videoPresenter = VideoPresenter(this, this)\n    private lateinit var mAdapter: CommentAdapter\n    private var mCommentList = arrayListOf<CommentData.Reply>()\n\n    //@Inject\n    lateinit var  commentDetailFragment: CommentDetailFragment\n    private var next = 0 //评论游标\n    //private var allCount = 0 //评论的总共楼层\n    private var avNum = \"\"\n\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_comment\n\n    override fun initInject() {\n        super.initInject()\n        DaggerUiComponent.builder().build().inject(this)\n    }\n\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        var recommendManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        root.comment_recy.layoutManager = recommendManager\n        mAdapter = CommentAdapter(mCommentList)\n        root.comment_recy.adapter = mAdapter\n\n        root.refresh.setOnRefreshListener({\n            mCommentList.clear()\n            videoPresenter.getComment(avNum,0)\n        })\n        root.refresh.setOnLoadMoreListener({\n            videoPresenter.getComment(avNum,next)\n        })\n        var emptyView = View.inflate(context,R.layout.layout_empty,null)\n        var image = emptyView.findViewById<ImageView>(R.id.image_error)\n        image.setImageDrawable(resources.getDrawable(R.drawable.bilipay_common_error_tip))\n        mAdapter.setEmptyView(emptyView)\n\n        mAdapter.setOnItemChildClickListener { adapter, view, position ->\n            when(view.id){\n                R.id.more ->{\n                    val popwindowUtil = PopwindowUtil.PopupWindowBuilder(activity!!)\n                        .setView(R.layout.pop_comment)\n                        .setFocusable(true)\n                        .setTouchable(true)\n                        .setOutsideTouchable(true)\n                        .create()\n                    popwindowUtil.showAsDropDown(view,0,-view.getHeight());\n                    popwindowUtil.getView<View>(R.id.pop_add_blacklist)!!.setOnClickListener {\n                        popwindowUtil.dissmiss()\n                    }\n                    popwindowUtil.getView<View>(R.id.pop_report)!!.setOnClickListener {\n                            v -> popwindowUtil.dissmiss()\n                    }\n                }\n                R.id.ll_comment_replie ->{\n                    var act = activity as PlayActivity\n                    //act.showCommentDetail(\"\" + mCommentList[position].oid)\n                    commentDetailFragment = CommentDetailFragment()\n                    EventBus.getDefault().postSticky(mCommentList[position])\n                    commentDetailFragment.height = act.findViewById<RelativeLayout>(R.id.rl_video_detail).height\n                    commentDetailFragment.show(childFragmentManager,\"\" + mCommentList[position].oid)\n                }\n            }\n        }\n       \n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    /**\n     * 粘性事件\n     */\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    public fun onGetVideoDetail(data: RecommendData) {\n        avNum = data.param\n        refresh.autoRefresh(50)  //延迟获取评论数据\n        //videoPresenter.getComment(avNum,next)\n    }\n\n    override fun onGetRecommendData(recommendData: List<RecommendData>) {\n\n    }\n\n    override fun onGetVideoDetail(videoDetailData: VideoDetailData) {\n\n    }\n\n    override fun onGetVideoRecommend(videoRecoData: VideoRecoData) {\n\n    }\n    //var hotView = View.inflate(context,R.layout.item_hot_segment,null)\n    override fun onGetVideoComment(commentData: CommentData) {\n        //LogUtils.d(\"获取到评论：\"+commentData.toString())\n        next = commentData.cursor.next\n        if (next == 1){ //说明评论已经到底了\n            refresh.finishLoadMoreWithNoMoreData()\n            mAdapter.loadMoreEnd()\n        }\n        commentData.hots?.let {\n            for (hot in it){\n                mAdapter.addData(hot)\n            }\n            //随便放一条数据，用于显示热门评论\n            var empty = it.get(0)\n            var e = empty.copy(viewType = CommentData.Reply.SEGMENT)\n            mAdapter.hotSegmentPosition = it.size -1\n            mAdapter.addData(e)\n            var tabView: TabLayout = (activity as PlayActivity).findViewById(R.id.skin_tabLayout)\n            var tabLayout = tabView.getTabAt(1)\n            tabLayout?.text = \"评论 ${commentData.cursor.allCount}\"\n\n        }\n\n        if (commentData.replies == null){\n            refresh.finishRefresh()\n            refresh.finishLoadMore()\n        }else{\n            mAdapter.addData(commentData.replies)\n        }\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n        refresh.finishRefresh()\n        refresh.finishLoadMore()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/ui/IntroduceFragment.kt",
    "content": "package com.bilibili.lingxiao.play.ui\n\nimport android.graphics.drawable.BitmapDrawable\nimport android.graphics.drawable.ColorDrawable\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport android.util.Log\nimport android.view.Gravity\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.dagger.DaggerUiComponent\nimport com.bilibili.lingxiao.home.recommend.model.RecommendData\nimport com.bilibili.lingxiao.home.recommend.view.RecommendView\nimport com.bilibili.lingxiao.play.adapter.EndPageAdapter\nimport com.bilibili.lingxiao.play.adapter.VideoDetailAdapter\nimport com.bilibili.lingxiao.play.VideoPresenter\nimport com.bilibili.lingxiao.play.model.CommentData\nimport com.bilibili.lingxiao.play.model.VideoDetailData\nimport com.bilibili.lingxiao.play.model.VideoRecoData\nimport com.bilibili.lingxiao.utils.StringUtil\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.bilibili.lingxiao.widget.FoldableLayout\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport kotlinx.android.synthetic.main.fragment_introduce.*\nimport kotlinx.android.synthetic.main.fragment_introduce.view.*\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\nimport java.util.*\n\nclass IntroduceFragment :BaseFragment(), RecommendView {\n    val TAG = IntroduceFragment::class.java.simpleName\n    var mEndPageList = arrayListOf<EndPageData>()\n    var mRecommendList = arrayListOf<VideoRecoData.VideoInfo>()\n    lateinit var endPageAdapter: EndPageAdapter\n    lateinit var videoDetailAdapter: VideoDetailAdapter\n    private var videoPresenter = VideoPresenter(this, this)\n    override val contentLayoutId: Int\n        get() = R.layout.fragment_introduce\n\n    override fun initInject() {\n        super.initInject()\n        DaggerUiComponent.builder().build().inject(this)\n    }\n    override fun initWidget(root: View) {\n        super.initWidget(root)\n        var manager = androidx.recyclerview.widget.GridLayoutManager(context, 5)\n        root.endpage_recycler.layoutManager = manager\n        endPageAdapter = EndPageAdapter(R.layout.item_endpage, mEndPageList)\n        root.endpage_recycler.adapter = endPageAdapter\n        root.endpage_recycler.isNestedScrollingEnabled = false\n        //下面的推荐视频\n        var recommendManager =\n            androidx.recyclerview.widget.LinearLayoutManager(context)\n        root.recommend_recycler.layoutManager = recommendManager\n        videoDetailAdapter =\n            VideoDetailAdapter(R.layout.item_videodetail_recommend, mRecommendList)\n        root.recommend_recycler.adapter = videoDetailAdapter\n        root.recommend_recycler.isNestedScrollingEnabled = false\n\n        root.fold_layout.setCollapseListener(object :FoldableLayout.CollapseListener{\n            override fun onCollapseChanged(collapsed: Boolean) {\n                root.fold_message.changeStatus()\n            }\n        })\n        videoDetailAdapter.setOnItemChildClickListener { adapter, view, position ->\n            when(view.id){\n                R.id.more ->{\n                    val popwindowUtil = PopwindowUtil.PopupWindowBuilder(activity!!)\n                        .setView(R.layout.pop_watch_later)\n                        .setAnimationStyle(R.style.pop_watch_later_Anim)\n                        //.setBackgroundDrawable(ColorDrawable(resources.getColor(R.color.black_alpha_128)))\n                        .setFocusable(true)\n                        .setTouchable(true)\n                        .setOutsideTouchable(true)\n                        .create()\n                    var intArray = IntArray(2)\n                    view.getLocationInWindow(intArray)\n                    popwindowUtil.mContentView?.let {\n                        it.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)\n                        intArray[0] = UIUtil.getScreenWidth(context) -\n                                UIUtil.getDimen(R.dimen.pop_watch_later_xoffset) - it.measuredWidth\n                        intArray[1] -= UIUtil.getDimen(R.dimen.pop_watch_later_yoffset) + it.measuredHeight\n                        //popwindowUtil.showAsDropDown(view,0,-view.height,Gravity.LEFT or Gravity.TOP)\n                        popwindowUtil.showAtLocation(view,intArray[0],intArray[1],Gravity.NO_GRAVITY,0.6f)\n                        popwindowUtil.getView<View>(R.id.watch_later)!!.setOnClickListener {\n                            ToastUtil.show(\"已添加到稍后再看列表\")\n                            popwindowUtil.dissmiss()\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    data class EndPageData(val icon:Drawable,val message:String){\n\n    }\n\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    /**\n     * 粘性事件\n     */\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    public fun onGetVideoDetail(data: RecommendData) {\n        //针对sticky事件  eventBus会缓存在事件发射队列，\n        // 若是订阅关系已经存在则发射出去，但不会销毁。下次再次订阅，会继续接收上一次事件。所以这里接收到了需要移除\n        if (endPageAdapter.itemCount >= 5){\n            EventBus.getDefault().removeStickyEvent(data)\n            return\n        }\n        var recommend = EndPageData(\n            resources.getDrawable(R.drawable.ic_recommend),\n            \"\" + data.like\n        )\n        var dislike = EndPageData(\n            resources.getDrawable(R.drawable.ic_dislike),\n            \"不喜欢\"\n        )\n        var coin = EndPageData(\n            resources.getDrawable(R.drawable.ic_coin),\n            \"\" + data.coin\n        )\n        var collect = EndPageData(\n            resources.getDrawable(R.drawable.ic_collect),\n            \"\" + data.reply\n        )\n        var share = EndPageData(\n            resources.getDrawable(R.drawable.ic_share),\n            \"\" + data.share\n        )\n        endPageAdapter.addData(recommend)\n        endPageAdapter.addData(dislike)\n        endPageAdapter.addData(coin)\n        endPageAdapter.addData(collect)\n        endPageAdapter.addData(share)\n        img_head.setImageURI(Uri.parse(data.face))\n        username.setText(data.name)\n        //var tNames  = data.tname.split(\"·\")\n        data.tname?.let {\n            //type_name.setTitleText(it)\n            type_name.setText(it)\n        }\n        fensi.text = \"${StringUtil.getBigDecimalNumber(data.reply)}个粉丝\"\n        data.title?.let {\n            fold_layout.setTitleText(it)\n        }\n        damku_num.text = StringUtil.getBigDecimalNumber(data.danmaku)\n        av_num.text = \"   av${data.param}\"\n        videoPresenter.getDetailInfo(1,data.param)\n    }\n\n    override fun onGetRecommendData(recommendData: List<RecommendData>) {\n\n    }\n\n    override fun onGetVideoDetail(data: VideoDetailData) {\n        data.description?.let {\n            fold_message.setTitleText(it)\n        }\n        //Log.d(TAG,\"设置描述信息${data}\")\n        play_num.text = StringUtil.getBigDecimalNumber(data.play)\n        data.created_at?.let {\n            var dataArray = it.split(\"\\\\s+\")\n            if (dataArray.size > 1){\n                av_num.text = \"  ${dataArray[0] + av_num.text.toString()}\"\n            }else{\n                av_num.text = \"  ${it + av_num.text.toString()}\"\n            }\n        }\n        //先获取到视频信息，之后再获取推荐列表\n        val random = Random()\n        val ret = random.nextInt(100)\n        videoPresenter.getRecommendList(data.tid,ret)\n    }\n\n    override fun onGetVideoRecommend(videoRecoData: VideoRecoData) {\n        mRecommendList.addAll(videoRecoData.list)\n        videoDetailAdapter.notifyDataSetChanged()\n    }\n\n    override fun onGetVideoComment(commentData: CommentData) {\n\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun diamissDialog() {\n\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/play/ui/PlayActivity.kt",
    "content": "package com.bilibili.lingxiao.play.ui\n\nimport android.content.res.Configuration\nimport android.graphics.drawable.BitmapDrawable\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport android.util.Log\nimport android.view.*\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.home.live.adapter.PlayPagerAdapter\nimport com.bilibili.lingxiao.dagger.DaggerUiComponent\nimport com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView\nimport com.bilibili.lingxiao.play.model.VideoData\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.app.BaseFragment\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.camera.lingxiao.common.utills.PopwindowUtil\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport com.google.gson.Gson\nimport kotlinx.android.synthetic.main.activity_play.*\nimport kotlinx.android.synthetic.main.activity_setting.*\nimport java.lang.StringBuilder\nimport java.net.URLDecoder\nimport java.util.*\nimport javax.inject.Inject\n\nclass PlayActivity : BaseActivity() {\n    var tabArray = arrayOf(\"简介\",\"评论\")\n    var fragmentList:ArrayList<BaseFragment> = arrayListOf()\n\n    @Inject\n    lateinit var  introduceFragment: IntroduceFragment\n    @Inject\n    lateinit var  commentFragment: CommentFragment\n\n    lateinit var videoInfo:VideoData\n    val TAG = PlayActivity::class.java.simpleName\n    override val contentLayoutId: Int\n        get() = R.layout.activity_play\n\n    override fun initInject() {\n        super.initInject()\n        DaggerUiComponent.builder().build().inject(this)\n    }\n\n    override fun initBefore() {\n        UltimateBar.newTransparentBuilder()\n            .statusColor(resources.getColor(R.color.colorTrans))        // 状态栏颜色\n            .statusAlpha(100)               // 状态栏透明度\n            .applyNav(true)                // 是否应用到导航栏\n            .build(this)\n            .apply();\n    }\n    @Throws(NumberFormatException::class)\n    override fun initWidget() {\n        super.initWidget()\n        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n\n        var uri = intent.data\n        var player_preload = URLDecoder.decode(uri.getQueryParameter(\"player_preload\"),\"UTF-8\")\n        var player_width = URLDecoder.decode(uri.getQueryParameter(\"player_width\"),\"UTF-8\").toInt()\n        var player_height = URLDecoder.decode(uri.getQueryParameter(\"player_height\"),\"UTF-8\").toInt()\n        var player_rotate = URLDecoder.decode(uri.getQueryParameter(\"player_rotate\"),\"UTF-8\") //0为不旋转\n        videoInfo = Gson().fromJson(player_preload, VideoData::class.java)\n\n        UIUtil.getDensityString()\n        var layoutParams = ViewGroup.LayoutParams(play_view.width,\n            (player_width / (player_height+1.0f) * play_view.width).toInt())\n        Log.d(TAG,\"需要播放的video宽高：width: ${layoutParams.width}, heigth: ${layoutParams.height}, 信息：$videoInfo\")\n        //play_view.layoutParams = layoutParams\n\n        var danmakuUrl = \"http://comment.bilibili.com/${videoInfo.cid}.xml\"\n        var quilityPosition = getQuilityIndex()\n        play_view\n            .setLive(true)\n            .setVideoUrl(videoInfo.url)\n            .setSize(player_width,player_height)\n            .setQuilityText(videoInfo.support_description[quilityPosition])\n            .initDanMaKu(danmakuUrl,2000)\n            .startPlay()\n        play_view.setPlayerItemClickListener(object :SimplePlayerView.OnPlayerItemClickListener{\n            override fun onQuilityTextClick() {\n                showSupportQuilityWindow(quilityPosition)\n            }\n        })\n\n        for (name in tabArray){\n            skin_tabLayout.addTab(skin_tabLayout.newTab().setText(name))\n        }\n        fragmentList.add(introduceFragment)\n        fragmentList.add(commentFragment)\n        play_viewpager.adapter =\n            PlayPagerAdapter(supportFragmentManager, tabArray, fragmentList)\n        skin_tabLayout.setupWithViewPager(play_viewpager)\n        //setSupportActionBar(toolbar)\n        //toolbar.title = \"\"\n    }\n\n    /*fun showCommentDetail(fragmentTag:String){\n        var transaction = supportFragmentManager.beginTransaction()\n        transaction.setCustomAnimations(R.anim.pop_show,R.anim.pop_hide)\n        if (commentDetailFragment.isAdded){\n            transaction.show(commentDetailFragment).commitAllowingStateLoss()\n        }else{\n            transaction\n                .add(R.id.comment_detail,commentDetailFragment,fragmentTag)\n                .addToBackStack(fragmentTag)\n                .commitAllowingStateLoss()\n        }\n\n    }\n\n    fun hideCommentDetail(){\n        supportFragmentManager\n            .beginTransaction()\n            .setCustomAnimations(R.anim.pop_hide,R.anim.pop_show)\n            .remove(commentDetailFragment)\n            .commitAllowingStateLoss()\n    }*/\n\n\n    fun getQuilityIndex():Int{\n        var index = 0\n        for ((position,item) in videoInfo.support_quality.withIndex()){\n            if (item == videoInfo.quality){\n                index = position\n                break\n            }\n        }\n        return index\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        play_view.onConfigurationChang(newConfig)\n    }\n    override fun onResume() {\n        super.onResume()\n        play_view.onResume()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        play_view.onPause()\n    }\n    override fun onDestroy() {\n        super.onDestroy()\n        play_view.onDestory()\n        fragmentList.clear()\n    }\n\n    override fun onBackPressed() {\n        //super.onBackPressed()\n        play_view.onBackPressed()\n    }\n\n    private fun showSupportQuilityWindow(index:Int){\n        val popwindowUtil = PopwindowUtil.PopupWindowBuilder(this)\n            .setView(R.layout.popwindow_play_support_quality)\n            .size(LinearLayout.LayoutParams.WRAP_CONTENT.toFloat(), LinearLayout.LayoutParams.MATCH_PARENT.toFloat())\n            .setAnimationStyle(R.style.pop_player_support_quility)\n            .setFocusable(true)\n            .setTouchable(true)\n            .setOutsideTouchable(true)\n            .create()\n        popwindowUtil.showAtLocation(play_view,0,0, Gravity.RIGHT)\n        var recycerView = popwindowUtil.getView<androidx.recyclerview.widget.RecyclerView>(R.id.recyclerview)\n        recycerView?.layoutManager =\n            androidx.recyclerview.widget.GridLayoutManager(\n                this,\n                videoInfo.support_description.size,\n                androidx.recyclerview.widget.GridLayoutManager.HORIZONTAL,\n                false\n            )\n        recycerView?.adapter = PlayQuilityAdapter(R.layout.item_play_support_quility,videoInfo.support_description,index)\n    }\n\n    //data class QuilityData(var title:String,var choosed:Boolean)\n    inner class PlayQuilityAdapter(layoutId: Int,data: List<String>) :BaseQuickAdapter<String, BaseViewHolder>(layoutId,data) {\n        var defaultPosition:Int = 0\n        constructor(layoutId: Int,data: List<String>,position:Int):this(layoutId,data){\n            defaultPosition = position\n        }\n        override fun convert(helper: BaseViewHolder, item: String) {\n            var imageVip = helper.getView<ImageView>(R.id.image_vip)\n            if (item.contains(\"1080PP60\")){\n                imageVip.visibility = View.VISIBLE\n            }else{\n                imageVip.visibility = View.GONE\n            }\n            if (helper.position == defaultPosition){\n                helper.setTextColor(R.id.text_quility,mContext.resources.getColor(R.color.colorPrimary))\n            }\n            helper.setText(R.id.text_quility,item)\n            Log.d(TAG,\"视频质量：$item\")\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/user/LoginActivity.kt",
    "content": "package com.bilibili.lingxiao.user\n\nimport com.google.android.material.snackbar.Snackbar\nimport android.view.View\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.database.UserInfoTable\nimport com.bilibili.lingxiao.utils.ToastUtil\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.camera.lingxiao.common.utills.SpUtils\nimport com.google.gson.Gson\nimport com.hiczp.bilibili.api.app.model.MyInfo\nimport com.hiczp.bilibili.api.live.model.UserInfoInRoom\nimport kotlinx.android.synthetic.main.activity_login.*\nimport org.greenrobot.eventbus.EventBus\n\nclass LoginActivity : BaseActivity() ,LoginView{\n    private val mPresenter by lazy {\n        LoginPresenter(this,this)\n    }\n    override val contentLayoutId: Int\n        get() = R.layout.activity_login\n\n    override fun initWidget() {\n        super.initWidget()\n        setToolbarBack(login_toolbar)\n        login_toolbar.title = resources.getString(R.string.login_title)\n        login_et_password.setOnFocusChangeListener(object : View.OnFocusChangeListener{\n            override fun onFocusChange(v: View?, hasFocus: Boolean) {\n                if (hasFocus){\n                    login_img_22.setImageResource(R.drawable.ic_22_hide)\n                    login_img_33.setImageResource(R.drawable.ic_33_hide)\n                    login_line_between_password.setBackgroundColor(resources.getColor(R.color.colorPrimary))\n                    login_line_between_username.setBackgroundColor(resources.getColor(R.color.black_alpha_16))\n                }else{\n                    login_img_22.setImageResource(R.drawable.ic_22)\n                    login_img_33.setImageResource(R.drawable.ic_33)\n                    login_line_between_username.setBackgroundColor(resources.getColor(R.color.colorPrimary))\n                    login_line_between_password.setBackgroundColor(resources.getColor(R.color.black_alpha_16))\n                }\n            }\n        })\n\n        login.setOnClickListener {\n            val username = login_et_username.text.toString()\n            val password = login_et_password.text.toString()\n            if (username.isEmpty()){\n                Snackbar.make(it,resources.getString(R.string.input_username),\n                    Snackbar.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n            if (password.isEmpty()){\n                Snackbar.make(it,resources.getString(R.string.input_password),\n                    Snackbar.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n            showProgressDialog(\"登录中...\")\n            mPresenter.login(username,password)\n        }\n    }\n\n    override fun showDialog() {\n\n    }\n\n    override fun onLogin(success: Boolean, error: String?, user: MyInfo?) {\n        if (success){\n            ToastUtil.show(\"登录成功 ${user?.data?.name}\")\n            LogUtils.d(\"登录结果：$user\")\n\n            SpUtils.putString(applicationContext, GlobalProperties.USER_INFO, Gson().toJson(user))\n            EventBus.getDefault().post(user)\n            finish()\n        }else{\n            ToastUtil.show(\"登录失败 ${error}\")\n        }\n    }\n\n    override fun onLogout() {\n\n    }\n\n    override fun diamissDialog() {\n        cancleProgressDialog()\n    }\n\n    override fun showToast(text: String?) {\n        ToastUtil.show(text)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/user/LoginPresenter.kt",
    "content": "package com.bilibili.lingxiao.user\n\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.database.UserInfoTable\nimport com.bilibili.lingxiao.utils.UIUtil\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.utills.SpUtils\nimport com.google.gson.Gson\nimport com.hiczp.bilibili.api.BilibiliClient\nimport com.hiczp.bilibili.api.passport.model.LoginResponse\nimport com.hiczp.bilibili.api.retrofit.CommonResponse\nimport com.hiczp.bilibili.api.retrofit.exception.BilibiliApiException\nimport kotlinx.coroutines.runBlocking\n\nclass LoginPresenter(view: LoginView, activity: LoginActivity) :\n    BasePresenter<LoginView, LoginActivity>(view, activity) {\n    lateinit var commonResponse: CommonResponse\n\n    fun login(userName:String,password:String){\n        runBlocking{\n                val bilibiliClient = BilibiliClient().apply {\n                    try {\n                        var loginCache = SpUtils.getString(mActivity,GlobalProperties.LOGIN_RESPONSE,\"\")\n                        if (loginCache.isNotEmpty()){\n                            this.loginResponse = Gson().fromJson(loginCache,LoginResponse::class.java)\n                        }else{\n                            val response = login(userName, password)\n                            if (response.code == -105){\n                                //验证码错误\n                            }\n                            SpUtils.putString(mActivity,GlobalProperties.LOGIN_RESPONSE,Gson().toJson(response))\n                        }\n                        val myInfo = appAPI.myInfo().await()\n                        mView?.onLogin(true,null,myInfo)\n                        val info = UIUtil.getDataBase().userDao().findById(myInfo.data.mid)\n                        if (info != null){\n                            with(myInfo.data){\n                                UIUtil.getDataBase().userDao().update(\n                                    UserInfoTable(mid,birthday,coins,face,level,name,sex,sign,silence,telStatus,\n                                        official,vip))\n                            }\n                        }else{\n                            with(myInfo.data){\n                                UIUtil.getDataBase().userDao().insertUser(\n                                    UserInfoTable(mid,birthday,coins,face,level,name,sex,sign,silence,telStatus,\n                                        official,vip))\n                            }\n                        }\n                    }catch (ex :BilibiliApiException){\n                        ex.printStackTrace()\n                        mView?.onLogin(false, ex.message)\n                    }finally {\n                        mView?.diamissDialog()\n                    }\n                }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/user/LoginView.kt",
    "content": "package com.bilibili.lingxiao.user\n\nimport com.camera.lingxiao.common.app.BaseView\nimport com.hiczp.bilibili.api.app.model.MyInfo\n\ninterface LoginView :BaseView{\n    fun onLogin(success :Boolean,error :String? = null,user:MyInfo?=null)\n    fun onLogout()\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/utils/DateUtil.kt",
    "content": "package com.bilibili.lingxiao.utils\n\nimport java.text.SimpleDateFormat\nimport java.util.*\n\nobject DateUtil {\n    /**\n     * 返回unix时间戳 (1970年至今的秒数)\n     * @return\n     */\n    fun getUnixStamp(): Long {\n        return System.currentTimeMillis() / 1000\n    }\n\n    /**\n     * 得到昨天的日期\n     * @return\n     */\n    fun getYestoryDate(): String {\n        val calendar = Calendar.getInstance()\n        calendar.add(Calendar.DATE, -1)\n        val sdf = SimpleDateFormat(\"yyyy-MM-dd\")\n        return sdf.format(calendar.getTime())\n    }\n\n    /**\n     * 得到今天的日期\n     * @return\n     */\n    fun getTodayDate(): String {\n        val sdf = SimpleDateFormat(\"yyyy-MM-dd\")\n        return sdf.format(Date())\n    }\n\n    /**\n     * 时间戳转化为时间格式\n     * @param timeStamp\n     * @return\n     */\n    fun timeStampToStr(timeStamp: Long): String {\n        val sdf = SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\")\n        return sdf.format(timeStamp * 1000)\n    }\n\n    /**\n     * 得到日期   yyyy-MM-dd\n     * @param timeStamp  时间戳\n     * @return\n     */\n    fun formatDate(timeStamp: Long): String {\n        val sdf = SimpleDateFormat(\"yyyy-MM-dd\")\n        return sdf.format(timeStamp * 1000)\n    }\n\n    /**\n     * 得到时间  HH:mm:ss\n     * @param timeStamp   时间戳\n     * @return\n     */\n    fun getTime(timeStamp: Long): String? {\n        var time: String? = null\n        val sdf = SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\")\n        val date = sdf.format(timeStamp * 1000)\n        val split = date.split(\"\\\\s\".toRegex()).dropLastWhile({ it.isEmpty() }).toTypedArray()\n        if (split.size > 1) {\n            time = split[1]\n        }\n        return time\n    }\n\n    /**\n     * 将一个时间戳转换成提示性时间字符串，如刚刚，1秒前\n     *\n     * @param timeStamp\n     * @return\n     */\n    fun convertTimeToFormat(timeStamp: Long): String {\n        val curTime = System.currentTimeMillis() / 1000.toLong()\n        val time = curTime - timeStamp\n\n        return if (time < 60 && time >= 0) {\n            \"刚刚\"\n        } else if (time >= 60 && time < 3600) {\n            (time / 60).toString() + \"分钟前\"\n        } else if (time >= 3600 && time < 3600 * 24) {\n            (time / 3600).toString() + \"小时前\"\n        } else if (time >= 3600 * 24 && time < 3600 * 24 * 30) {\n            (time / 3600 / 24).toString() + \"天前\"\n        } else if (time >= 3600 * 24 * 30 && time < 3600 * 24 * 30 * 12) {\n            (time / 3600 / 24 / 30).toString() + \"个月前\"\n        } else if (time >= 3600 * 24 * 30 * 12) {\n            (time / 3600 / 24 / 30 / 12).toString() + \"年前\"\n        } else {\n            \"刚刚\"\n        }\n    }\n\n    /**\n     * 将一个时间戳转换成提示性时间字符串，(多少分钟)\n     *\n     * @param timeStamp\n     * @return\n     */\n    fun timeStampToFormat(timeStamp: Long): String {\n        val curTime = System.currentTimeMillis() / 1000.toLong()\n        val time = curTime - timeStamp\n        return (time / 60).toString() + \"\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/utils/MD5Util.kt",
    "content": "package com.bilibili.lingxiao.utils\n\nimport java.security.MessageDigest\n\nobject MD5Util{\n    fun getMD5(str :String): String{\n        val md5 = MessageDigest.getInstance(\"MD5\")\n        md5.update(str.toByteArray())\n        val m = md5.digest()//加密\n        return getString(m)\n    }\n\n    private fun getString(b: ByteArray): String {\n        val buf = StringBuffer()\n        for (i in b.indices) {\n            var a = b[i].toInt()\n            if (a < 0)\n                a += 256\n            if (a < 16)\n                buf.append(\"0\")\n            buf.append(Integer.toHexString(a))\n\n        }\n        return buf.toString()  //32位\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/utils/StringUtil.kt",
    "content": "package com.bilibili.lingxiao.utils\n\nimport java.math.BigDecimal\n\nobject StringUtil {\n\n    /**\n     * 将数字转换为带万的\n     */\n    fun getBigDecimalNumber(num :Int?): String{\n        if (num == null) return \"-\"\n        if (num > 1000 && num < 1000000){\n            var float = num / 1000.0\n            val b = BigDecimal(float)\n            val f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).toFloat()  //表明四舍五入，保留两位小数\n            return f1.toString() + \"万\"\n        }else if (num > 1000000){\n            var float = num / 1000000.0\n            val b = BigDecimal(float)\n            val f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).toFloat()\n            return f1.toString() + \"百万\"\n        }\n        return num.toString()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/utils/ToastUtil.kt",
    "content": "package com.bilibili.lingxiao.utils\n\nimport com.google.android.material.snackbar.Snackbar\nimport android.view.View\nimport android.widget.Toast\nobject ToastUtil {\n    private var mToast: Toast? = null\n\n    fun show(msg: String?) {\n        if (mToast == null) {\n            mToast = Toast.makeText(UIUtil.getContext(), msg, Toast.LENGTH_SHORT)\n        } else {\n            mToast?.setText(msg)\n        }\n        mToast?.show()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/utils/UIUtil.kt",
    "content": "package com.bilibili.lingxiao.utils\n\nimport android.content.Context\nimport android.util.DisplayMetrics\nimport android.view.WindowManager\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\nimport com.bilibili.lingxiao.dagger.DaggerUiComponent\nimport com.bilibili.lingxiao.dagger.UiComponent\nimport com.bilibili.lingxiao.database.db.AppDatabase\n\nobject UIUtil {\n    var mContext :Context? = null\n    fun init(context: Context) {\n        mContext = context\n    }\n    fun getContext() :Context{\n        return mContext!!\n    }\n    fun getScreenWidth(context: Context?): Int {\n        val wm = context?.getSystemService(Context.WINDOW_SERVICE) as WindowManager\n        val outMetrics = DisplayMetrics()\n        wm.defaultDisplay.getMetrics(outMetrics)\n        return outMetrics.widthPixels\n    }\n\n    fun getScreenHeight(context: Context?): Int {\n        val wm = context?.getSystemService(Context.WINDOW_SERVICE) as WindowManager\n        val outMetrics = DisplayMetrics()\n        wm.defaultDisplay.getMetrics(outMetrics)\n        return outMetrics.heightPixels\n    }\n\n    /**\n     * 获取屏幕dpi\n     */\n    fun getDensityString(): String {\n        val displayMetrics = getContext().getResources().getDisplayMetrics()\n        when (displayMetrics.densityDpi) {\n            DisplayMetrics.DENSITY_LOW -> return \"ldpi\"\n            DisplayMetrics.DENSITY_MEDIUM -> return \"hdpi\"  //mdpi不支持了\n            DisplayMetrics.DENSITY_HIGH -> return \"hdpi\"\n            DisplayMetrics.DENSITY_XHIGH -> return \"xhdpi\"\n            DisplayMetrics.DENSITY_XXHIGH,\n            DisplayMetrics.DENSITY_440,\n            DisplayMetrics.DENSITY_420,\n            DisplayMetrics.DENSITY_400 -> return \"xxhdpi\"\n            DisplayMetrics.DENSITY_XXXHIGH -> return \"xxxhdpi\"\n            DisplayMetrics.DENSITY_TV -> return \"tvdpi\"\n            //else -> return displayMetrics.densityDpi.toString()\n            else -> return \"xxhdpi\"\n        }\n    }\n\n    fun getUiComponent(): UiComponent {\n        return DaggerUiComponent.builder().build()\n    }\n\n    fun getMipMapId(context: Context,iconName:String): Int{\n        val mipmapId = context.getResources().getIdentifier(iconName, \"mipmap\",\n            context.getPackageName())\n        return mipmapId\n    }\n\n    fun getDimenId(context: Context,dimenName:String): Int{\n        //deimens资源 id 获取\n        val dimenId = context.getResources().getIdentifier(dimenName, \"dimen\",\n            context.getPackageName())\n        return dimenId\n    }\n\n\n    //dip和px转换\n    fun dip2px(dip: Float): Float {\n        val density = getContext().resources.displayMetrics.density\n        return (dip * density + 0.5f)\n    }\n    fun px2dip(px: Int): Float {\n        val denstty = getContext().resources.displayMetrics.density\n        return px / denstty\n    }\n\n    /**\n     * 将px值转换为sp值，保证文字大小不变\n     */\n    fun px2sp(pxValue: Float): Int {\n        val fontScale = getContext().resources.displayMetrics.scaledDensity\n        return (pxValue / fontScale + 0.5f).toInt()\n    }\n\n    /**\n     * 将sp值转换为px值，保证文字大小不变\n     *\n     * @param spValue\n     * （DisplayMetrics类中属性scaledDensity）\n     * @return\n     */\n    fun sp2px(spValue: Float): Int {\n        val fontScale = getContext().resources.displayMetrics.scaledDensity\n        return (spValue * fontScale + 0.5f).toInt()\n    }\n\n    //获取尺寸\n    fun getDimen(id: Int): Int {\n        return getContext().resources.getDimensionPixelSize(id)\n    }\n\n    var db:AppDatabase?=null\n    fun getDataBase(): AppDatabase{\n        if (db == null){\n            db = Room.databaseBuilder(\n                getContext(),\n                AppDatabase::class.java, \"database-bilibili\"\n            ).allowMainThreadQueries().build()\n        }\n        return db!!\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/web/WebActivity.kt",
    "content": "package com.bilibili.lingxiao.web\n\nimport android.app.Activity\nimport android.net.Uri\nimport android.os.Bundle\nimport com.bilibili.lingxiao.GlobalProperties\nimport com.bilibili.lingxiao.R\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport kotlinx.android.synthetic.main.activity_web.*\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.opengl.Visibility\nimport android.util.Log\nimport android.view.View\nimport com.camera.lingxiao.common.rxbus.SkinChangedEvent\nimport com.tencent.smtt.sdk.WebChromeClient\nimport com.tencent.smtt.sdk.WebSettings\nimport com.tencent.smtt.sdk.WebView\nimport com.tencent.smtt.sdk.WebViewClient\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\n\n\nclass WebActivity : BaseActivity() {\n    val TAG = WebActivity::class.java.simpleName\n\n    override val contentLayoutId: Int\n        get() = R.layout.activity_web\n\n    override fun initBefore() {\n        super.initBefore()\n        UltimateBar.newTransparentBuilder()\n            .statusColor(getResources().getColor(R.color.trans))        // 状态栏颜色\n            .statusAlpha(100)               // 状态栏透明度\n            .applyNav(false)                // 是否应用到导航栏\n            .build(this)\n            .apply();\n    }\n    override fun isRegisterEventBus(): Boolean {\n        return true\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)\n    fun onSkinChanged(event : SkinChangedEvent){\n        UltimateBar.newColorBuilder()\n            .statusColor(event.color)   // 状态栏颜色\n            .applyNav(true)             // 是否应用到导航栏\n            .navColor(event.color)         // 导航栏颜色\n            .build(this)\n            .apply()\n\n    }\n    override fun initWidget() {\n        super.initWidget()\n        setSupportActionBar(toolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.setDisplayShowTitleEnabled(false)\n        val uri = intent.getStringExtra(\"uri\")\n        if (intent.hasExtra(\"image\")){\n            val image = intent.getStringExtra(\"image\")\n            image_bar.setImageURI(Uri.parse(image))\n        }\n        if (intent.hasExtra(\"title\")){\n            val title = intent.getStringExtra(\"title\")\n            toolbar.setTitle(title)\n        }\n        initWebView()\n        var extHeader = HashMap<String, String>()\n        extHeader.put(\n            \"User-Agent\",\n            GlobalProperties.USER_AGENT\n        )\n        webview.loadUrl(uri)\n        webview.webViewClient = object : WebViewClient(){\n            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {\n                //val hit = view.getHitTestResult()\n                if (\"https\".equals(Uri.parse(url).scheme,true)) {\n                    view.loadUrl(url)\n                    Log.e(TAG,\"请求地址：\" + url)\n                }else{\n                    if (\"bilibili\".equals(Uri.parse(url).scheme,true)){\n                        return true\n                    }\n                }\n                //返回true代表在当前webview中打开，返回false表示打开浏览器\n                return super.shouldOverrideUrlLoading(view, url)\n            }\n\n            override fun onPageStarted(p0: WebView?, p1: String?, p2: Bitmap?) {\n                super.onPageStarted(p0, p1, p2)\n                progressBar.visibility = View.VISIBLE\n            }\n            override fun onPageFinished(p0: WebView?, p1: String?) {\n                super.onPageFinished(p0, p1)\n                progressBar.visibility = View.GONE\n            }\n        }\n\n        webview.webChromeClient = object :WebChromeClient(){\n            override fun onProgressChanged(webview: WebView?, progress: Int) {\n                super.onProgressChanged(webview, progress)\n                progressBar.progress = progress\n            }\n        }\n    }\n\n    private fun initWebView() {\n        //声明WebSettings子类\n        val webSettings = webview.getSettings()\n        //如果访问的页面中要与Javascript交互，则webview必须设置支持Javascript\n        webSettings.setJavaScriptEnabled(true)\n        //webSettings.setUserAgentString(GlobalProperties.USER_AGENT);\n        // 若加载的 html 里有JS 在执行动画等操作，会造成资源浪费（CPU、电量）\n        // 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可\n        //支持插件\n        //webSettings.setPluginsEnabled(true);\n        //设置自适应屏幕，两者合用\n        webSettings.setUseWideViewPort(true) //将图片调整到适合webview的大小\n        webSettings.setLoadWithOverviewMode(true) // 缩放至屏幕的大小\n        //缩放操作\n        webSettings.setSupportZoom(true) //支持缩放，默认为true。是下面那个的前提。\n        webSettings.setBuiltInZoomControls(true) //设置内置的缩放控件。若为false，则该WebView不可缩放\n        webSettings.setDisplayZoomControls(false) //隐藏原生的缩放控件\n        //其他细节操作\n        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK) //关闭webview中缓存\n        webSettings.setAllowFileAccess(true) //设置可以访问文件\n        webSettings.setJavaScriptCanOpenWindowsAutomatically(true) //支持通过JS打开新窗口\n        webSettings.setLoadsImagesAutomatically(true) //支持自动加载图片\n        webSettings.setDefaultTextEncodingName(\"utf-8\")//设置编码格式\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/ArcView.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.content.Context\nimport android.graphics.*\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport android.util.AttributeSet\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport skin.support.content.res.SkinCompatResources\nimport skin.support.widget.SkinCompatHelper\nimport skin.support.widget.SkinCompatSupportable\n\nclass ArcView  @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    : View(context, attrs, defStyleAttr), SkinCompatSupportable {\n    var mWidth = 0\n    var mHeight = 0\n    var mRadius = 0.0f\n    lateinit var mRect:Rect\n    lateinit var mCircleCenterPoint:PointF\n    lateinit var mPaint:Paint\n    private var mPrimaryColorId = SkinCompatHelper.INVALID_ID\n\n    init {\n        val a = context.obtainStyledAttributes(\n            attrs, R.styleable.ArcView,\n            defStyleAttr, 0\n        )\n        if (a.hasValue(R.styleable.ArcView_arcbackground)) {\n            mPrimaryColorId = a.getResourceId(\n                R.styleable.ArcView_arcbackground,\n                SkinCompatHelper.INVALID_ID\n            )\n        }\n\n        mRect = Rect()\n        mCircleCenterPoint = PointF()\n        mPaint = Paint()\n        mPaint.color = a.getColor(R.styleable.ArcView_arcbackground,resources.getColor(R.color.colorPrimary))\n        mPaint.isAntiAlias = true\n\n        a.recycle()\n        applySkin()\n    }\n\n    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {\n        super.onSizeChanged(w, h, oldw, oldh)\n        mWidth = w\n        mHeight = h\n        mRadius = w * 2 * 1.0f\n\n        mRect.left = 0\n        mRect.right = w\n        mRect.top = 0\n        mRect.bottom = h\n\n        mCircleCenterPoint.x = w * 1.0f / 2\n        mCircleCenterPoint.y = h * 1.0f - mRadius\n\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n        val canvasWidth = canvas.width * 1.0f\n        val canvasHeight = canvas.height * 1.0f\n        val layerId = canvas.saveLayer(0f,0f, canvasWidth, canvasHeight, null, Canvas.ALL_SAVE_FLAG)\n        canvas.drawCircle(mCircleCenterPoint.x,mCircleCenterPoint.y,mRadius,mPaint)\n        //设置PorterDuffXfermode\n        mPaint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN))\n\n        canvas.drawRect(mRect,mPaint)\n        mPaint.setXfermode(null)\n        canvas.restoreToCount(layerId)\n    }\n\n\n    override fun applySkin() {\n        mPrimaryColorId = SkinCompatHelper.checkResourceId(mPrimaryColorId)\n        if (mPrimaryColorId != SkinCompatHelper.INVALID_ID) {\n            val primaryColor = SkinCompatResources.getColor(context, mPrimaryColorId)\n            mPaint.color = primaryColor\n            invalidate()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/ColorTextView.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.content.Context\nimport android.graphics.Paint\nimport android.graphics.Rect\nimport androidx.appcompat.widget.AppCompatTextView\nimport android.util.AttributeSet\nimport android.widget.TextView\nimport android.graphics.Color.parseColor\nimport android.util.TypedValue\nimport com.bilibili.lingxiao.widget.ColorTextView\nimport android.content.res.TypedArray\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport com.bilibili.lingxiao.R\nimport java.util.*\nimport android.view.View\nimport android.graphics.RectF\nimport com.bilibili.lingxiao.utils.UIUtil\n\n\nclass ColorTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    : AppCompatTextView(context, attrs, defStyleAttr){\n    /**\n     * 文本内容\n     */\n    private var mTitleText: String = \"\"\n    /**\n     * 文本的颜色\n     */\n    private var mTitleTextColor: Int = 0\n    /**\n     * 文本的大小\n     */\n    private var mTitleTextSize: Float = 0f\n\n    private var ctvBackgroundColor: Int = 0\n\n    /**\n     * 圆角大小\n     */\n    private var mCornerSize: Float = 0f\n\n    /**\n     * 绘制时控制文本绘制的范围\n     */\n    private lateinit var mtitleBound: Rect\n    private var textWidthMargin:Int = 10\n    private lateinit var mtitlePaint: Paint\n    private lateinit var mBackgroundPaint: Paint\n    private val colors = arrayOf(\n        \"#4CAF50\",\n        \"#E57373\",\n        \"#64B5F6\",\n        \"#7986CB\",\n        \"#9575CD\",\n        \"#F06292\",\n        \"#ffb74d\",\n        \"#4db6ac\",\n        \"#4fc3f7\",\n        \"#4dd0e1\"\n    )\n\n    init {\n\n        /**\n         * 获得我们所定义的自定义样式属性\n         */\n        val a = context.theme.obtainStyledAttributes(attrs, R.styleable.ColorTextView, defStyleAttr, 0)\n        val n = a.indexCount\n        for (i in 0 until n) {\n            val attr = a.getIndex(i)\n            when (attr) {\n\n                R.styleable.ColorTextView_ctvText -> mTitleText = a.getString(attr)\n                R.styleable.ColorTextView_ctvTextColor ->\n                    // 默认颜色设置为黑色\n                    mTitleTextColor = a.getColor(attr, Color.BLACK)\n                R.styleable.ColorTextView_ctvTextSize ->\n                    // 默认设置为16sp，TypeValue也可以把sp转化为px\n                    mTitleTextSize = a.getDimensionPixelSize(attr, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16f, resources.displayMetrics).toInt()).toFloat()\n                R.styleable.ColorTextView_ctvBackground ->\n                    //默认为白色\n                    ctvBackgroundColor = a.getColor(attr, Color.WHITE)\n                R.styleable.ColorTextView_ctvCornerSize ->\n                    //默认圆角为0\n                    mCornerSize = a.getInteger(attr, 0).toFloat()\n\n            }\n        }\n        a.recycle()\n\n        //val random = Random()\n        //val ret = random.nextInt(colors.size - 1)\n        //ctvBackgroundColor = Color.parseColor(colors[ret])\n        mtitlePaint = Paint()\n        mtitlePaint.setTextSize(mTitleTextSize.toFloat())\n        mtitleBound = Rect()\n        mtitlePaint.getTextBounds(mTitleText, 0, mTitleText.length, mtitleBound)\n\n        mBackgroundPaint = Paint(Paint.FILTER_BITMAP_FLAG)\n        mBackgroundPaint.isAntiAlias = true\n        mBackgroundPaint.color = ctvBackgroundColor\n    }\n\n    fun setCtvBackgroundColor(ctvBackgroundColor: Int) {\n        this.ctvBackgroundColor = ctvBackgroundColor\n    }\n\n    override fun setText(text: CharSequence?, type: BufferType?) {\n        super.setText(text, type)\n        this.mTitleText = text.toString()\n    }\n\n    /*fun setTitleText(text: String) {\n        this.mTitleText = text\n    }*/\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        val widthMode = View.MeasureSpec.getMode(widthMeasureSpec)\n        val widthSize = View.MeasureSpec.getSize(widthMeasureSpec)\n        val heightMode = View.MeasureSpec.getMode(heightMeasureSpec)\n        val heightSize = View.MeasureSpec.getSize(heightMeasureSpec)\n        var width: Int\n        var height: Int\n        if (widthMode == View.MeasureSpec.EXACTLY) {\n            width = widthSize + textWidthMargin * 2\n        } else {\n            mtitlePaint.setTextSize(mTitleTextSize)\n            mtitlePaint.getTextBounds(mTitleText, 0, mTitleText.length, mtitleBound)\n            //measureText 是字体整体宽度 getTextBounds获得的是字符串的最小矩形区域\n            width = Math.min(paddingLeft + mtitleBound.width() + paddingRight + textWidthMargin * 2, widthSize)\n        }\n\n        if (heightMode == View.MeasureSpec.EXACTLY) {\n            height = heightSize\n        } else {\n            mtitlePaint.setTextSize(mTitleTextSize)\n            mtitlePaint.getTextBounds(mTitleText, 0, mTitleText.length, mtitleBound)\n            val desired = paddingTop + mtitleBound.height() + paddingBottom\n            height = Math.max(desired, heightSize)\n        }\n        setMeasuredDimension(width, height)\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n        val rec = RectF(0f, 0f, measuredWidth.toFloat() , measuredHeight.toFloat())\n        canvas.drawRoundRect(rec, mCornerSize, mCornerSize, mBackgroundPaint)\n        mtitlePaint.color = mTitleTextColor\n        val fontMetrics = mtitlePaint.fontMetricsInt\n        val baseline = (measuredHeight - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top\n        canvas.drawText(mTitleText, paddingLeft.toFloat() + textWidthMargin.toFloat() , baseline.toFloat(), mtitlePaint)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/FindLineView.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.content.Context\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport com.bilibili.lingxiao.R\nimport kotlinx.android.synthetic.main.find_line_view.view.*\n\nclass FindLineView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    : ConstraintLayout(context, attrs, defStyleAttr){\n    var resourceId = -1\n    var title = \"\"\n    var showIcon = false\n    init {\n        LayoutInflater.from(context).inflate(R.layout.find_line_view,this,true)\n        var typedArray = context.obtainStyledAttributes(attrs,R.styleable.FindLineView)\n        if (typedArray.hasValue(R.styleable.FindLineView_src)){\n            resourceId = typedArray.getResourceId(R.styleable.FindLineView_src,R.drawable.ic_group)\n\n        }\n        if (typedArray.hasValue(R.styleable.FindLineView_text)){\n            title = typedArray.getString(R.styleable.FindLineView_text)\n        }\n        showIcon = typedArray.getBoolean(R.styleable.FindLineView_showRightIcon,false)\n        typedArray.recycle()\n    }\n\n    override fun onFinishInflate() {\n        super.onFinishInflate()\n        if (resourceId > 0) image_head.setImageResource(resourceId)\n        if (title.isNotEmpty()) text_title.text = title\n        if (!showIcon){\n            image_right.visibility = View.GONE\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/FoldableLayout.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport androidx.annotation.IdRes\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageButton\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.bilibili.lingxiao.R\nimport com.camera.lingxiao.common.utills.LogUtils\n\n\n\n/**\n * 可折叠的Layout\n * @author lingxiao\n */\nclass FoldableLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    : LinearLayout(context, attrs, defStyleAttr) ,View.OnClickListener{\n\n    //文字显示的最大行数\n    private val MAX_COLLAPSED_LINES = 1\n    //默认动画播放时长\n    private val DEFAULT_ANIM_DURATION = 300\n\n    //开关样式 默认为imagebutton\n    private val EXPAND_INDICATOR_IMAGE_BUTTON = 0\n    private val EXPAND_INDICATOR_TEXT_VIEW = 1\n    private val DEFAULT_TOGGLE_TYPE = EXPAND_INDICATOR_IMAGE_BUTTON\n\n    var mMaxCollapsedLines:Int = MAX_COLLAPSED_LINES\n    var mAnimationDuration:Int = DEFAULT_ANIM_DURATION\n    //字体总高度\n    var mTextHeightWithMaxLines = 0\n\n    @IdRes\n    var mFirstViewId = R.id.expand_textview\n    @IdRes\n    var mExpandCollapseToggleId = R.id.expand_collapse\n    @IdRes\n    var mMessageViewId = R.id.expand_message_textview  //放置内容的id\n\n    var mTextView:TextView? = null\n    var mToggleView:View? = null\n    var mMessageTextView:TextView? = null\n\n    private var foldClickable = true //是否点击可折叠\n    private var mCollapsed = true // 默认是被折叠了的\n    private var mRelayout: Boolean = false\n    private var mMarginBetweenTxtAndBottom: Int = 0\n    private var mCollapsedHeight: Int = 0\n    private var mUpdateListener: ValueAnimator.AnimatorUpdateListener? = null\n    private var mAnimatorListener: AnimatorListenerAdapter? = null\n    private var mExpandIndicatorController: ExpandIndicatorController? = null\n    private var startHeight = 0\n    private var endHeight = 0\n    init {\n        var typedArray = context.obtainStyledAttributes(attrs,R.styleable.FoldableLayout)\n        mMaxCollapsedLines = typedArray.getInt(R.styleable.FoldableLayout_maxCollapsedLines,MAX_COLLAPSED_LINES)\n        mAnimationDuration = typedArray.getInt(R.styleable.FoldableLayout_animDuration,DEFAULT_ANIM_DURATION)\n        mFirstViewId = typedArray.getResourceId(R.styleable.FoldableLayout_textViewId,R.id.expand_textview)\n        mExpandCollapseToggleId = typedArray.getResourceId(R.styleable.FoldableLayout_expandCollapseToggleId,R.id.expand_collapse)\n        mMessageViewId = typedArray.getResourceId(R.styleable.FoldableLayout_messageViewId,R.id.expand_message_textview)\n        foldClickable = typedArray.getBoolean(R.styleable.FoldableLayout_foldClickable,true)\n\n        mExpandIndicatorController = setupExpandController(context,typedArray)\n        typedArray.recycle()\n        orientation = VERTICAL\n        initListener()\n    }\n\n    override fun setOrientation(orientation: Int) {\n        if (HORIZONTAL == orientation) {\n            throw IllegalArgumentException(\"FoldableLayout only supports Vertical Orientation.\")\n        }\n        super.setOrientation(orientation)\n    }\n\n    /**\n     * 当View中所有的子控件均被映射成xml后触发，即调用setContentView之后就会调用onFinishInflate这个方法\n     */\n    override fun onFinishInflate() {\n        super.onFinishInflate()\n        mTextView = findViewById(mFirstViewId)\n        mToggleView = findViewById(mExpandCollapseToggleId)\n        mMessageTextView = findViewById(mMessageViewId)\n\n        if (foldClickable){\n            mTextView?.setOnClickListener(this)\n            mToggleView?.let {\n                it.setOnClickListener(this)\n                mExpandIndicatorController?.setView(it)\n            }\n        }\n\n        mExpandIndicatorController?.changeState(mCollapsed)\n    }\n\n    private var mMessageTextHeight = 0\n    private var mMarginMessageTextAndBottom = 0\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        if (!mRelayout){\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n            return\n        }\n        mRelayout = false\n        mToggleView?.visibility = GONE\n        mTextView?.maxLines = Int.MAX_VALUE\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        //单行不显示\n        /*if (mTextView!!.lineCount <= mMaxCollapsedLines){\n            return\n        }*/\n        mTextHeightWithMaxLines = getRealTextViewHeight(mTextView!!)\n        if (mCollapsed){\n            mTextView!!.maxLines = mMaxCollapsedLines\n        }\n        mToggleView?.setVisibility(View.VISIBLE)\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        if (mCollapsed){\n            mTextView?.post({\n                //标题和底部的距离，动画范围在这个差值里\n                mMarginBetweenTxtAndBottom = height - mTextView!!.height\n            })\n            mCollapsedHeight = measuredHeight\n        }\n\n    }\n\n\n    /**\n     * 获取字体总高度\n     */\n    private  fun getRealTextViewHeight(textView: TextView): Int {\n        var textHeight = textView.layout.getLineTop(textView.lineCount)\n        var padding = textView.compoundPaddingTop + textView.compoundPaddingBottom\n        return textHeight + padding\n    }\n\n    fun startAnimation(){\n        val animator = ValueAnimator\n            .ofFloat(0f, 1f)\n            .setDuration(mAnimationDuration.toLong())\n        animator.addUpdateListener(mUpdateListener)\n        animator.addListener(mAnimatorListener)\n        animator.start()\n    }\n\n    private fun initListener(){\n        mUpdateListener = ValueAnimator.AnimatorUpdateListener { animation ->\n            var interpolatedTime = animation.animatedValue as Float\n            //从startHeight->endHeight\n            val newHeight = (endHeight - startHeight) * interpolatedTime + startHeight\n            mTextView?.maxHeight = (newHeight - mMarginBetweenTxtAndBottom).toInt()\n            //val titleHeight = (mTextHeightWithMaxLines - mMarginBetweenTxtAndBottom) * interpolatedTime + mMarginBetweenTxtAndBottom\n            //mTextView?.maxHeight = titleHeight.toInt()\n            //mMessageTextView?.maxHeight = (newHeight - height + mMessageTextHeight).toInt()\n            this@FoldableLayout.getLayoutParams().height = newHeight.toInt()\n            this@FoldableLayout.requestLayout()\n            LogUtils.d(\"Foldable变化：${mMarginBetweenTxtAndBottom}\")\n        }\n\n        mAnimatorListener = object : AnimatorListenerAdapter() {\n            override fun onAnimationEnd(animation: Animator) {\n                super.onAnimationEnd(animation)\n                //动画播放完毕\n            }\n\n        }\n    }\n\n    fun setTitleText(title: CharSequence){\n        mRelayout = true\n        mTextView?.text = title\n        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT\n        requestLayout()\n    }\n    fun setMessageText(message: CharSequence){\n        mMessageTextView?.text = message\n        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT\n        requestLayout()\n    }\n    override fun onClick(v: View?) {\n        changeStatus()\n    }\n\n    fun changeStatus(){\n        mToggleView?.let {\n            if (it.visibility != visibility){\n                return\n            }\n        }\n        mCollapsed = !mCollapsed\n        mCollapseListener?.onCollapseChanged(mCollapsed)\n        mExpandIndicatorController?.changeState(mCollapsed)\n        startHeight = height\n        if (mCollapsed){\n            endHeight = mCollapsedHeight\n        }else{\n            //真正的高度 + 被折叠的高度 + message的高度\n            endHeight = height + mTextHeightWithMaxLines - mTextView!!.height\n        }\n        startAnimation()\n    }\n\n    fun setupExpandController(context: Context,typedArray: TypedArray): ExpandIndicatorController{\n        val expandToggleType = typedArray.getInt(R.styleable.FoldableLayout_expandToggleType, DEFAULT_TOGGLE_TYPE)\n        var expandIndicatorController: ExpandIndicatorController? = null\n        when(expandToggleType){\n            EXPAND_INDICATOR_IMAGE_BUTTON->{\n                var expandDrawable = typedArray.getDrawable(R.styleable.FoldableLayout_expandIndicator)\n                var collapseDrawable = typedArray.getDrawable(R.styleable.FoldableLayout_collapseIndicator)\n\n                if (expandDrawable == null){\n                    expandDrawable = context.resources.getDrawable(R.drawable.ic_img_toggle_down)\n                }\n                if (collapseDrawable == null){\n                    collapseDrawable = context.resources.getDrawable(R.drawable.ic_img_toggle_up)\n                }\n                expandIndicatorController = ImageButtonExpandController(expandDrawable,collapseDrawable)\n            }\n            EXPAND_INDICATOR_TEXT_VIEW->{\n                val expandText = typedArray.getString(R.styleable.FoldableLayout_expandIndicator)\n                val collapseText = typedArray.getString(R.styleable.FoldableLayout_collapseIndicator)\n                expandIndicatorController = TextViewExpandController(expandText,collapseText)\n            }\n            else-> IllegalAccessException(\"必须指定开关的样式！\")\n        }\n\n        return expandIndicatorController!!\n    }\n\n    interface ExpandIndicatorController {\n        fun changeState(collapsed: Boolean)\n        fun setView(toggleView: View)\n    }\n\n    /**\n     * 图片开关\n     */\n    inner class ImageButtonExpandController(expand: Drawable, collapse:Drawable) :ExpandIndicatorController{\n        private var imageButton: ImageButton? = null\n        private val expandDrawable: Drawable = expand\n        private val collapseDrawable: Drawable = collapse\n        override fun changeState(collapsed: Boolean) {\n            imageButton?.setImageDrawable(if (collapsed) expandDrawable else collapseDrawable)\n        }\n\n        override fun setView(toggleView: View) {\n            imageButton = toggleView as ImageButton\n        }\n    }\n\n    /**\n     * 文字开关\n     */\n    inner class TextViewExpandController(expand: String, collapse:String) :ExpandIndicatorController{\n        private var textView: TextView? = null\n        private val expandStr: String = expand\n        private val collapseStr: String = collapse\n        override fun changeState(collapsed: Boolean) {\n            textView?.setText(if (collapsed) expandStr else collapseStr)\n        }\n\n        override fun setView(toggleView: View) {\n            textView = toggleView as TextView\n        }\n    }\n\n    private var mCollapseListener:CollapseListener? = null\n    fun setCollapseListener(collapseListener:CollapseListener) {\n        mCollapseListener = collapseListener\n    }\n    interface CollapseListener{\n        fun onCollapseChanged(collapsed :Boolean)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/LaybelLayout.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.graphics.Color\nimport android.nfc.Tag\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.view.View\nimport android.view.ViewGroup\nimport com.bilibili.lingxiao.R\nimport com.bilibili.lingxiao.utils.UIUtil\nimport java.util.*\nimport java.util.Arrays.asList\nimport kotlin.collections.HashMap\nimport android.widget.TextView\nimport kotlinx.android.synthetic.main.item_comment.view.*\n\n\nclass LaybelLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    :ViewGroup(context,attrs,defStyleAttr) ,View.OnClickListener{\n    private val mChildView :MutableList<View> = ArrayList()\n    private val mChildrenMap = HashMap<View, ChildLayoutParams>()\n    private var mLinePadding: Int = 0 //行内上下边距\n    private var textBackground: Int = 0\n    private var showLines = 2 //折叠的时候显示行数\n\n    private var mUpdateListener: ValueAnimator.AnimatorUpdateListener? = null\n    private var mAnimatorListener: AnimatorListenerAdapter? = null\n    private var mCollapsed = true // 默认是被折叠了的\n\n    private val TAG = LaybelLayout::class.java.simpleName\n    init {\n        val t = context.obtainStyledAttributes(attrs, R.styleable.LaybelLayout)\n        mLinePadding = UIUtil.dip2px(t.getFloat(R.styleable.LaybelLayout_line_padding, 0f)).toInt()\n        //childMargin = UIUtil.dip2px(t.getInt(R.styleable.LaybelLayout_child_margin, 0))\n        textBackground = t.getResourceId(R.styleable.LaybelLayout_text_background, R.drawable.radius_text_background)\n        t.recycle()\n        initListener()\n    }\n\n    private var minWidth = 0\n    private var minHeight = 0//本控件的最小宽高\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        minWidth = paddingLeft + paddingRight\n        minHeight = paddingTop + paddingBottom\n        for (i in 0 until childCount){\n            var child = getChildAt(i)\n            measureChildWithMargins(child,widthMeasureSpec,0,heightMeasureSpec,0)\n            var childLayoutParams  = child.layoutParams as MarginLayoutParams\n            //如果单个View和本控件的padding加起来超过本控件的宽度，则让它的宽度 <= 本控件宽度 - Padding - margin\n            var defSize = paddingLeft + childLayoutParams.leftMargin +\n                    child.measuredWidth + paddingRight + childLayoutParams.rightMargin\n            if (defSize > measuredWidth){\n                defSize = measuredWidth - childLayoutParams.leftMargin - childLayoutParams.rightMargin\n                - paddingLeft - paddingRight\n                //childLayoutParams.width = defSize\n                //measureChild(child,widthMeasureSpec,heightMeasureSpec)\n                val widthSpec = MeasureSpec.makeMeasureSpec(defSize, MeasureSpec.AT_MOST)\n\n                //根据measureChildWithMargins里面获取高度 Spec 的方式，重新获取到高度的Spec\n                val heightSpec = getChildMeasureSpec(heightMeasureSpec,\n                    paddingTop + paddingBottom + childLayoutParams.topMargin\n                    + childLayoutParams.bottomMargin, childLayoutParams.height)\n                child.measure(widthSpec, heightSpec)\n            }\n            if (!mChildView.contains(child))\n                mChildView.add(child)\n        }\n        saveChildWidthAndHeight()\n\n\n        var widthMode = MeasureSpec.getMode(widthMeasureSpec)\n        var heightMode = MeasureSpec.getMode(heightMeasureSpec)\n        if (widthMode != MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY){\n            //setMeasuredDimension(minWidth, minHeight)\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        }else if (widthMode != MeasureSpec.EXACTLY){\n            setMeasuredDimension(minWidth, View.getDefaultSize(suggestedMinimumHeight,heightMeasureSpec))\n        }else if (heightMode != MeasureSpec.EXACTLY){\n            setMeasuredDimension(View.getDefaultSize(suggestedMinimumWidth,widthMeasureSpec), minHeight)\n        }\n    }\n\n\n    private fun saveChildWidthAndHeight() {\n        var lineHeight = 0//单行高度\n        var lineHeightSum = 0//前面总高度\n        var left = 0\n        var top = 0\n        var right = 0\n        var bottom = 0\n        var freeWidth = measuredWidth - paddingLeft - paddingRight //横向剩余空间\n        var isFirst = true //是否是某一行的第一个\n        var tmpWidth = 0\n        for ((i,child) in mChildView.withIndex()){\n            var layoutParams  = child.layoutParams as MarginLayoutParams\n            var childWidth = layoutParams.leftMargin + layoutParams.rightMargin + child.measuredWidth\n            if (childWidth > freeWidth){\n                //如果当前child宽度超过了剩余的空间\n                isFirst = true\n                lineHeightSum += lineHeight\n                lineHeight = 0\n                freeWidth = measuredWidth - paddingLeft - paddingRight //设为初始剩余\n            }\n            if (isFirst) {\n                left = paddingLeft + layoutParams.leftMargin\n                isFirst = false\n                if (tmpWidth > minWidth)\n                    minWidth = tmpWidth\n                tmpWidth = childWidth\n            } else {\n                val prView = mChildView[i-1]\n                val ll = prView.getLayoutParams() as ViewGroup.MarginLayoutParams\n                left += prView.getMeasuredWidth() + ll.rightMargin + layoutParams.leftMargin\n                tmpWidth += childWidth\n            }\n            top = paddingTop + lineHeightSum + mLinePadding + layoutParams.topMargin\n            right = left + child.getMeasuredWidth()\n            bottom = top + child.getMeasuredHeight()\n            val tmpHeight = (mLinePadding * 2\n                    + layoutParams.topMargin\n                    + child.getMeasuredHeight()\n                    + layoutParams.bottomMargin)\n            if (tmpHeight > lineHeight)\n            //选出一行当中占用高度最多的作为行高\n                lineHeight = tmpHeight\n            freeWidth -= childWidth\n\n            if (mChildrenMap.containsKey(child))\n                mChildrenMap.remove(child)\n            mChildrenMap.put(child, ChildLayoutParams(left, top, right, bottom))\n        }\n        lineHeightSum += lineHeight;//加上最后一行的高度\n        minHeight += lineHeightSum;\n        startHeight = lineHeight * showLines\n    }\n\n    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {\n        for ((child,param) in mChildrenMap) {\n            Log.d(TAG,\"onLayout>>>>>>>  $param\")\n            child.layout(param.left, param.top, param.right, param.bottom)\n        }\n    }\n\n\n\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n\n    }\n\n\n    fun startAnimation(){\n        var animator:ValueAnimator\n        if (mCollapsed){\n            animator = ValueAnimator\n                .ofFloat(0f, 1f)\n                .setDuration(500L)\n        }else{\n            animator = ValueAnimator\n                .ofFloat(1f, 0f)\n                .setDuration(500L)\n        }\n        animator.addUpdateListener(mUpdateListener)\n        animator.addListener(mAnimatorListener)\n        animator.start()\n    }\n\n    private var startHeight = 0\n    private fun initListener(){\n        mUpdateListener = ValueAnimator.AnimatorUpdateListener { animation ->\n            var interpolatedTime = animation.animatedValue as Float\n            val newHeight = (minHeight - startHeight) * interpolatedTime + startHeight\n            this@LaybelLayout.getLayoutParams().height = newHeight.toInt()\n            this@LaybelLayout.requestLayout()\n        }\n\n        mAnimatorListener = object : AnimatorListenerAdapter() {\n            override fun onAnimationEnd(animation: Animator) {\n                super.onAnimationEnd(animation)\n                //动画播放完毕\n                mCollapsed = !mCollapsed\n                /*var tempHeight = minHeight\n                minHeight = startHeight\n                startHeight = tempHeight\n                Log.d(TAG,\"结束后的高度startHeight： $startHeight, minHeight: $minHeight\")*/\n            }\n\n        }\n    }\n\n\n    fun isCollapsed() :Boolean{\n        return mCollapsed\n    }\n\n    private var mAdapter: Adapter? = null\n    private fun addChildView() {\n        mAdapter?.let {\n            for (i in 0 until it.count) {\n                val child = TextView(context)\n                val params = generateDefaultLayoutParams() as MarginLayoutParams\n                params.leftMargin = UIUtil.dip2px(5f).toInt()\n                params.rightMargin = UIUtil.dip2px(5f).toInt()\n                child.setBackgroundDrawable(context.resources.getDrawable(textBackground))\n                child.setText(it.getItem(i))\n                child.setOnClickListener{\n                    laybelClickListener?.onLaybelItemClick(child.text.toString())\n                }\n                it.onDataSet(child, it.getItem(i))\n                addView(child, params)\n            }\n        }\n\n    }\n\n    override fun generateDefaultLayoutParams(): LayoutParams {\n        return MarginLayoutParams(super.generateDefaultLayoutParams())\n    }\n\n    override fun generateLayoutParams(attrs: AttributeSet?): LayoutParams {\n        return MarginLayoutParams(context,attrs)\n    }\n\n    override fun generateLayoutParams(p: LayoutParams?): LayoutParams {\n        return MarginLayoutParams(p)\n    }\n\n    override fun onClick(v: View?) {\n\n    }\n\n    private var laybelClickListener :LaybelItemClickListener? = null\n    fun setOnLaybelClickListener(listener :LaybelItemClickListener){\n        this.laybelClickListener = listener\n    }\n    interface LaybelItemClickListener{\n        fun onLaybelItemClick(keyWord :String)\n    }\n\n    fun setAdapter(adapter:Adapter){\n        this.mAdapter = adapter\n        addChildView()\n        this.post {\n            this@LaybelLayout.getLayoutParams().height = startHeight\n            this@LaybelLayout.requestLayout()\n        }\n    }\n    data class ChildLayoutParams(var left:Int,var top:Int,var right:Int,var bottom:Int)\n\n    class Adapter {\n        lateinit var datas: ArrayList<String>\n            private set\n\n        val count: Int\n            get() = datas.size\n\n        /**\n         * if you want to use custom child view, you can overide this method,\n         * otherwise,the default view can be set\n         *\n         * @return your custom view\n         */\n        val view: View?\n            get() = null\n\n        constructor(datas: ArrayList<String>) {\n            this.datas = datas\n        }\n\n        constructor(vararg datas: String) {\n            this.datas = ArrayList()\n            datas.forEach {\n                this.datas.add(it)\n            }\n        }\n\n        fun getItem(position: Int): String {\n            return if (datas.size < 1) \"\" else datas[position]\n        }\n\n        //called when data set by LaybelLayout\n        fun onDataSet(v: View, data: String) {\n\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/LinearCardView.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.content.Context\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport com.bilibili.lingxiao.R\nimport kotlinx.android.synthetic.main.linear_card_view.view.*\n\nclass LinearCardView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    : ConstraintLayout(context, attrs, defStyleAttr){\n    private var leftText = \"\"\n    private var rightText = \"\"\n    var showRightText = false\n    init {\n        LayoutInflater.from(context).inflate(R.layout.linear_card_view,this,true)\n        var typedArray = context.obtainStyledAttributes(attrs,R.styleable.LinearCardView)\n        if (typedArray.hasValue(R.styleable.LinearCardView_left_text)){\n            leftText = typedArray.getString(R.styleable.LinearCardView_left_text)\n        }\n        if (typedArray.hasValue(R.styleable.LinearCardView_right_text)){\n            rightText  = typedArray.getString(R.styleable.LinearCardView_right_text)\n        }\n        typedArray.recycle()\n    }\n\n    override fun onFinishInflate() {\n        super.onFinishInflate()\n        setTextLeft(leftText)\n        setTextRight(rightText)\n    }\n\n    fun setTextLeft(text:String){\n        text_left.setText(text)\n    }\n\n    fun setTextRight(text:String){\n        text_right.setText(text)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/RippleAnimation.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ValueAnimator\nimport android.app.Activity\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.PorterDuff\nimport android.graphics.PorterDuffXfermode\nimport android.graphics.RectF\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewParent\nimport android.content.ContextWrapper\n\n\n\nclass RippleAnimation(\n    context: Context,\n    private val mStartX: Float,\n    private val mStartY: Float,\n    private val mStartRadius: Int\n) : View(context) {\n\n    private val mRootView: ViewGroup\n    private val mPaint: Paint\n    private var mMaxRadius: Int = 0\n    private var isStarted = false\n    private var mBackground: Bitmap? = null\n    private var mCurrentRadius: Int = 0\n    private var mAnimatorListener: AnimatorListenerAdapter? = null\n    private var mUpdateListener: ValueAnimator.AnimatorUpdateListener? = null\n    private var mDuration: Long = 1000\n\n    private val animator: ValueAnimator\n        get() {\n            val animator = ValueAnimator.ofFloat(0f, mMaxRadius.toFloat()).setDuration(mDuration)\n            animator.addUpdateListener(mUpdateListener)\n            animator.addListener(mAnimatorListener)\n            return animator\n        }\n\n    var endListener: RippleEndListener? = null\n\n    init {\n        //获取activity的根视图，用来添加本view\n        mRootView = unwrap(getContext()).window.decorView as ViewGroup\n        mPaint = Paint()\n        mPaint.isAntiAlias = true\n        //设置成擦除模式\n        mPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)\n        updateMaxRadius()\n        initListener()\n    }\n\n    private fun unwrap(context: Context): Activity {\n        var context = context\n        while (context !is Activity && context is ContextWrapper) {\n            context = context.baseContext\n        }\n\n        return context as Activity\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n        var layer = 0\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            layer = canvas.saveLayer(0f, 0f, width.toFloat(), height.toFloat(), null)\n        }\n        canvas.drawBitmap(mBackground!!, 0f, 0f, null)\n        canvas.drawCircle(mStartX, mStartY, mCurrentRadius.toFloat(), mPaint)\n        canvas.restoreToCount(layer)\n    }\n\n    private fun updateMaxRadius() {\n        //将屏幕分为四个小矩形\n        val leftTop = RectF(0f, 0f, mStartX + mStartRadius, mStartY + mStartRadius)\n        val rightTop = RectF(leftTop.right, 0f, mRootView.right.toFloat(), leftTop.bottom)\n        val leftBottom = RectF(0f, leftTop.bottom, leftTop.right, mRootView.bottom.toFloat())\n        val rightBottom = RectF(leftBottom.right, leftTop.bottom, mRootView.right.toFloat(), leftBottom.bottom)\n        //获取对角线长度\n        val leftTopHypoten =\n            Math.sqrt(Math.pow(leftTop.width().toDouble(), 2.0) + Math.pow(leftTop.height().toDouble(), 2.0))\n        val rightTopYopHypoten =\n            Math.sqrt(Math.pow(rightTop.width().toDouble(), 2.0) + Math.pow(rightTop.height().toDouble(), 2.0))\n        val leftBottomHypoten =\n            Math.sqrt(Math.pow(leftBottom.width().toDouble(), 2.0) + Math.pow(leftBottom.height().toDouble(), 2.0))\n        val rightBottomHypoten =\n            Math.sqrt(Math.pow(rightBottom.width().toDouble(), 2.0) + Math.pow(rightBottom.height().toDouble(), 2.0))\n\n        //取最大值\n        mMaxRadius = Math.max(\n            Math.max(leftTopHypoten, rightTopYopHypoten),\n            Math.max(leftBottomHypoten, rightBottomHypoten)\n        ).toInt()\n    }\n\n    private fun initListener() {\n        mAnimatorListener = object : AnimatorListenerAdapter() {\n            override fun onAnimationEnd(animation: Animator) {\n                super.onAnimationEnd(animation)\n                //动画播放完毕，移除view\n                detachFromRootView()\n                if (endListener != null) {\n                    endListener!!.onEnd()\n                }\n                isStarted = false\n            }\n        }\n        mUpdateListener = ValueAnimator.AnimatorUpdateListener { animation ->\n            mCurrentRadius = (animation.animatedValue as Float).toInt() + mStartRadius\n            postInvalidate()\n        }\n    }\n\n    private fun detachFromRootView() {\n        mRootView.removeView(this)\n    }\n\n    fun start() {\n        if (!isStarted) {\n            isStarted = true\n            updateBackground()\n            attachToRootView()\n            animator.start()\n        }\n    }\n\n    /**\n     * 添加到根视图\n     */\n    private fun attachToRootView() {\n        layoutParams = ViewGroup.LayoutParams(\n            ViewGroup.LayoutParams.MATCH_PARENT,\n            ViewGroup.LayoutParams.MATCH_PARENT\n        )\n        mRootView.addView(this)\n    }\n\n    /**\n     * 更新屏幕截图\n     */\n    private fun updateBackground() {\n        if (mBackground != null && !mBackground!!.isRecycled) {\n            mBackground!!.recycle()\n        }\n        mRootView.isDrawingCacheEnabled = true\n        mBackground = mRootView.drawingCache\n        mBackground = Bitmap.createBitmap(mBackground!!)\n        mRootView.isDrawingCacheEnabled = false\n    }\n\n    fun setDuration(duration: Long): RippleAnimation {\n        mDuration = duration\n        return this\n    }\n\n    fun setRippleListener(listener: RippleEndListener) {\n        this.endListener = listener\n    }\n\n    interface RippleEndListener {\n        fun onEnd()\n    }\n\n    override fun onTouchEvent(event: MotionEvent): Boolean {\n        return true\n    }\n\n    companion object {\n\n        fun create(onClickView: View): RippleAnimation {\n            val context = onClickView.context\n            val newWidth = onClickView.width / 2\n            val newHeight = onClickView.height / 2\n            //计算起点坐标\n            val startX = getAbsoluteX(onClickView) + newWidth\n            val startY = getAbsoluteY(onClickView) + newHeight\n\n            //起始半径 （避免遮挡按钮）\n            val radius = Math.max(newWidth, newHeight)\n            return RippleAnimation(context, startX, startY, radius)\n        }\n\n        /**\n         * 递归 获取绝对坐标\n         * @param view\n         * @return\n         */\n        private fun getAbsoluteX(view: View): Float {\n            var x = view.x\n            val parent = view.parent\n            if (parent != null && parent is View) {\n                x += getAbsoluteX(parent as View)\n            }\n            return x\n        }\n\n        private fun getAbsoluteY(view: View): Float {\n            var y = view.y\n            val parent = view.parent\n            if (parent != null && parent is View) {\n                y += getAbsoluteY(parent as View)\n            }\n            return y\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/ScrollerloadRecyclerView.kt",
    "content": "package com.bilibili.lingxiao.widget\n\nimport android.content.Context\nimport androidx.recyclerview.widget.RecyclerView\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport com.cooltechworks.views.shimmer.ShimmerRecyclerView\nimport com.facebook.drawee.backends.pipeline.Fresco\n\nclass ScrollerloadRecyclerView  @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    : ShimmerRecyclerView(context, attrs, defStyleAttr){\n    init {\n        addOnScrollListener(ImageAutoLoadListener())\n    }\n\n    inner class ImageAutoLoadListener :OnScrollListener(){\n        override fun onScrollStateChanged(recyclerView: androidx.recyclerview.widget.RecyclerView, newState: Int) {\n            super.onScrollStateChanged(recyclerView, newState)\n            when(newState){\n                SCROLL_STATE_IDLE -> Fresco.getImagePipeline().resume()  //空闲状态 加载图片\n                SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING ->{\n                    //惯性滑动和滚动 停止加载图片\n                    Fresco.getImagePipeline().pause()\n                }\n            }\n        }\n\n        override fun onScrolled(recyclerView: androidx.recyclerview.widget.RecyclerView, dx: Int, dy: Int) {\n            super.onScrolled(recyclerView, dx, dy)\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/behavior/PlayerBehavior.kt",
    "content": "package com.bilibili.lingxiao.widget.behavior\n\nimport android.content.Context\nimport com.google.android.material.appbar.AppBarLayout\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport android.util.AttributeSet\nimport android.view.View\nimport com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView\n\nclass PlayerBehavior : AppBarLayout.ScrollingViewBehavior {\n    //player顶部和toolbar底部重合时，列表的滑动距离。\n    private var deltaY: Float = 0.toFloat()\n\n    constructor() {\n\n    }\n\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}\n\n    override fun layoutDependsOn(parent: androidx.coordinatorlayout.widget.CoordinatorLayout, child: View, dependency: View): Boolean {\n        return dependency is SimplePlayerView\n    }\n\n\n    /**\n     * player的状态发生改变\n     * @param parent  CoordinatorLayout\n     * @param child  就是toolbar\n     * @param dependency  player\n     * @return\n     */\n    override fun onDependentViewChanged(parent: androidx.coordinatorlayout.widget.CoordinatorLayout, child: View, dependency: View): Boolean {\n        if (deltaY == 0f) {\n            deltaY = dependency.y - child.height\n        }\n        var dy = dependency.y - child.height\n        dy = if (dy < 0f) 0f else dy\n        val alpha = 1f - dy / deltaY\n        child.alpha = alpha\n        return super.onDependentViewChanged(parent, child, dependency)\n    }\n\n    override fun onStartNestedScroll(\n        coordinatorLayout: androidx.coordinatorlayout.widget.CoordinatorLayout,\n        child: View,\n        directTargetChild: View,\n        target: View,\n        axes: Int,\n        type: Int\n    ): Boolean {\n\n        return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)\n    }\n\n    override fun onNestedPreScroll(\n        coordinatorLayout: androidx.coordinatorlayout.widget.CoordinatorLayout,\n        child: View,\n        target: View,\n        dx: Int,\n        dy: Int,\n        consumed: IntArray,\n        type: Int\n    ) {\n        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type)\n        if (target is SimplePlayerView) {\n            if (target.isPlaying()) {\n\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/behavior/ScrollAwareFabBehaviorDefault.kt",
    "content": "package com.bilibili.lingxiao.widget.behavior\n\nimport android.content.Context\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport androidx.core.view.ViewCompat\nimport android.util.AttributeSet\nimport android.view.View\n\n/**\n * Created by lingxiao on 2017/10/22.\n */\n\nclass ScrollAwareFabBehaviorDefault(context: Context, attr: AttributeSet) : FloatingActionButton.Behavior() {\n\n    private var visible = true //是否可见\n    //列表（RecyclerView）刚开始滑动时候会回调该方法，需要在方法内设置滑动关联轴。这里只需要垂直方向上的滑动即可。\n    override fun onStartNestedScroll(\n        coordinatorLayout: androidx.coordinatorlayout.widget.CoordinatorLayout,\n        child: FloatingActionButton, directTargetChild: View,\n        target: View, nestedScrollAxes: Int\n    ): Boolean {\n        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(\n            coordinatorLayout, child,\n            directTargetChild, target, nestedScrollAxes\n        )\n    }\n\n    //onNestedScroll：滑动的时候不断的回调该方法，通过dyConsumed来判断是上滑还是下滑。\n    override fun onNestedScroll(\n        coordinatorLayout: androidx.coordinatorlayout.widget.CoordinatorLayout,\n        child: FloatingActionButton, target: View,\n        dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int\n    ) {\n        super.onNestedScroll(\n            coordinatorLayout,\n            child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed\n        )\n        if (dyConsumed > 0 && visible) {\n            // User scrolled down and the FAB is currently visible -> hide the FAB\n            //fab只隐藏，不显示，在hide方法里设置为GONE，所以不会再调用onNestedScroll方法\n            child.hide(object : FloatingActionButton.OnVisibilityChangedListener() {\n                override fun onHidden(fab: FloatingActionButton?) {\n                    super.onHidden(fab)\n                    fab!!.visibility = View.INVISIBLE\n                }\n            })\n            visible = false\n        } else if (dyConsumed < 0) {\n            // User scrolled up and the FAB is currently not visible -> show the FAB\n            child.show()\n            visible = true\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/behavior/TransferHeaderBehavior.kt",
    "content": "package com.bilibili.lingxiao.widget.behavior\n\nimport android.content.Context\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.widget.NestedScrollView\nimport android.util.AttributeSet\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.ViewCompat.setY\nimport androidx.core.view.ViewCompat.setX\nimport android.opengl.ETC1.getWidth\nimport android.R.attr.dependency\nimport android.opengl.ETC1.getHeight\n\n\n\nclass TransferHeaderBehavior(context: Context?, attrs: AttributeSet?) :\n    androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior<LinearLayout>(context, attrs) {\n    /**\n     * 处于中心时候原始X轴\n     */\n    private var mOriginalHeaderX = 0\n    /**\n     * 处于中心时候原始Y轴\n     */\n    private var mOriginalHeaderY = 0\n\n    override fun layoutDependsOn(parent: androidx.coordinatorlayout.widget.CoordinatorLayout, child: LinearLayout, dependency: View): Boolean {\n        return dependency is NestedScrollView\n    }\n\n    override fun onDependentViewChanged(parent: androidx.coordinatorlayout.widget.CoordinatorLayout, child: LinearLayout, dependency: View): Boolean {\n        // 计算X轴坐标\n        if (mOriginalHeaderX == 0) {\n            this.mOriginalHeaderX = dependency.width  - child.width\n        }\n        // 计算Y轴坐标\n        /*if (mOriginalHeaderY == 0) {\n            mOriginalHeaderY = dependency.height - child.height\n        }*/\n        //X轴百分比\n        var mPercentX = dependency.y / mOriginalHeaderX\n        if (mPercentX >= 1) {\n            mPercentX = 1f\n        }\n        //Y轴百分比\n        var mPercentY = dependency.y / mOriginalHeaderY\n        if (mPercentY >= 1) {\n            mPercentY = 1f\n        }\n\n        var x = mOriginalHeaderX - mOriginalHeaderX * mPercentX\n        if (x <= child.width) {\n            x = child.width.toFloat()\n        }\n        // TODO 头像的放大和缩小没做\n\n        child.x = x\n        child.y = mOriginalHeaderY - mOriginalHeaderY * mPercentY\n        return true\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/skin/SkinTabLayout.kt",
    "content": "package com.bilibili.lingxiao.widget.skin\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport com.google.android.material.tabs.TabLayout\nimport androidx.core.view.ViewCompat\nimport androidx.appcompat.content.res.AppCompatResources\nimport android.util.AttributeSet\n\nimport com.bilibili.lingxiao.R\nimport skin.support.content.res.SkinCompatResources\nimport skin.support.design.widget.SkinMaterialTabLayout\nimport skin.support.widget.SkinCompatHelper\nimport skin.support.widget.SkinCompatSupportable\n\nimport skin.support.widget.SkinCompatHelper.INVALID_ID\n\nclass SkinTabLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :\n    TabLayout(context, attrs, defStyleAttr), SkinCompatSupportable {\n    private var mTabIndicatorColorResId = INVALID_ID\n    private var mTabTextColorsResId = INVALID_ID\n    private var mTabSelectedTextColorResId = INVALID_ID\n    private var mTabBackgroundColorResId = INVALID_ID\n\n    init {\n        val a = context.obtainStyledAttributes(\n            attrs, skin.support.design.R.styleable.TabLayout,\n            defStyleAttr, 0\n        )\n\n        mTabIndicatorColorResId =\n            a.getResourceId(skin.support.design.R.styleable.TabLayout_tabIndicatorColor, INVALID_ID)\n\n        val tabTextAppearance = a.getResourceId(\n            skin.support.design.R.styleable.TabLayout_tabTextAppearance,\n            skin.support.design.R.style.TextAppearance_Design_Tab\n        )\n\n        // Text colors/sizes come from the text appearance first\n        val ta = context.obtainStyledAttributes(tabTextAppearance, skin.support.design.R.styleable.SkinTextAppearance)\n        try {\n            mTabTextColorsResId =\n                ta.getResourceId(skin.support.design.R.styleable.SkinTextAppearance_android_textColor, INVALID_ID)\n        } finally {\n            ta.recycle()\n        }\n\n        if (a.hasValue(skin.support.design.R.styleable.TabLayout_tabTextColor)) {\n            // If we have an explicit text color set, use it instead\n            mTabTextColorsResId = a.getResourceId(skin.support.design.R.styleable.TabLayout_tabTextColor, INVALID_ID)\n        }\n\n        if (a.hasValue(skin.support.design.R.styleable.TabLayout_tabSelectedTextColor)) {\n            // We have an explicit selected text color set, so we need to make merge it with the\n            // current colors. This is exposed so that developers can use theme attributes to set\n            // this (theme attrs in ColorStateLists are Lollipop+)\n            mTabSelectedTextColorResId =\n                a.getResourceId(skin.support.design.R.styleable.TabLayout_tabSelectedTextColor, INVALID_ID)\n        }\n\n        mTabBackgroundColorResId = a.getResourceId(skin.support.design.R.styleable.TabLayout_tabBackground, INVALID_ID)\n        a.recycle()\n        applySkin()\n    }\n\n    override fun applySkin() {\n        mTabIndicatorColorResId = SkinCompatHelper.checkResourceId(mTabIndicatorColorResId)\n        if (mTabIndicatorColorResId != INVALID_ID) {\n            setBackgroundColor(SkinCompatResources.getColor(context, mTabIndicatorColorResId))\n            //setSelectedTabIndicatorColor(SkinCompatResources.getColor(getContext(), mTabIndicatorColorResId));\n            setSelectedTabIndicatorColor(resources.getColor(R.color.white))\n        }\n        mTabTextColorsResId = SkinCompatHelper.checkResourceId(mTabTextColorsResId)\n        if (mTabTextColorsResId != INVALID_ID) {\n            tabTextColors = SkinCompatResources.getColorStateList(context, mTabTextColorsResId)\n        }\n        mTabSelectedTextColorResId = SkinCompatHelper.checkResourceId(mTabSelectedTextColorResId)\n        if (mTabSelectedTextColorResId != INVALID_ID) {\n            val selected = SkinCompatResources.getColor(context, mTabSelectedTextColorResId)\n            if (tabTextColors != null) {\n                //不改变文字颜色\n                setTabTextColors(tabTextColors!!.defaultColor, selected)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/skin/SlidTabLayout.kt",
    "content": "package com.bilibili.lingxiao.widget.skin\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport android.util.AttributeSet\nimport com.bilibili.lingxiao.R\nimport com.flyco.tablayout.SlidingTabLayout\nimport skin.support.widget.SkinCompatBackgroundHelper\nimport skin.support.widget.SkinCompatHelper\nimport skin.support.widget.SkinCompatSupportable\n\nclass SlidTabLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)\n    :SlidingTabLayout(context, attrs, defStyleAttr), SkinCompatSupportable {\n    private var mBackgroundTintHelper: SkinCompatBackgroundHelper? = null\n    init {\n        mBackgroundTintHelper = SkinCompatBackgroundHelper(this)\n        mBackgroundTintHelper?.loadFromAttributes(attrs, defStyleAttr)\n    }\n\n    override fun setBackgroundResource(resid: Int) {\n        super.setBackgroundResource(resid)\n        if (mBackgroundTintHelper != null) {\n            mBackgroundTintHelper?.onSetBackgroundResource(resid)\n        }\n    }\n    override fun applySkin() {\n        mBackgroundTintHelper?.applySkin()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/bilibili/lingxiao/widget/skin/SmartSkinRefreshLayout.kt",
    "content": "package com.bilibili.lingxiao.widget.skin\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.util.AttributeSet\n\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout\n\nimport skin.support.content.res.SkinCompatResources\nimport skin.support.widget.SkinCompatHelper\nimport skin.support.widget.SkinCompatSupportable\n\nimport skin.support.widget.SkinCompatHelper.INVALID_ID\n\nclass SmartSkinRefreshLayout @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : SmartRefreshLayout(context, attrs, defStyleAttr), SkinCompatSupportable {\n    private var mPrimaryColorId = INVALID_ID\n    private val mAccentColor: Int\n    init {\n        val a = context.obtainStyledAttributes(\n            attrs, com.scwang.smartrefresh.layout.R.styleable.SmartRefreshLayout,\n            defStyleAttr, 0\n        )\n        if (a.hasValue(com.scwang.smartrefresh.layout.R.styleable.SmartRefreshLayout_srlPrimaryColor)) {\n            mPrimaryColorId = a.getResourceId(\n                com.scwang.smartrefresh.layout.R.styleable.SmartRefreshLayout_srlPrimaryColor,\n                INVALID_ID\n            )\n        }\n        mAccentColor = a.getColor(com.scwang.smartrefresh.layout.R.styleable.SmartRefreshLayout_srlAccentColor, 0)\n        a.recycle()\n        applySkin()\n    }\n\n    override fun applySkin() {\n        mPrimaryColorId = SkinCompatHelper.checkResourceId(mPrimaryColorId)\n        if (mPrimaryColorId != INVALID_ID) {\n            val primaryColor = SkinCompatResources.getColor(context, mPrimaryColorId)\n            if (mAccentColor != INVALID_ID) {\n                mPrimaryColors = intArrayOf(primaryColor, mAccentColor)\n            } else {\n                mPrimaryColors = intArrayOf(primaryColor)\n            }\n            setPrimaryColors(*mPrimaryColors)\n        }\n    }\n\n    companion object {\n\n        private val TAG = SmartSkinRefreshLayout::class.java.simpleName\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/anim/left_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"300\"\n>\n    <translate\n        android:fromXDelta=\"-30.0%p\"\n        android:toXDelta=\"0.0\" />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/left_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"300\"\n>\n    <translate\n        android:fromXDelta=\"0.0\"\n        android:toXDelta=\"-30.0%p\" />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/pop_hide.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:duration=\"@android:integer/config_mediumAnimTime\"\n     android:shareInterpolator=\"true\"\n>\n    <translate\n            android:fromXDelta=\"0\"\n            android:fromYDelta=\"0\"\n            android:interpolator=\"@android:anim/linear_interpolator\"\n            android:toXDelta=\"0\"\n            android:toYDelta=\"100%p\" />\n    <alpha\n            android:fromAlpha=\"1\"\n            android:toAlpha=\"0\"\n    />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/pop_left_hide.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:duration=\"@android:integer/config_mediumAnimTime\"\n     android:shareInterpolator=\"true\"\n>\n    <translate\n            android:fromXDelta=\"0\"\n            android:fromYDelta=\"0\"\n            android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n            android:toXDelta=\"100%p\"\n            android:toYDelta=\"0\"/>\n    <alpha\n        android:fromAlpha=\"1\"\n        android:toAlpha=\"0\"\n    />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/pop_right_show.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:duration=\"@android:integer/config_mediumAnimTime\"\n     android:shareInterpolator=\"true\"\n>\n    <translate\n            android:fromXDelta=\"100%p\"\n            android:fromYDelta=\"0\"\n            android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n            android:toXDelta=\"0\"\n            android:toYDelta=\"0\"/>\n    <alpha\n        android:fromAlpha=\"0\"\n        android:toAlpha=\"1\"\n    />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/pop_show.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:duration=\"@android:integer/config_mediumAnimTime\"\n     android:shareInterpolator=\"true\"\n>\n    <translate\n            android:fromXDelta=\"0\"\n            android:fromYDelta=\"100%p\"\n            android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n            android:toXDelta=\"0\"\n            android:toYDelta=\"0\"/>\n    <alpha\n        android:fromAlpha=\"0\"\n        android:toAlpha=\"1\"\n    />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/pop_watch_later_hide.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"@android:integer/config_shortAnimTime\"\n        android:shareInterpolator=\"true\"\n>\n    <scale\n            android:fromYScale=\"1\"\n            android:fromXScale=\"1\"\n\n            android:toXScale=\"0\"\n            android:toYScale=\"0\"\n            android:pivotX=\"100%\"\n            android:pivotY=\"100%\"\n    />\n    <alpha\n            android:fromAlpha=\"1\"\n            android:toAlpha=\"0\"\n    />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/pop_watch_later_show.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"@android:integer/config_shortAnimTime\"\n        android:shareInterpolator=\"true\"\n\n>\n    <scale\n            android:fromXScale=\"0\"\n            android:fromYScale=\"0\"\n            android:toXScale=\"1\"\n            android:toYScale=\"1\"\n            android:pivotX=\"100%\"\n            android:pivotY=\"100%\"\n    />\n    <alpha\n            android:fromAlpha=\"0\"\n            android:toAlpha=\"1\"\n    />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/right_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"300\"\n>\n    <translate\n        android:fromXDelta=\"100.0%p\"\n        android:toXDelta=\"0.0\" />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/right_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"300\"\n>\n    <translate\n        android:duration=\"300\"\n        android:fromXDelta=\"0.0\"\n        android:toXDelta=\"100.0%p\" />\n</set>"
  },
  {
    "path": "app/src/main/res/drawable/bangumi_follow_animlist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animation-list xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                android:oneshot=\"true\"\n>\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_01\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_02\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_03\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_04\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_05\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_06\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_07\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_08\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_09\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_08\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_07\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_06\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_05\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_04\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_03\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_02\"\n            android:duration=\"200\" />\n    <item\n            android:drawable=\"@drawable/bangumi_detail_ic_follow_01\"\n            android:duration=\"200\" />\n</animation-list>"
  },
  {
    "path": "app/src/main/res/drawable/bg_bottom_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:opacity=\"opaque\"\n>\n    <item android:drawable=\"@drawable/ic_nav_circle\">\n    </item>\n    <item android:width=\"20dp\"\n          android:height=\"20dp\"\n          android:gravity=\"center\"\n          android:drawable=\"@drawable/ic_nav_setting\"\n    />\n\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/button_white_line_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <!--背景色-->\n    <solid android:color=\"@color/white_alpha_240\"/>\n    <!--圆角-->\n    <corners android:radius=\"2dp\"/>\n    <!--设置边框线的宽度和颜色-->\n    <stroke android:width=\"0.5dp\" android:color=\"@color/black_alpha_32\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ic_image_left.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#797979\" android:pathData=\"M802.91,487.14H333.66l184.76,-170.59a34.91,34.91 0,1 0,-47.36 -51.27l-250.39,231.1a34.96,34.96 0,0 0,0 51.32l250.39,231.1a34.86,34.86 0,0 0,49.34 -1.95,34.91 34.91,0 0,0 -1.98,-49.34l-184.76,-170.54H802.91a34.91,34.91 0,1 0,0 -69.82\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_agree.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M924.9,549.7c22.2,-19.8 35.5,-48.4 35.5,-78.8 0,-28.4 -11.2,-55 -31.6,-75 -20.3,-19.9 -47.5,-30.9 -76.4,-30.9L687.3,365c-14.9,0 -30,0.8 -44.6,1.6l-1.2,0.1h-0.2c-9.4,0.5 -15.5,-9.6 -10.7,-17.7 3.7,-6.3 7.9,-12.7 12.1,-19.3 7.6,-11.7 16.2,-25 23,-39 10.9,-22.6 25.9,-56.5 30.8,-90.8 5.5,-38.9 -2.6,-72.1 -24.3,-98.7 -19.2,-23.5 -48.2,-37 -79.5,-37 -21.9,0 -43.9,6.8 -62.1,19.2 -25.3,17.3 -37.4,42.1 -47.1,62.1v0.1c-2.4,4.9 -4.6,9.6 -7,13.9 -7.2,13 -12.5,26.3 -17.3,38 -6,14.6 -11.1,27.2 -18.4,37.5 -5.7,8 -11.3,16.2 -16.7,24.1l-0.9,1.4c-20.4,29.9 -39.7,58.1 -63.8,80.3l-4.9,4.6c-10.3,9.5 -27.4,25.5 -45.3,38.8 -17.8,13.2 -28.9,18.3 -35.1,20.1 -3.1,1 -6.5,0.5 -9.4,-1.2 -0.1,-0.1 -0.2,-0.1 -0.3,-0.2l-0.6,-0.4c-8.7,-5.3 -21.9,-13.2 -42.9,-14.4h-0.2c-29.6,-1.3 -63.1,8.9 -91.7,28.1 -40.9,27.3 -65.2,72.1 -65.2,120v239.3c0,44.7 25.7,93 65.4,122.9 22.5,17 47.4,26.4 72,27.2l3,0.1c22.2,0 38.3,-7.8 50.1,-13.6 4,-1.9 8,-4 11.4,-5 23.4,-7.4 49.5,3.2 81.2,17.8h0.1c25,11.5 53.3,24.6 86.1,28.7 34.1,4.3 70.9,6.3 115.7,6.3 26.4,0 53.1,-0.7 78.9,-1.3 25.1,-0.7 51.1,-1.3 76.6,-1.3 58.8,0 106.6,-47.5 106.6,-105.9 0,-5.8 -0.5,-11.6 -1.4,-17.3 -0.9,-5.3 1.9,-10.5 6.8,-12.6 12.6,-5.5 24,-13.5 33.8,-23.6 19.1,-19.8 29.6,-45.8 29.6,-73.2 0,-9 -1.1,-17.9 -3.4,-26.5 -1.2,-4.8 0.6,-9.9 4.7,-12.6 28.6,-19.4 46.8,-52 46.8,-87.7 0,-12.2 -2.1,-24.1 -6,-35.3 -1.8,-4.7 -0.5,-9.7 3.1,-12.9zM267.8,405.2zM204.2,881.9h-1.8c-15.5,-0.6 -31.8,-6.9 -47,-18.4 -28.7,-21.6 -48,-57 -48,-88L107.4,536.1c0,-33.2 17.1,-64.5 45.8,-83.7 20.7,-13.9 45.1,-21.6 65.3,-20.8 10,0.6 15.8,4.1 22.5,8.1l0.6,0.4c1.3,0.8 2.8,1.7 4.5,2.6v424.7c-4.1,1.7 -7.9,3.5 -11.3,5.2 -9.9,5 -18.6,9.3 -30.6,9.3zM879.9,527.5l-24.6,11.2c-0.2,0.1 -0.2,0.3 -0.1,0.4l16.3,21.5c8.2,10.8 12.5,23.6 12.5,37.1 0,27.7 -18.9,52.4 -45.9,59.9l-28.6,7.9c-0.2,0 -0.3,0.3 -0.2,0.4l15.8,23.9c6.6,10 10.5,21.7 10.7,33.7 0.5,33.7 -26,61.4 -59.8,63l-36.1,1.7c-0.2,0 -0.3,0.2 -0.2,0.4l18.5,31c5.7,9.6 8.7,20.5 8.7,31.6 0,34.3 -28.2,62.2 -62.8,62.2 -26.1,0 -52.3,0.7 -77.7,1.3 -25.5,0.7 -51.9,1.3 -77.8,1.3 -43,0 -78,-1.9 -110.3,-5.9 -26.1,-3.3 -49,-13.8 -73.3,-25h-0.1c-26,-12 -50.4,-22.2 -75.2,-24.1L289.7,444.9c29.4,-10.2 62.3,-38 94.2,-67.6l4.8,-4.5c27.8,-25.6 48.4,-55.8 70.3,-87.7l0.9,-1.3c5.3,-7.8 10.9,-15.9 16.3,-23.6 10.2,-14.4 16.8,-30.6 23.2,-46.3v-0.1c4.5,-11.1 9.2,-22.5 15.1,-33.3 2.9,-5.3 5.5,-10.7 8.1,-15.9 8.2,-16.9 16.7,-34.4 32.3,-45 11,-7.5 24.3,-11.6 37.5,-11.6 18.1,0 34.7,7.6 45.6,20.9 31.7,38.9 10.3,96.8 -12,142.9 -5.6,11.6 -13,23.1 -20.2,34.2 -13.8,21.3 -28,43.2 -31.3,67.7 -1.6,12.1 -0.8,21.1 2.5,27.5l7.1,13.8c0.1,0.1 0.2,0.2 0.3,0.1l20.3,-3.1c13,-0.1 26.2,-0.8 38.9,-1.5l1.2,-0.1c14,-0.8 28.4,-1.6 42.1,-1.6L852,408.8c35.4,0 64.2,27.9 64.2,62.2 0.4,24.1 -14,46.3 -36.3,56.5z\"/>\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M511.96,512.03c-0,0 -0,0 -0,0s0,0 0,0c0,0 0,-0 0,-0s-0,-0 -0,-0z\"/>\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M191,765.2c-22.7,0 -41.2,18.5 -41.2,41.2 0,22.7 18.5,41.2 41.2,41.2 22.7,0 41.2,-18.5 41.2,-41.2 -0.1,-22.7 -18.6,-41.2 -41.2,-41.2zM191,821.5c-8.4,0 -15.2,-6.8 -15.2,-15.2s6.8,-15.2 15.2,-15.2c8.4,0 15.2,6.8 15.2,15.2s-6.9,15.2 -15.2,15.2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_comment.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/black_alpha_32\" android:pathData=\"M886.02,279.74c15.74,0.58 31.23,3.52 46.02,9.34a136.32,136.32 0,0 1,77.31 79.23c5.06,13.82 7.62,28.22 8.19,42.94 0.9,75.26 0.9,150.53 0,225.79a142.08,142.08 0,0 1,-9.34 46.08,136.45 136.45,0 0,1 -82.37,78.4 139.39,139.39 0,0 1,-43.14 7.1h-81.92l-2.11,73.6 -0.19,2.56a29.76,29.76 0,0 1,-3.26 9.66,25.98 25.98,0 0,1 -26.24,12.35 27.84,27.84 0,0 1,-9.54 -3.65L609.86,768.64c-56.19,0 -112.38,0.64 -168.58,-0.06a139.52,139.52 0,0 1,-49.02 -10.56,136.26 136.26,0 0,1 -74.3,-78.02 140.29,140.29 0,0 1,-8.19 -42.94,9483.58 9483.58,0 0,1 0,-225.79c0.58,-14.72 3.14,-29.12 8.19,-42.94a136.32,136.32 0,0 1,77.31 -79.23c14.78,-5.82 30.27,-8.77 46.02,-9.34 148.22,-1.86 296.51,-1.86 444.74,0zM444.93,330.88a85.5,85.5 0,0 0,-28.93 5.12,84.8 84.8,0 0,0 -49.98,49.92 88,88 0,0 0,-5.06 26.62c-0.96,75.14 -2.75,150.34 0.13,225.41 0.51,8.38 2.05,16.58 4.93,24.45a84.03,84.03 0,0 0,76.61 54.98c58.18,0.77 116.42,0.06 174.66,0.06a29.25,29.25 0,0 1,13.63 3.97l117.82,74.5 1.54,-53.57 0.19,-2.5a25.6,25.6 0,0 1,22.98 -22.27c37.76,-1.86 75.65,1.22 113.41,-0.26 8.38,-0.51 16.58,-2.05 24.45,-4.93a84.74,84.74 0,0 0,55.04 -76.61c0.96,-75.14 2.75,-150.34 -0.13,-225.34a86.91,86.91 0,0 0,-4.93 -24.51,84.86 84.86,0 0,0 -48.06,-49.22 87.23,87.23 0,0 0,-28.54 -5.76c-146.56,-1.86 -293.12,-0.06 -439.74,-0.06zM495.94,158.14a117.57,117.57 0,0 1,82.37 37.06,34.88 34.88,0 0,1 9.34,14.46 25.86,25.86 0,0 1,-23.62 32.32,26.69 26.69,0 0,1 -17.09,-5.63c-3.46,-3.01 -6.34,-6.66 -9.73,-9.79a68.29,68.29 0,0 0,-40.83 -17.15,4655.87 4655.87,0 0,0 -375.74,0 66.56,66.56 0,0 0,-58.5 42.05,69.12 69.12,0 0,0 -4.48,20.93 2503.68,2503.68 0,0 0,0 191.1c0.38,6.66 1.6,13.18 3.9,19.46a67.39,67.39 0,0 0,55.68 43.33c3.14,0.32 6.27,0.26 9.47,0.45 2.24,0.32 2.24,0.32 4.54,0.9a26.37,26.37 0,0 1,18.43 24l0.51,23.87 76.99,-36.8c2.11,-0.9 2.05,-0.9 4.29,-1.6a27.33,27.33 0,0 1,11.39 -0.51,25.86 25.86,0 0,1 19.71,33.15 26.5,26.5 0,0 1,-11.26 14.02c-37.44,20.03 -76.48,36.74 -114.75,55.04a25.79,25.79 0,0 1,-36.61 -22.53l-0.96,-41.15c-3.39,-0.7 -6.66,-1.66 -9.92,-2.62a120.58,120.58 0,0 1,-35.46 -18.11A118.4,118.4 0,0 1,6.4 463.1C5.57,399.68 5.57,336.19 6.4,272.77c0.51,-13.76 3.07,-27.26 8.13,-40.13 12.22,-31.04 37.76,-55.94 69.06,-67.39 12.1,-4.42 24.64,-6.66 37.44,-7.1 124.99,-1.6 249.98,-1.79 374.91,0zM501.38,490.88a38.4,38.4 0,1 1,-0.06 76.86,38.4 38.4,0 0,1 0.06,-76.86zM663.62,490.88a38.4,38.4 0,1 1,0 76.8,38.4 38.4,0 0,1 0,-76.8zM825.92,490.88a38.4,38.4 0,1 1,-0.06 76.86,38.4 38.4,0 0,1 0.06,-76.86z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_danmaku.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1303\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/black_alpha_64\" android:pathData=\"M110.96,1023.72c-60.51,0 -109.85,-48.87 -109.85,-108.92L1.12,109.01C1.12,48.97 50.46,0 110.96,0h1081.9c60.51,0 109.85,48.87 109.85,108.92v805.79c0,60.04 -49.34,108.92 -109.85,108.92L110.96,1023.63zM110.96,96.07c-6.61,0 -12.1,5.77 -12.1,12.94v805.79c0,7.17 5.49,13.03 12.1,13.03h1081.9c6.61,0 12.1,-5.86 12.1,-13.03L1204.97,109.01c0,-7.17 -5.49,-13.03 -12.1,-13.03L110.96,95.98z\"/>\n    <path android:fillColor=\"@color/black_alpha_64\" android:pathData=\"M1003.05,520.1a51.57,51.57 0,0 1,-50.27 52.69h-80.06a51.57,51.57 0,0 1,-50.27 -52.69c0,-29.14 22.43,-52.78 50.27,-52.78h80.06c27.83,0 50.27,23.65 50.27,52.78zM1096.61,270.15c0,28.86 -22.34,52.41 -49.99,52.41H232.54a51.29,51.29 0,0 1,-50.08 -52.41c0,-29.04 22.43,-52.5 50.08,-52.5h814.08c27.65,0 50.08,23.46 50.08,52.5zM768.74,520.1c0,28.86 -22.34,52.41 -50.08,52.41H232.54a51.29,51.29 0,0 1,-50.08 -52.41c0,-29.04 22.43,-52.5 50.08,-52.5H718.66c27.65,0 50.08,23.46 50.08,52.5zM1096.61,735.98c0,29.04 -22.34,52.5 -49.99,52.5H560.5a51.29,51.29 0,0 1,-50.08 -52.5c0,-28.95 22.34,-52.41 50.08,-52.41h486.12c27.65,0 50.08,23.46 50.08,52.41z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_disagree.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M960,83.2l-243.2,0c-44.8,0 -57.6,32 -64,57.6l-6.4,0C620.8,140.8 601.6,115.2 576,96 550.4,70.4 531.2,51.2 499.2,51.2L134.4,51.2C115.2,51.2 102.4,57.6 89.6,64 70.4,89.6 64,134.4 64,153.6 44.8,166.4 12.8,198.4 32,281.6 19.2,300.8 0,326.4 0,371.2c0,38.4 12.8,64 25.6,76.8C12.8,467.2 0,492.8 0,531.2c0,51.2 44.8,89.6 102.4,89.6l134.4,0c51.2,0 70.4,12.8 83.2,25.6 12.8,12.8 6.4,25.6 6.4,25.6l0,0 0,0c0,6.4 6.4,172.8 57.6,243.2 25.6,38.4 57.6,57.6 89.6,57.6 12.8,0 19.2,0 32,-6.4 12.8,-6.4 57.6,-32 25.6,-121.6 -19.2,-57.6 44.8,-153.6 121.6,-230.4 6.4,25.6 19.2,44.8 57.6,44.8L960,659.2c64,0 64,-51.2 64,-96L1024,172.8C1024,134.4 1024,83.2 960,83.2zM505.6,857.6C518.4,896 512,928 492.8,940.8c-19.2,6.4 -51.2,0 -76.8,-38.4 -44.8,-64 -51.2,-211.2 -51.2,-230.4 0,-6.4 0,-25.6 -12.8,-44.8C326.4,601.6 288,588.8 236.8,588.8L102.4,588.8C70.4,588.8 32,576 32,531.2c0,-44.8 25.6,-70.4 25.6,-70.4L70.4,448 57.6,435.2c0,0 -25.6,-25.6 -25.6,-64 0,-44.8 19.2,-64 25.6,-70.4l12.8,-6.4 0,-12.8C44.8,198.4 83.2,179.2 83.2,172.8l12.8,-6.4 0,-12.8c0,-19.2 6.4,-57.6 19.2,-70.4C121.6,83.2 128,83.2 134.4,83.2l364.8,0c12.8,0 32,19.2 51.2,38.4 25.6,25.6 57.6,57.6 96,57.6l6.4,0 0,390.4c0,0 0,6.4 0,12.8C595.2,633.6 473.6,761.6 505.6,857.6zM992,563.2c0,51.2 -6.4,64 -32,64l-243.2,0c-25.6,0 -32,-12.8 -32,-64L684.8,172.8c0,-51.2 6.4,-57.6 32,-57.6L960,115.2c25.6,0 32,12.8 32,57.6L992,563.2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_download.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M972.8,526.34C972.8,604.16 936.96,696.32 763.9,696.32H665.6c-11.26,0 -20.48,-9.22 -20.48,-20.48s9.22,-20.48 20.48,-20.48h98.3C878.59,655.36 931.84,614.4 931.84,526.34c0,-91.14 -75.78,-165.89 -167.94,-165.89 -20.48,0 -38.91,3.07 -58.37,10.24 -9.22,3.07 -20.48,-1.02 -24.58,-10.24 -40.96,-76.8 -119.81,-124.93 -206.85,-124.93 -107.52,0 -199.68,71.68 -225.28,175.1 -1.02,5.12 -5.12,10.24 -9.22,13.31 -5.12,3.07 -10.24,3.07 -16.38,2.05 -7.17,-2.05 -15.36,-3.07 -25.6,-3.07C139.26,421.89 92.16,468.99 92.16,526.34 92.16,631.81 181.25,650.24 248.83,655.36H348.16c11.26,0 20.48,9.22 20.48,20.48s-9.22,20.48 -20.48,20.48h-101.38C84.99,685.06 51.2,598.02 51.2,526.34c0,-79.87 65.54,-145.41 146.43,-145.41 6.14,0 12.29,0 17.41,1.02C250.88,270.34 354.3,194.56 474.11,194.56c96.26,0 184.32,50.18 234.5,132.1 18.43,-5.12 36.86,-7.17 55.3,-7.17 114.69,0 208.9,93.18 208.9,206.85zM562.18,729.09c-7.17,7.17 -16.38,15.36 -29.7,25.6V645.12c0,-11.26 -9.22,-20.48 -20.48,-20.48s-20.48,9.22 -20.48,20.48v110.59c-13.31,-10.24 -23.55,-19.46 -30.72,-26.62 -8.19,-8.19 -20.48,-8.19 -28.67,0s-8.19,20.48 0,28.67c14.34,14.34 35.84,31.74 67.58,55.3 4.1,3.07 8.19,4.1 12.29,4.1s9.22,-1.02 12.29,-4.1c32.77,-25.6 53.25,-41.98 66.56,-55.3 8.19,-8.19 8.19,-20.48 0,-28.67s-20.48,-8.19 -28.67,0zM618.5,563.2c-33.79,-7.17 -69.63,-10.24 -106.5,-10.24s-73.73,4.1 -106.5,10.24c-11.26,2.05 -18.43,13.31 -15.36,24.58 2.05,11.26 13.31,18.43 24.58,15.36 30.72,-6.14 63.49,-10.24 98.3,-10.24s67.58,3.07 98.3,10.24h4.1c9.22,0 18.43,-6.14 20.48,-16.38 1.02,-10.24 -6.14,-20.48 -17.41,-23.55z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_game.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\"\n        android:width=\"24dp\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M204.9,863.1c-3.46,0 -6.91,-0.13 -10.4,-0.42 -107.78,-8.83 -179.58,-169.79 -163.49,-366.4C47.36,296.35 141.02,151.74 249.44,161.06c48.38,3.97 81.92,42.91 105.76,76.42 10.24,14.4 6.88,34.37 -7.52,44.64 -14.43,10.24 -34.37,6.82 -44.64,-7.55 -23.46,-32.96 -41.6,-48.29 -58.82,-49.73 -59.01,-4.26 -135.58,107.58 -149.41,276.67 -13.82,169.06 44.19,292.38 104.93,297.34 52.96,4.96 105.02,-61.15 132.19,-166.85 3.62,-14.11 16.35,-24 30.98,-24h299.9c14.43,0 27.07,9.66 30.88,23.55C722.85,738.24 774.91,803.9 829.02,798.4c29.41,-2.98 57.28,-33.63 76.45,-84.1 22.21,-58.59 30.02,-135.04 21.89,-215.23s-31.07,-153.54 -64.64,-206.56c-28.93,-45.7 -62.02,-70.59 -91.74,-67.2 -18.34,1.89 -39.62,19.2 -59.81,48.74A31.96,31.96 0,0 1,684.74 288L448,288c-17.66,0 -32,-14.34 -32,-32s14.34,-32 32,-32h220.48c29.28,-37.92 61.57,-58.85 96.06,-62.34C871.87,150.72 971.14,296.26 991.04,492.67c9.09,89.89 -0.03,176.67 -25.76,244.38 -28.51,75.07 -74.59,119.46 -129.82,125.06 -81.76,8.35 -156.13,-63.97 -196.54,-190.08L387.1,672.03c-36.48,119.52 -104.51,191.07 -182.21,191.07zM320,448h-32v-32c0,-17.66 -14.34,-32 -32,-32s-32,14.34 -32,32v32h-32c-17.66,0 -32,14.34 -32,32s14.34,32 32,32h32v32c0,17.7 14.34,32 32,32s32,-14.3 32,-32v-32h32c17.66,0 32,-14.34 32,-32s-14.34,-32 -32,-32zM736,384a2,2 0,1 0,128 0,2 2,0 1,0 -128,0zM608,512a2,2 0,1 0,128 0,2 2,0 1,0 -128,0z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_header.xml",
    "content": "<vector\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024\"\n        android:viewportWidth=\"1024\"\n        android:width=\"24dp\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/colorPrimary\"\n          android:pathData=\"M0,511.58c0,282.02 229.55,511.58 511.58,511.58 282.02,0 511.58,-229.56 511.58,-511.58C1023.16,229.56 793.6,0 511.58,0 229.56,0 0,229.55 0,511.58zM213.83,862.01c75.53,-50.99 140.38,-83.73 159.47,-93.17a33.5,33.5 0,0 0,18.88 -30.21v-64.21a25.8,25.8 0,0 0,-3.56 -13.01c-13.01,-22.04 -22.04,-48.47 -26.66,-78.49a25.51,25.51 0,0 0,-18.46 -20.77c-2.52,-3.14 -9.65,-14.06 -18.67,-45.74 -7.14,-25.18 -7.14,-37.57 -6.51,-42.6 7.76,0 15.32,-3.56 20.15,-9.86a25.49,25.49 0,0 0,3.98 -24.33c-10.07,-28.54 -11.33,-57.71 -3.56,-87.51 6.72,-28.54 22.03,-55.39 45.74,-79.74a219.81,219.81 0,0 1,43.23 -35.66c0.21,-0.21 0.63,-0.42 0.84,-0.63 13.22,-9.23 26.86,-16.16 40.5,-20.78h0.21c11.54,-3.98 23.5,-6.08 36.3,-6.72 34.41,-2.93 65.26,3.36 92.33,19.51 29.8,16.37 41.76,37.78 41.76,37.78 4.19,7.98 12.18,13.22 20.98,13.85 0.21,0 11.55,2.1 21.83,15.53 12.18,16.16 29.37,58.12 8.39,159.47 -2.31,11.55 3.35,23.08 13.64,28.12 0.84,3.98 1.89,16.16 -6.09,44.48 -7.14,25.18 -13.01,37.14 -16.58,42.6a26.79,26.79 0,0 0,-13.43 1.68,25.83 25.83,0 0,0 -15.32,19.09c-4.19,23.71 -10.7,44.91 -19.51,62.96 -1.68,3.56 -2.52,7.34 -2.52,11.12v74.28c0,13.01 7.14,24.54 18.88,30.21 19.3,9.44 84.15,42.39 159.48,93.17 -80.37,68.41 -184.24,109.74 -297.76,109.74 -113.73,-0.41 -217.6,-41.75 -297.97,-110.16zM511.57,51.41c253.69,0 460.17,206.48 460.17,460.17 0,121.28 -47.22,231.87 -124.23,314.13 -71.97,-49.31 -135.97,-83.52 -164.93,-98v-57.49c6.93,-15.11 12.59,-31.9 16.79,-49.73 20.56,-7.76 35.04,-31.69 48.68,-79.74 12.38,-43.85 11.33,-74.7 -3.36,-92.32 15.32,-84.15 8.39,-146.26 -20.77,-184.66 -15.11,-20.14 -32.74,-28.96 -44.91,-32.74 -8.6,-12.18 -26.01,-31.9 -54.97,-47.85 -35.88,-21.19 -77,-30 -121.28,-26.23a182.97,182.97 0,0 0,-49.52 9.45h-0.21c-18.04,6.08 -35.67,15.1 -52.67,26.85a283.6,283.6 0,0 0,-52.46 43.23c-30.22,30.84 -49.94,65.67 -58.55,102.82 -7.97,30.64 -8.81,61.27 -2.31,91.48 -2.73,2.1 -5.46,4.41 -7.76,7.35 -15.11,18.25 -16.37,47.43 -3.78,92.12 8.39,29.59 19.31,60.01 38.19,74.07 5.66,28.33 14.68,54.13 27.07,76.8v46.58c-28.74,14.48 -92.96,48.68 -164.93,98C98.84,743.45 51.41,632.86 51.41,511.58c0,-253.69 206.48,-460.17 460.17,-460.17z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_live_people.xml",
    "content": "<vector android:height=\"20dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"20dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M512,1255.49M499.72,505.04c48.1,-31.42 79.93,-85.76 79.93,-147.47 0,-97.02 -79.01,-176.02 -176.02,-176.02 -97.02,0 -176.02,79.01 -176.02,176.02 0,61.61 31.83,115.95 79.93,147.47 -44.31,14.74 -84.94,39.61 -118.92,73.58 -57.41,57.41 -89.03,133.76 -89.03,214.91 0,12.49 10.03,22.51 22.51,22.51s22.51,-10.03 22.51,-22.51c0,-142.76 116.15,-258.92 258.92,-258.92s258.92,116.15 258.92,258.92c0,12.49 10.03,22.51 22.51,22.51s22.51,-10.03 22.51,-22.51c0,-81.15 -31.62,-157.5 -89.03,-214.91C584.66,544.75 544.03,519.78 499.72,505.04zM272.63,357.67c0,-72.25 58.74,-130.99 130.99,-130.99 72.25,0 130.99,58.74 130.99,130.99s-58.74,130.99 -130.99,130.99C331.47,488.67 272.63,429.92 272.63,357.67zM828.94,593.56c-34.69,-51.07 -84.02,-90.16 -141.23,-112.37 25.38,-37.76 38.89,-82.28 38.48,-128.23 -0.41,-55.88 -21.29,-109.4 -58.64,-150.74 -8.39,-9.21 -22.62,-9.93 -31.83,-1.54 -9.21,8.39 -9.93,22.62 -1.54,31.83 62.53,68.98 62.94,173.57 0.92,243.26 -1.43,1.64 -2.66,3.48 -3.48,5.32 -1.13,1.74 -1.94,3.68 -2.56,5.83 -3.27,11.97 3.89,24.36 15.86,27.63C768.67,547.72 848.59,664.18 835.19,791.28c-1.33,12.38 7.68,23.44 20.06,24.77 0.82,0.1 1.64,0.1 2.35,0.1 11.36,0 21.18,-8.6 22.41,-20.16C887.48,724.86 869.37,652.92 828.94,593.56z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_more_menu.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#8a8a8a\" android:pathData=\"M512,330.24m-49.92,0a49.92,49.92 0,1 0,99.84 0,49.92 49.92,0 1,0 -99.84,0Z\"/>\n    <path android:fillColor=\"#8a8a8a\" android:pathData=\"M512,512m-49.92,0a49.92,49.92 0,1 0,99.84 0,49.92 49.92,0 1,0 -99.84,0Z\"/>\n    <path android:fillColor=\"#8a8a8a\" android:pathData=\"M512,693.76m-49.92,0a49.92,49.92 0,1 0,99.84 0,49.92 49.92,0 1,0 -99.84,0Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_password.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/colorPrimary\" android:pathData=\"M800,832a32,32 0,0 0,32 -32L832,480a32,32 0,0 0,-32 -32L224,448a32,32 0,0 0,-32 32v320a32,32 0,0 0,32 32zM800,896L224,896a96,96 0,0 1,-96 -96L128,480a96,96 0,0 1,96 -96h576a96,96 0,0 1,96 96v320a96,96 0,0 1,-96 96z\"/>\n    <path android:fillColor=\"@color/colorPrimary\" android:pathData=\"M480,576a32,32 0,0 1,64 0v128a32,32 0,0 1,-64 0zM352,416a32,32 0,0 1,-64 0v-96a224,224 0,0 1,448 0v96a32,32 0,0 1,-64 0v-96a160,160 0,0 0,-320 0z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_refresh.xml",
    "content": "<vector android:height=\"20dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1025\" android:width=\"20dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/black_alpha_112\" android:pathData=\"M971.67,374.4c-75.2,-254.4 -342.4,-398.4 -596.8,-321.6 -83.2,24 -153.6,70.4 -209.6,128v-107.2c0,-11.2 -11.2,-19.2 -19.2,-19.2s-19.2,4.8 -19.2,19.2v156.8c0,0 0,0 0,0 0,1.6 0,3.2 0,3.2 0,0 0,0 0,0 1.6,8 6.4,16 19.2,16v0,0 0,0h156.8c11.2,0 19.2,-8 19.2,-19.2v0c0,-11.2 -8,-19.2 -19.2,-19.2h-112c51.2,-54.4 118.4,-97.6 195.2,-120 233.6,-72 478.4,60.8 548.8,294.4 19.2,65.6 24,132.8 12.8,196.8 -1.6,8 -3.2,17.6 -4.8,25.6 -1.6,4.8 0,9.6 3.2,14.4 3.2,4.8 8,8 12.8,8v0c9.6,1.6 19.2,-4.8 22.4,-14.4 1.6,-9.6 3.2,-19.2 4.8,-28.8 11.2,-68.8 8,-140.8 -14.4,-212.8z\"/>\n    <path android:fillColor=\"@color/black_alpha_112\" android:pathData=\"M899.67,792c0,0 0,0 0,0 -1.6,-8 -6.4,-16 -19.2,-16v0,0 0,0h-156.8c-11.2,0 -19.2,8 -19.2,19.2v0c0,11.2 8,19.2 19.2,19.2h108.8c-51.2,54.4 -116.8,96 -193.6,120 -233.6,70.4 -478.4,-62.4 -548.8,-296 -20.8,-70.4 -24,-142.4 -11.2,-209.6 0,-3.2 1.6,-8 3.2,-11.2 1.6,-4.8 0,-9.6 -3.2,-14.4 -3.2,-4.8 -8,-8 -12.8,-8v0c-9.6,-1.6 -19.2,4.8 -22.4,14.4 -17.6,76.8 -16,160 9.6,241.6 75.2,252.8 342.4,396.8 596.8,320 83.2,-25.6 155.2,-70.4 211.2,-129.6v110.4c0,11.2 11.2,19.2 19.2,19.2s19.2,-4.8 19.2,-19.2v-156.8c0,0 0,0 0,0 0,-1.6 0,-1.6 0,-3.2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_relay.xml",
    "content": "<vector android:height=\"20dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"20dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M117.75,927c-2.1,0 -4.23,-0.32 -6.32,-0.98A20.75,20.75 0,0 1,97 906.25c0,-227.73 67.38,-393.91 200.28,-493.92 99.89,-75.17 209.18,-91.34 267.2,-94.14L564.48,117.75c0,-8.77 5.52,-16.6 13.78,-19.55 8.27,-2.94 17.49,-0.37 23.04,6.42l321.01,393.16a20.74,20.74 0,0 1,0 26.25L602.84,915.19a20.73,20.73 0,0 1,-19.72 7.3,20.77 20.77,0 0,1 -15.97,-13.69l-1.53,-4.37c-0.74,-2.17 -1.12,-4.45 -1.12,-6.74L564.5,704.03c-175.48,2 -335.02,81.17 -429.84,214.26a20.78,20.78 0,0 1,-16.91 8.71zM571.34,662.5c4.78,0 9.56,0.05 14.36,0.16 11.27,0.26 20.28,9.47 20.28,20.75v162.32l273.47,-334.82 -273.46,-334.94v162.45c0,11.46 -9.29,20.75 -20.75,20.75 -71.58,0 -417.06,24.32 -444.95,486.21C246.04,729.45 402.26,662.5 571.34,662.5z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_right.xml",
    "content": "<vector android:height=\"20dp\"\n        android:viewportHeight=\"1024\"\n        android:viewportWidth=\"1024\"\n        android:width=\"24dp\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/black_alpha_112\"\n          android:pathData=\"M400,876.8l339.2,-339.2v-44.8L400,156.8l-44.8,44.8 313.6,313.6 -313.6,316.8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_scan_qr_code.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M302.55,302.55m46.55,0l325.82,0q46.55,0 46.55,46.55l0,325.82q0,46.55 -46.55,46.55l-325.82,0q-46.55,0 -46.55,-46.55l0,-325.82q0,-46.55 46.55,-46.55Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M907.64,954.18L628.36,954.18v-46.55h279.27L907.64,628.36h46.55v279.27a46.55,46.55 0,0 1,-46.55 46.55zM930.91,535.27L93.09,535.27a23.27,23.27 0,0 1,0 -46.55h837.82a23.27,23.27 0,0 1,0 46.55zM907.64,116.36L628.36,116.36L628.36,69.82h279.27a46.55,46.55 0,0 1,46.55 46.55v279.27h-46.55L907.64,116.36zM116.36,395.64L69.82,395.64L69.82,116.36a46.55,46.55 0,0 1,46.55 -46.55h279.27v46.55L116.36,116.36v279.27zM116.36,907.64h279.27v46.55L116.36,954.18a46.55,46.55 0,0 1,-46.55 -46.55L69.82,628.36h46.55v279.27z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_search.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M857.76,878.38a18.89,18.89 0,0 1,-12.92 -5.12l-183.3,-171.01a309.74,309.74 0,0 1,-174.61 69.56,306.6 306.6,0 0,1 -224.11,-74.96 306.6,306.6 0,0 1,-105.33 -211.44,306.49 306.49,0 0,1 74.86,-224.01 306.71,306.71 0,0 1,211.47 -105.44,306.32 306.32,0 0,1 223.97,74.96 306.49,306.49 0,0 1,105.51 211.44,306.25 306.25,0 0,1 -16.38,122.99 19.07,19.07 0,0 1,-36.05 -12.54,268.08 268.08,0 0,0 14.3,-107.8 268.68,268.68 0,0 0,-92.34 -185.31,268.78 268.78,0 0,0 -196.36,-65.71 269.14,269.14 0,0 0,-185.38 92.41,268.54 268.54,0 0,0 -65.64,196.36 268.57,268.57 0,0 0,92.37 185.34,268.71 268.71,0 0,0 196.36,65.71 267.65,267.65 0,0 0,164.69 -71.12,19 19,0 0,1 24.01,-1.55 16.1,16.1 0,0 1,2.75 2.15l195.09,182.06a19,19 0,0 1,-12.96 33.02z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_toggle_down.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#bfbfbf\" android:pathData=\"M875.62,313.96c-5.22,0 -10.55,1.95 -14.44,5.94L526.44,654.64c-3.99,3.99 -9.22,6.04 -14.44,6.04s-10.44,-2.05 -14.44,-6.04L162.82,319.9c-3.99,-3.99 -9.22,-5.94 -14.44,-5.94s-10.55,1.95 -14.44,5.94c-7.99,7.99 -7.99,20.99 0,28.98l349.18,349.18c7.99,7.99 18.43,11.98 28.98,11.98 10.44,0 20.99,-3.99 28.98,-11.98l349.18,-349.18c7.99,-7.99 7.99,-20.99 0,-28.98 -4.1,-3.99 -9.42,-5.94 -14.64,-5.94z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_toggle_up.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#8a8a8a\" android:pathData=\"M512,313.96c-10.44,0 -20.99,3.99 -28.98,11.98l-349.18,349.18c-7.99,7.99 -7.99,20.99 0,28.98 3.99,3.99 9.22,5.94 14.44,5.94s10.55,-1.95 14.44,-5.94l334.64,-334.64c3.99,-3.99 9.22,-6.04 14.44,-6.04s10.44,2.05 14.44,6.04L861.18,704.1c3.99,3.99 9.22,5.94 14.44,5.94s10.55,-1.95 14.44,-5.94c7.99,-7.99 7.99,-20.99 0,-28.98l-349.18,-349.18c-7.88,-7.99 -18.43,-11.98 -28.88,-11.98z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_tv.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/black_alpha_64\" android:pathData=\"M956.79,500.08c-5.82,-76.15 -3.17,-150.8 -4.75,-226.93 -0.56,-27.27 3.75,-77 -20.7,-97.92 -22,-18.79 -55.6,-10.64 -81.66,-8.16 -83.93,8 -166,11.23 -250.27,13.55 -12.34,0.34 -24.61,1 -36.91,1.59a14.43,14.43 0,0 0,-3.14 -0.79c-87.78,-5.65 -167.35,8.16 -254,18.13 -73.42,8.45 -139.23,3.38 -211.56,0.35 -8.44,-0.35 -16.29,4.84 -20.59,11.81 -19.4,31.43 -3.09,66.58 1.85,101.84 10.69,76.18 8.69,151.37 13.69,227.92 5.34,81.69 14.75,166.7 29.69,247.19 5.36,28.88 10.53,51.37 40.18,64.51 43.64,19.35 110.94,-3.72 155.54,-6.16 73.24,-4 146.38,-3.47 219.71,-8.15 83.25,-5.32 166.43,-1.71 249.74,-0.28 38.78,0.66 90.13,7.88 124.11,-17 29.78,-21.8 36.92,-58.17 41.84,-92.7a1041.2,1041.2 0,0 0,7.23 -228.8zM119.79,266.93l-0.87,-6.47q-12.6,-24.41 2.44,-8.83c-0.57,0.35 59.18,3.77 55.18,4.4 12.92,-0.25 25.79,-1.12 38.67,-2 -1.88,33.49 -27.85,57.35 -45.4,84.19 -13.48,20.63 -24.66,42.8 -35.09,65.23 -6.63,-44.36 -21.93,-101.09 -14.89,-136.52zM801.4,776.6c-71.39,-0.16 -142.8,-2.67 -214.17,0.23 -32,1.3 -63.79,4.07 -95.63,6.58 12.81,-21.35 28.5,-40.26 45.76,-58.65 3,-3.2 -1.8,-8 -4.82,-4.82 -18.93,20 -36.57,40.7 -50.77,64.18 -25,1.9 -50.07,3.59 -75.23,4 -2.9,0 -6.13,0.32 -9.17,0.47 9.82,-19.88 27.8,-38.27 37.79,-55.55 1.78,-3.08 -2.9,-5.8 -4.76,-2.78C418.84,749 399.23,767.75 389,789c-51.95,3.71 -119.73,18 -165,9.18 -35.76,-7 -49.91,-32.38 -56.81,-63.34a4.68,4.68 0,0 0,1.47 -3.21c0.82,-35 20.29,-67.64 34.47,-98.92 12.8,-28.24 25.7,-56.43 37.94,-84.91 1.93,-4.49 -4.67,-8.42 -6.64,-3.88 -15.84,36.55 -33.17,72.38 -50.07,108.44 -8.25,17.59 -16.82,34.77 -21.84,53.11 -1.93,-16.92 -3.11,-34.27 -5.39,-50.37 -1.79,-12.68 -3.1,-25.32 -4.59,-38 10.06,-25.69 17.53,-52.78 29.2,-77.5 17.8,-37.7 37.29,-73.74 50.15,-113.57 1.41,-4.38 -5.4,-6.2 -6.86,-1.89 -14.89,44 -38.27,83 -57.73,124.9 -6.74,14.49 -12.12,29.52 -17.61,44.49q-3.8,-36.27 -6.48,-72.55c14.73,-25.6 23.74,-54.1 36.63,-80.86 18.86,-39.18 40.88,-76.83 61.8,-114.93 2.79,-5.08 -5,-9.62 -7.77,-4.54 -21,38 -43,75.64 -62.7,114.4 -10.73,21.16 -19.08,43.33 -29.49,64.45q-2.31,-35.07 -4,-70.38c-0.1,-2.1 -0.45,-4.54 -0.64,-6.76 14.59,-33.44 30.33,-66.55 51.51,-96.34 16.24,-22.85 33.1,-44 33.92,-72.39 56.89,-4.3 113.44,-13.65 170,-23 34,-1.61 68.06,-2.8 102,-3 68.35,-0.3 136.7,0.69 205,2 32.19,0.62 64.19,2.11 96.36,0.09 20.88,-1.32 60.27,-16.86 78,-8.1 42,20.7 18.25,138.77 18.44,177.88 0.3,61.43 10.09,122.55 8.93,183.95 -1.36,73.3 -5.05,193.36 -99.8,193.15z\"/>\n    <path android:fillColor=\"@color/black_alpha_64\" android:pathData=\"M176.59,256c-0.57,0 -1.14,0.08 -1.72,0.09a15.12,15.12 0,0 0,1.72 -0.09zM697.66,454.59c-32.19,-35.85 -78.54,-52.94 -122.12,-70.9 -44.38,-18.29 -97.18,-71.78 -148.9,-67.44 -24.39,2 -30.1,12 -32.12,34.54 -1.21,13.55 2.08,27.45 5.05,40.92 -5.31,38.19 -9,72.25 -3.84,114 6.64,53.91 11.41,106.15 14,160.27 1.07,22.29 24.56,37.46 44.83,25.72 88.3,-51.15 191.36,-113.62 247.68,-201.47 7.34,-11.37 3.95,-26.15 -4.58,-35.64zM464.54,615.44c-3.53,-31.19 -4.92,-61.48 -11.55,-94 -2.12,-10.39 -1.65,-20.68 -1.65,-30.94v-5.87c0,-44.44 -1.82,-87.25 -12.06,-130.72 6.83,-0.3 15.77,3.38 32,12.81 28,16.19 50,38.58 78.82,53.94s63.68,31 88.32,54.72c-49.29,55.03 -111.19,100.2 -173.88,140.06zM243,628.37c-8.44,27.68 -17.12,55.35 -28.41,82 -8.18,19.31 -17.84,37.1 -19.13,58.4 -0.39,6.53 9.77,6.51 10.16,0 1.46,-24.23 14.61,-45.77 22.9,-68.17 8.52,-23 15.6,-46.5 22.45,-70.06 1.5,-5.1 -6.42,-7.26 -7.97,-2.17zM292.59,685c-9.09,36.35 -39.12,63.62 -40.23,102.4 -0.14,5 7.93,5.05 7.84,0 -0.69,-37.6 28.14,-65.81 34.08,-101.94 0.17,-1.11 -1.41,-1.6 -1.69,-0.46zM365.13,719.73c-8.87,10.73 -18.75,20.57 -27.52,31.4 -8.27,10.2 -18.33,21.69 -20.15,35.17 -0.67,5 6.86,7.24 7.7,2.12 4.09,-25.06 29.89,-44.8 45.21,-63.46 2.99,-3.64 -2.2,-8.91 -5.24,-5.23z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_img_up_name.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#bfbfbf\" android:pathData=\"M800,128L224,128C134.4,128 64,198.4 64,288v448c0,89.6 70.4,160 160,160h576c89.6,0 160,-70.4 160,-160L960,288c0,-89.6 -70.4,-160 -160,-160zM896,736c0,54.4 -41.6,96 -96,96L224,832c-54.4,0 -96,-41.6 -96,-96L128,288c0,-54.4 41.6,-96 96,-96h576c54.4,0 96,41.6 96,96v448z\"/>\n    <path android:fillColor=\"#bfbfbf\" android:pathData=\"M419.2,544c0,51.2 -3.2,108.8 -83.2,108.8S252.8,595.2 252.8,544v-217.6L192,326.4v243.2c0,96 51.2,140.8 140.8,140.8 89.6,0 147.2,-48 147.2,-144v-240h-60.8L419.2,544zM710.4,326.4h-156.8L553.6,704h60.8v-147.2h96c102.4,0 121.6,-67.2 121.6,-115.2 0,-44.8 -19.2,-115.2 -121.6,-115.2zM707.2,505.6h-92.8L614.4,384h92.8c32,0 60.8,12.8 60.8,60.8 0,44.8 -32,60.8 -60.8,60.8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"108dp\"\n        android:width=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path android:fillColor=\"@color/colorPrimary\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n    <!--<path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"-->\n          <!--android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>-->\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_big_vip.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M579.49,546.91zM572.51,544.58v-2.33,2.33zM512,116.36C293.24,116.36 116.36,293.24 116.36,512s176.87,395.64 395.64,395.64 395.64,-176.87 395.64,-395.64S730.76,116.36 512,116.36zM379.35,404.95h20.95c0,2.33 -4.65,2.33 -6.98,2.33h-6.98c-2.33,0 -4.65,0 -6.98,-2.33 0,2.33 0,2.33 0,0zM363.05,407.27c4.65,0 9.31,0 11.64,-2.33h2.33c-6.98,0 -13.96,2.33 -23.27,2.33h9.31zM328.15,411.93c4.65,0 6.98,0 11.64,-2.33 -2.33,2.33 -6.98,2.33 -11.64,2.33zM321.16,414.25c-9.31,2.33 -16.29,4.65 -25.6,6.98L295.56,418.91c9.31,-2.33 18.62,-4.65 25.6,-4.65zM521.31,491.05l-11.64,2.33 -2.33,2.33 -2.33,4.65v4.65l2.33,-4.65v-2.33l2.33,2.33 2.33,-2.33 2.33,2.33 -2.33,-2.33 2.33,2.33 2.33,2.33v2.33l-2.33,2.33 -2.33,4.65h-2.33l2.33,2.33 2.33,2.33 -4.65,9.31 -4.65,9.31v2.33l-2.33,6.98v4.65h-2.33l-2.33,-2.33L498.04,553.89l-2.33,2.33v2.33l2.33,-2.33v-4.65l2.33,2.33v2.33l2.33,2.33v4.65l-2.33,2.33 -2.33,2.33 2.33,2.33v4.65,-2.33l-2.33,4.65 2.33,2.33h-2.33l-9.31,2.33v-11.64l2.33,-4.65v-4.65L488.73,560.87v-4.65,4.65h-2.33L486.4,558.55l2.33,-2.33h2.33l2.33,-2.33v-6.98h2.33l2.33,-4.65v-2.33l-2.33,-2.33 -2.33,2.33h-2.33L491.05,535.27l-2.33,2.33 -2.33,6.98 -2.33,9.31v4.65l-4.65,2.33v4.65h2.33v4.65l4.65,2.33h-2.33l2.33,4.65 -4.65,2.33v4.65l2.33,2.33 -4.65,4.65v-4.65l-2.33,-2.33h-4.65,2.33L474.76,581.82v2.33l-2.33,2.33v-2.33h-2.33L470.11,577.16v4.65l-4.65,4.65 -2.33,2.33v11.64h2.33l2.33,-2.33v4.65l-2.33,-2.33h-2.33l-2.33,4.65v-2.33,2.33 -2.33l-2.33,2.33v2.33l-2.33,2.33 -2.33,4.65v2.33l-2.33,2.33v4.65h2.33v-2.33l4.65,-4.65v-2.33,4.65l-2.33,2.33 -2.33,4.65h2.33v2.33h-4.65L451.49,635.35v-2.33l-2.33,2.33 -2.33,-2.33L446.84,640l-2.33,4.65v2.33l-2.33,2.33 -2.33,4.65v4.65h2.33l-2.33,2.33v2.33l-2.33,4.65 -4.65,9.31v2.33l-4.65,4.65v2.33l-2.33,2.33h2.33v2.33l-2.33,2.33 -9.31,4.65v11.64l-4.65,2.33 2.33,2.33 -2.33,4.65h-2.33v2.33l-4.65,2.33v2.33l-2.33,4.65 -2.33,4.65 -2.33,4.65 -2.33,2.33 -2.33,2.33 -4.65,2.33h-2.33v2.33l2.33,2.33h-4.65l-2.33,2.33h-2.33l-2.33,2.33L372.36,756.36v4.65h-2.33l-9.31,2.33 -4.65,2.33h-2.33l-2.33,2.33h-4.65l2.33,-2.33h-2.33l-2.33,2.33h-2.33l-2.33,2.33h-6.98l-4.65,2.33h-6.98l-2.33,2.33h-25.6l-9.31,-2.33h-2.33l-11.64,-4.65 -6.98,-9.31 -6.98,-2.33v-4.65l-4.65,-2.33 -6.98,-2.33 -4.65,-4.65 -2.33,2.33v-2.33h4.65l-4.65,-2.33v-2.33l-2.33,-4.65v-2.33l4.65,-6.98L239.71,721.45h2.33l4.65,-2.33h2.33l2.33,-2.33h-2.33L256,716.8l2.33,-4.65h2.33l6.98,-2.33 6.98,-4.65v-2.33h2.33v2.33l2.33,-2.33L279.27,698.18h2.33l2.33,-2.33h2.33l2.33,-4.65 16.29,-16.29 2.33,-4.65 4.65,-6.98 2.33,-4.65 2.33,-2.33 2.33,-4.65 4.65,-2.33 2.33,-4.65 2.33,-2.33v-2.33h2.33v2.33h2.33l2.33,-4.65v-4.65l2.33,-2.33v2.33l2.33,-2.33 2.33,-2.33v-4.65,2.33l4.65,-2.33 2.33,-6.98v-2.33l2.33,-4.65 2.33,-2.33 2.33,-2.33v2.33l44.22,-69.82 2.33,-4.65h-2.33l2.33,-2.33v-2.33l2.33,-4.65h2.33v-2.33l2.33,-2.33v2.33l2.33,-2.33v-4.65l9.31,-9.31 -11.64,-2.33v-2.33l2.33,-2.33v-2.33l2.33,-4.65h-2.33v2.33l-2.33,-2.33L409.6,488.73c-4.65,0 -6.98,0 -11.64,2.33 -2.33,0 -6.98,0 -9.31,2.33 -2.33,2.33 -4.65,2.33 -6.98,2.33 -6.98,2.33 0,2.33 -4.65,4.65 -2.33,0 -4.65,2.33 -6.98,4.65 -2.33,2.33 -6.98,4.65 -11.64,4.65L349.09,509.67c2.33,0 4.65,-2.33 6.98,-2.33 2.33,0 4.65,0 6.98,-2.33 -11.64,0 -32.58,2.33 -30.25,2.33 -2.33,-2.33 -4.65,-2.33 -6.98,0 0,2.33 0,2.33 -4.65,2.33 2.33,0 2.33,-2.33 4.65,-2.33 -4.65,0 -6.98,0 -9.31,2.33 -2.33,2.33 -4.65,0 -2.33,0h-2.33c-2.33,2.33 -2.33,4.65 -4.65,4.65h-6.98c-2.33,0 -4.65,0 -6.98,2.33 0,0 -2.33,0 -2.33,2.33 -2.33,-2.33 -9.31,-4.65 -9.31,-4.65 -2.33,-2.33 -6.98,-4.65 -6.98,-9.31 0,0 -2.33,-4.65 -4.65,-6.98 0,-2.33 -4.65,-9.31 -6.98,-9.31 0,-2.33 -2.33,-6.98 -2.33,-6.98 -4.65,-4.65 -4.65,-13.96 -6.98,-18.62 -2.33,-2.33 -2.33,-6.98 -2.33,-11.64h-2.33c0,-2.33 0,-9.31 2.33,-11.64v-9.31c0,-2.33 -2.33,-6.98 -2.33,-9.31 0,-4.65 0,-9.31 4.65,-11.64 0,0 2.33,0 2.33,4.65 0,2.33 2.33,2.33 4.65,2.33 4.65,0 6.98,0 11.64,-2.33h2.33c2.33,0 4.65,2.33 6.98,0 2.33,-2.33 4.65,-2.33 6.98,-2.33h2.33c-2.33,2.33 -6.98,6.98 -9.31,6.98 -2.33,0 -4.65,2.33 -4.65,2.33 2.33,0 4.65,0 6.98,-2.33v2.33c6.98,0 11.64,0 18.62,-2.33 6.98,0 16.29,-2.33 23.27,-2.33 13.96,0 25.6,-4.65 37.24,-6.98 9.31,-2.33 41.89,-9.31 48.87,-9.31h4.65c0,-2.33 2.33,-2.33 4.65,-2.33v2.33h2.33l2.33,-2.33h9.31c0,-2.33 0,-4.65 2.33,-4.65 0,0 -2.33,0 -2.33,2.33v-4.65c0,2.33 2.33,2.33 2.33,2.33h4.65v-4.65l2.33,-2.33 2.33,-2.33h-2.33v-2.33l2.33,-2.33v-4.65h-2.33L444.51,372.36L442.18,372.36v-2.33l2.33,-4.65 -2.33,2.33L442.18,360.73l2.33,-2.33L444.51,349.09l2.33,-4.65 -2.33,-9.31v-11.64l-2.33,-4.65 -2.33,-20.95 -2.33,-2.33v-2.33l-2.33,-2.33 2.33,-4.65h-2.33v-4.65l-6.98,-2.33v-6.98l-2.33,-6.98 -2.33,-2.33 2.33,-4.65 -6.98,-2.33 2.33,-2.33v-2.33L418.91,251.35l-2.33,-4.65 -2.33,-2.33v-4.65l2.33,-2.33L416.58,232.73h2.33l2.33,-2.33h2.33l2.33,-2.33h4.65v-2.33h-2.33L449.16,225.75l4.65,2.33 2.33,-2.33h2.33l4.65,2.33h2.33v-2.33L472.44,225.75l4.65,2.33 4.65,2.33h6.98l4.65,2.33 6.98,4.65 2.33,2.33h2.33l2.33,2.33 4.65,2.33 2.33,2.33v4.65l6.98,4.65 2.33,4.65 4.65,4.65 2.33,4.65 2.33,-2.33 2.33,2.33 2.33,4.65h2.33l2.33,4.65 2.33,4.65 2.33,2.33h2.33v2.33l2.33,2.33v2.33l2.33,2.33v2.33l2.33,4.65 -2.33,2.33h2.33l2.33,4.65v13.96h2.33l-2.33,6.98v6.98l-2.33,2.33v4.65l2.33,2.33 -2.33,4.65 -2.33,2.33 2.33,2.33 -6.98,9.31 2.33,4.65v4.65h-2.33v9.31l4.65,-2.33h-2.33,2.33c2.33,2.33 4.65,0 4.65,0 2.33,0 4.65,-2.33 4.65,-2.33h4.65v-2.33h2.33c2.33,0 2.33,0 2.33,-2.33 4.65,-2.33 9.31,0 13.96,-2.33 2.33,0 6.98,-4.65 9.31,-6.98 2.33,0 2.33,-2.33 4.65,-2.33h-6.98l-2.33,-4.65h2.33c0,-2.33 2.33,-4.65 2.33,-4.65h4.65v-2.33c2.33,0 2.33,0 2.33,2.33 0,0 2.33,0 2.33,-2.33s2.33,-2.33 2.33,-4.65v4.65c2.33,0 2.33,0 4.65,-2.33l2.33,-2.33L621.38,346.76c0,-2.33 0,-2.33 2.33,-2.33 2.33,-2.33 4.65,-2.33 4.65,-2.33h2.33s4.65,2.33 4.65,0c0,0 2.33,-2.33 4.65,-2.33l-2.33,-2.33 -2.33,2.33c-2.33,0 -4.65,-2.33 -2.33,-2.33 2.33,-2.33 4.65,-2.33 6.98,-2.33 0,0 0,-2.33 2.33,-2.33h4.65s2.33,2.33 4.65,2.33c0,0 4.65,-6.98 6.98,-6.98 2.33,0 2.33,2.33 2.33,2.33v2.33c2.33,-2.33 2.33,0 4.65,0v2.33c2.33,0 2.33,0 2.33,-2.33 0,0 2.33,0 2.33,-2.33s2.33,-2.33 4.65,0l2.33,2.33c2.33,0 2.33,0 4.65,2.33h4.65s0,-2.33 2.33,-2.33c0,2.33 0,2.33 2.33,2.33l2.33,-2.33c2.33,0 2.33,2.33 2.33,2.33s0,2.33 2.33,0c0,0 4.65,2.33 4.65,4.65s0,2.33 2.33,4.65h2.33c2.33,0 2.33,0 2.33,-2.33s4.65,-2.33 4.65,-2.33l4.65,-4.65h2.33v9.31s2.33,2.33 0,2.33h2.33v4.65c0,-2.33 2.33,-4.65 2.33,-6.98l2.33,-4.65s2.33,0 2.33,2.33c0,-2.33 2.33,-6.98 4.65,-6.98 0,-2.33 2.33,0 4.65,-2.33l2.33,-2.33 2.33,-2.33 2.33,2.33v4.65l2.33,-2.33c0,4.65 2.33,2.33 4.65,4.65 0,0 -2.33,2.33 -2.33,4.65 0,0 2.33,2.33 0,4.65v2.33l2.33,-2.33s2.33,0 2.33,2.33 2.33,2.33 0,4.65c-2.33,-2.33 -2.33,0 -4.65,0 0,2.33 -2.33,2.33 -2.33,4.65v-2.33,-4.65c-2.33,0 -2.33,2.33 -2.33,6.98 -2.33,-2.33 -2.33,-2.33 -2.33,0v2.33l-2.33,2.33h2.33c2.33,0 4.65,0 4.65,2.33v2.33c0,-2.33 2.33,-4.65 2.33,-6.98h2.33l-2.33,-2.33h2.33c2.33,0 2.33,0 2.33,2.33s0,2.33 2.33,4.65c2.33,0 2.33,2.33 2.33,2.33v4.65h2.33v2.33c0,2.33 2.33,4.65 0,4.65l-2.33,2.33c-2.33,2.33 4.65,2.33 4.65,2.33v2.33c-2.33,2.33 2.33,2.33 0,4.65 13.96,44.22 -6.98,62.84 -9.31,62.84l-2.33,2.33h-4.65c0,2.33 -11.64,11.64 -13.96,11.64v-6.98,2.33c-2.33,0 -4.65,2.33 -2.33,4.65v2.33l-2.33,2.33c0,-2.33 -2.33,-2.33 -2.33,-4.65l-2.33,-2.33s-2.33,6.98 -2.33,4.65v2.33c0,-2.33 -2.33,-9.31 -2.33,-11.64 -2.33,-2.33 -2.33,9.31 -4.65,9.31l-4.65,-4.65c0,-2.33 -4.65,-9.31 -4.65,-9.31v6.98h-2.33v-4.65s0,2.33 -2.33,0c0,-2.33 -4.65,-4.65 -4.65,-2.33v6.98c-2.33,-2.33 -2.33,-2.33 -2.33,-4.65 -2.33,0 -6.98,-2.33 -6.98,-2.33l-2.33,-2.33v2.33h-2.33c0,-2.33 -4.65,-2.33 -4.65,-2.33s2.33,-2.33 0,-2.33l-2.33,2.33h-4.65c-2.33,0 -2.33,2.33 0,2.33h-4.65c0,2.33 0,2.33 -2.33,2.33 0,0 -2.33,-2.33 -2.33,-4.65 -2.33,0 -4.65,2.33 -4.65,2.33L651.64,456.15c-2.33,0 -4.65,0 -4.65,-2.33l-6.98,4.65c0,-2.33 -2.33,-2.33 -2.33,-2.33v4.65c-4.65,0 -9.31,4.65 -13.96,6.98h-6.98L602.76,467.78L602.76,465.45h-2.33c-2.33,0 -4.65,-2.33 -2.33,-2.33h-4.65c2.33,0 2.33,2.33 4.65,4.65 0,2.33 -2.33,2.33 -2.33,2.33l-4.65,-2.33h-4.65s-4.65,-2.33 -4.65,-4.65h-2.33c2.33,0 4.65,2.33 4.65,2.33s-6.98,4.65 -6.98,2.33h-2.33c-2.33,0 -6.98,2.33 -6.98,2.33 -9.31,0 -4.65,2.33 -16.29,2.33 0,2.33 0,2.33 2.33,2.33h-2.33c0,2.33 0,2.33 2.33,2.33 -2.33,0 -4.65,0 -6.98,2.33 0,-2.33 2.33,-2.33 2.33,-4.65 -4.65,2.33 -9.31,2.33 -13.96,2.33v2.33c9.31,0 16.29,2.33 9.31,2.33h-2.33c4.65,0 0,2.33 0,4.65l-18.62,2.33 -2.33,2.33zM549.24,370.04c2.33,-2.33 4.65,-2.33 6.98,-2.33h-2.33,-2.33 2.33c0,4.65 -2.33,4.65 -4.65,2.33 0,2.33 2.33,2.33 0,0zM791.27,695.85v9.31,-4.65 2.33h-4.65l-4.65,18.62v9.31l-2.33,2.33v2.33l-2.33,2.33v2.33L770.33,740.07l-2.33,4.65h-4.65v4.65,-2.33 4.65h-2.33v-2.33L761.02,756.36v-4.65,2.33h-2.33L758.69,761.02h-2.33l-2.33,2.33h-2.33v2.33,-4.65 2.33l-2.33,4.65v-9.31,2.33l-2.33,4.65v2.33,-11.64l-2.33,-2.33 -2.33,-4.65L742.4,744.73L735.42,744.73l-2.33,-2.33h-4.65l-2.33,-2.33L721.45,740.07v2.33,-4.65l-2.33,-2.33h-2.33v-4.65h-9.31v-2.33l-2.33,-2.33h-2.33l-4.65,-6.98 -6.98,-6.98 -6.98,-4.65h-2.33v-2.33l-2.33,-2.33 -2.33,-2.33L674.91,700.51L674.91,698.18h-4.65v-2.33L616.73,651.64v-2.33h-2.33l-2.33,-2.33v2.33h-2.33l-2.33,-4.65v-2.33l-4.65,-4.65h-2.33l-9.31,-9.31 -4.65,-4.65 -2.33,-2.33 -2.33,-2.33 -2.33,-4.65h-2.33l-2.33,-2.33h-2.33v-2.33h-2.33l-2.33,-2.33v-4.65l-2.33,-2.33h-2.33l-2.33,-2.33 -2.33,-2.33 -2.33,-2.33 -2.33,-2.33 -2.33,-2.33h-2.33v-2.33l-4.65,-4.65h-2.33,2.33v-2.33,2.33L551.56,581.82v2.33h4.65,-2.33L553.89,581.82h2.33l-2.33,-2.33 -2.33,-2.33 -2.33,-2.33h-2.33l-2.33,-2.33v-2.33h2.33l-16.29,-11.64h-4.65l-2.33,-2.33v-2.33h-2.33v-2.33h11.64l4.65,2.33h2.33v2.33h2.33v2.33L549.24,558.55l2.33,-2.33L558.55,556.22L558.55,549.24h2.33v2.33l2.33,2.33h11.64,-2.33l-2.33,-2.33v-2.33h-2.33,2.33l2.33,2.33h2.33,-2.33 2.33l2.33,2.33h2.33v2.33h4.65L584.15,549.24h2.33v-2.33h2.33v-2.33l-2.33,-2.33h2.33v-2.33h-2.33v-2.33h-2.33L584.15,535.27h2.33l2.33,2.33h4.65v2.33l2.33,-2.33h2.33v2.33h2.33l-2.33,-2.33L598.11,535.27 598.11,542.25h2.33v-2.33h-2.33,2.33l4.65,2.33h4.65l2.33,2.33h2.33l2.33,2.33v2.33h4.65l4.65,2.33h2.33v-2.33L635.35,549.24l4.65,2.33v2.33h2.33l2.33,2.33h2.33l6.98,4.65v2.33l4.65,2.33h4.65l4.65,4.65 9.31,6.98 2.33,2.33 2.33,2.33h2.33v-2.33h4.65l2.33,2.33h2.33v2.33h13.96v2.33h4.65v2.33h2.33v2.33h4.65v2.33h4.65v2.33L730.76,595.78l2.33,2.33h2.33v2.33l2.33,2.33h2.33l2.33,2.33v2.33h2.33l2.33,2.33h2.33v2.33l2.33,2.33h9.31l2.33,2.33v2.33l2.33,2.33 4.65,2.33 2.33,4.65h2.33v2.33l4.65,4.65 4.65,6.98v4.65l6.98,48.87v-2.33,2.33z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_buyset.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M788.95,209.45L235.05,209.45C169.89,209.45 116.36,262.98 116.36,328.15v102.4c46.55,0 81.45,37.24 81.45,81.45S162.91,593.45 116.36,593.45v102.4c0,65.16 53.53,118.69 118.69,118.69L791.27,814.55c65.16,0 118.69,-53.53 118.69,-118.69L909.96,328.15C907.64,262.98 854.11,209.45 788.95,209.45zM705.16,679.56c0,27.93 -23.27,51.2 -51.2,51.2 -27.93,0 -51.2,-23.27 -51.2,-51.2L602.76,344.44c0,-27.93 23.27,-51.2 51.2,-51.2 27.93,0 51.2,23.27 51.2,51.2v335.13z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_circle.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\"\n          android:pathData=\"M480,64C250.24,64 64,250.24 64,480 64,709.76 250.24,896 480,896c229.76,0 416,-186.24 416,-416C896,250.24 709.76,64 480,64zM480,832C285.44,832 128,674.56 128,480 128,285.44 285.44,128 480,128 674.56,128 832,285.44 832,480 832,674.56 674.56,832 480,832z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_collect.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M905.6,355.2l-166.4,-25.6c-41.6,-6.4 -80,-35.2 -96,-73.6l-73.6,-153.6c-22.4,-51.2 -92.8,-51.2 -118.4,0L380.8,256c-19.2,38.4 -54.4,67.2 -96,73.6l-166.4,25.6c-51.2,6.4 -73.6,70.4 -35.2,108.8l124.8,128c28.8,28.8 41.6,70.4 35.2,112l-28.8,179.2c-9.6,54.4 48,92.8 96,67.2l140.8,-76.8c38.4,-22.4 86.4,-22.4 124.8,0l140.8,76.8c48,25.6 102.4,-12.8 96,-67.2l-32,-179.2c-6.4,-41.6 6.4,-83.2 35.2,-112l124.8,-128c38.4,-38.4 16,-102.4 -35.2,-108.8zM876.8,438.4l-105.6,108.8c-41.6,41.6 -60.8,102.4 -51.2,163.2l25.6,153.6c3.2,12.8 -12.8,22.4 -22.4,16l-118.4,-64c-57.6,-32 -128,-32 -185.6,0l-118.4,64c-12.8,6.4 -25.6,-3.2 -22.4,-16l25.6,-153.6c9.6,-57.6 -9.6,-118.4 -51.2,-163.2l-105.6,-108.8c-9.6,-9.6 -3.2,-25.6 9.6,-25.6l134.4,-19.2c64,-9.6 118.4,-51.2 144,-108.8l60.8,-131.2c6.4,-12.8 22.4,-12.8 28.8,0l60.8,131.2c25.6,57.6 80,96 144,105.6l134.4,19.2c16,6.4 19.2,19.2 12.8,28.8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_create_center.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M512,139.64C332.8,139.64 186.18,286.25 186.18,465.45c0,109.38 53.53,209.45 144.29,269.96v90.76c0,32.58 25.6,58.18 58.18,58.18h246.69c32.58,0 58.18,-25.6 58.18,-58.18v-90.76C784.29,674.91 837.82,572.51 837.82,465.45c0,-179.2 -146.62,-325.82 -325.82,-325.82zM481.75,321.16c0,-16.29 13.96,-32.58 30.25,-32.58h2.33c9.31,0 16.29,2.33 20.95,9.31 6.98,6.98 9.31,13.96 9.31,23.27v23.27c0,16.29 -13.96,32.58 -30.25,32.58L512,377.02c-16.29,0 -30.25,-13.96 -30.25,-32.58v-23.27zM349.09,381.67c-4.65,-6.98 -4.65,-16.29 -2.33,-23.27 2.33,-9.31 6.98,-13.96 13.96,-18.62l2.33,-2.33c4.65,-2.33 9.31,-4.65 16.29,-4.65 11.64,0 20.95,6.98 27.93,16.29l11.64,20.95c4.65,6.98 4.65,16.29 2.33,23.27 -2.33,9.31 -6.98,13.96 -13.96,18.62l-2.33,2.33c-4.65,2.33 -9.31,4.65 -16.29,4.65 -11.64,0 -20.95,-6.98 -27.93,-16.29l-11.64,-20.95zM637.67,539.93l-86.11,48.87v114.04c0,20.95 -18.62,39.56 -39.56,39.56s-39.56,-18.62 -39.56,-39.56v-114.04l-86.11,-48.87c-18.62,-11.64 -25.6,-34.91 -13.96,-53.53 11.64,-18.62 34.91,-25.6 53.53,-13.96l86.11,48.87 86.11,-48.87c18.62,-11.64 44.22,-4.65 53.53,13.96s4.65,44.22 -13.96,53.53zM686.55,381.67l-11.64,20.95c-4.65,9.31 -16.29,16.29 -27.93,16.29 -4.65,0 -11.64,-2.33 -16.29,-4.65l-2.33,-2.33c-6.98,-4.65 -11.64,-11.64 -13.96,-18.62 -2.33,-9.31 0,-16.29 2.33,-23.27l11.64,-20.95c4.65,-9.31 16.29,-16.29 27.93,-16.29 4.65,0 11.64,2.33 16.29,4.65l2.33,2.33c6.98,4.65 11.64,11.64 13.96,18.62 4.65,6.98 2.33,13.96 -2.33,23.27z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_free_flow.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M388.65,470.11h246.69v246.69H388.65z\"/>\n    <path android:fillColor=\"#707070\" android:pathData=\"M807.56,269.96L656.29,139.64c-16.29,-13.96 -39.56,-23.27 -62.84,-23.27L279.27,116.36C225.75,116.36 183.85,158.25 183.85,211.78L183.85,814.55c0,51.2 41.89,95.42 95.42,95.42h465.45c51.2,0 95.42,-41.89 95.42,-95.42L840.15,342.11c0,-27.93 -11.64,-53.53 -32.58,-72.15zM728.44,733.09c0,41.89 -34.91,76.8 -76.8,76.8L372.36,809.89c-41.89,0 -76.8,-34.91 -76.8,-76.8L295.56,451.49c0,-41.89 34.91,-76.8 76.8,-76.8h279.27c41.89,0 76.8,34.91 76.8,76.8v281.6z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_history.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M512,64C265.6,64 64,265.6 64,512s201.6,448 448,448 448,-201.6 448,-448S758.4,64 512,64zM512,896C300.8,896 128,723.2 128,512S300.8,128 512,128s384,172.8 384,384 -172.8,384 -384,384z\"/>\n    <path android:fillColor=\"#707070\" android:pathData=\"M544,499.2V256c0,-19.2 -16,-32 -32,-32 -19.2,0 -32,16 -32,32v256c0,12.8 6.4,19.2 12.8,25.6l179.2,179.2c12.8,12.8 32,12.8 44.8,0 12.8,-12.8 12.8,-35.2 0,-44.8L544,499.2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_home.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M849.45,793.6c0,67.49 -58.18,125.67 -128,125.67L302.55,919.27c-72.15,0 -128,-58.18 -128,-125.67v-302.55L116.36,491.05v302.55c0,100.07 86.11,183.85 186.18,183.85h418.91c104.73,0 186.18,-81.45 186.18,-183.85v-302.55h-58.18v302.55zM989.09,437.53L525.96,51.2c-9.31,-6.98 -20.95,-6.98 -30.25,0L34.91,437.53c-11.64,9.31 -13.96,27.93 -4.65,39.56s27.93,13.96 41.89,4.65L512,114.04l439.85,367.71c11.64,9.31 30.25,6.98 41.89,-4.65s9.31,-30.25 -4.65,-39.56z\"/>\n    <path android:fillColor=\"#707070\" android:pathData=\"M535.27,523.64c18.62,0 34.91,16.29 34.91,34.91v46.55c0,18.62 -16.29,34.91 -34.91,34.91h-46.55c-18.62,0 -34.91,-16.29 -34.91,-34.91v-46.55c0,-18.62 16.29,-34.91 34.91,-34.91h46.55m0,-58.18h-46.55c-51.2,0 -93.09,41.89 -93.09,93.09v46.55c0,51.2 41.89,93.09 93.09,93.09h46.55c51.2,0 93.09,-41.89 93.09,-93.09v-46.55c0,-51.2 -41.89,-93.09 -93.09,-93.09z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_next_watch.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M619.05,423.56l-214.11,-151.27c-4.65,-4.65 -9.31,-4.65 -16.29,-4.65 -13.96,0 -25.6,11.64 -25.6,23.27L363.05,600.44c0,13.96 11.64,23.27 25.6,23.27 4.65,0 11.64,-2.33 13.96,-4.65l216.44,-151.27c6.98,-4.65 11.64,-11.64 11.64,-20.95 0,-11.64 -4.65,-18.62 -11.64,-23.27zM407.27,560.87v-232.73l167.56,116.36 -167.56,116.36z\"/>\n    <path android:fillColor=\"#707070\" android:pathData=\"M756.36,965.82c-109.38,0 -197.82,-88.44 -197.82,-197.82s88.44,-197.82 197.82,-197.82S954.18,658.62 954.18,768s-88.44,197.82 -197.82,197.82zM756.36,616.73c-83.78,0 -151.27,67.49 -151.27,151.27s67.49,151.27 151.27,151.27S907.64,851.78 907.64,768s-67.49,-151.27 -151.27,-151.27z\"/>\n    <path android:fillColor=\"#707070\" android:pathData=\"M816.87,795.93l-39.56,-23.27v-53.53c0,-11.64 -9.31,-23.27 -23.27,-23.27 -11.64,0 -23.27,9.31 -23.27,23.27v74.47c0,2.33 0,2.33 2.33,4.65 0,2.33 2.33,2.33 2.33,4.65s2.33,2.33 2.33,2.33l2.33,2.33L791.27,837.82c2.33,2.33 6.98,2.33 11.64,2.33 6.98,0 16.29,-4.65 18.62,-11.64 9.31,-11.64 4.65,-25.6 -4.65,-32.58zM493.38,837.82H302.55C174.55,837.82 69.82,733.09 69.82,605.09V279.27C69.82,151.27 174.55,46.55 302.55,46.55h325.82c128,0 232.73,104.73 232.73,232.73v237.38c0,13.96 -9.31,23.27 -23.27,23.27s-23.27,-9.31 -23.27,-23.27V279.27c0,-102.4 -83.78,-186.18 -186.18,-186.18H302.55c-102.4,0 -186.18,83.78 -186.18,186.18v325.82c0,102.4 83.78,186.18 186.18,186.18h190.84c13.96,0 23.27,9.31 23.27,23.27s-11.64,23.27 -23.27,23.27z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_outline.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M662.4,131.2c131.2,12.8 233.6,124.8 233.6,259.2v243.2c0,144 -118.4,262.4 -265.6,262.4h-243.2c-147.2,0 -265.6,-115.2 -265.6,-262.4v-243.2c0,-134.4 105.6,-246.4 236.8,-259.2 41.6,-3.2 32,-64 -6.4,-60.8 -156.8,16 -288,156.8 -288,320v243.2c0,179.2 147.2,323.2 326.4,323.2h243.2c179.2,0 326.4,-144 326.4,-323.2v-243.2c0,-163.2 -131.2,-304 -294.4,-320 -38.4,-3.2 -44.8,54.4 -3.2,60.8zM489.6,697.6c12.8,12.8 32,12.8 44.8,0l256,-240c28.8,-28.8 -16,-73.6 -44.8,-44.8l-201.6,192L544,89.6c0,-41.6 -64,-41.6 -64,0v515.2L278.4,416c-28.8,-28.8 -76.8,16 -44.8,44.8l256,236.8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_nav_skin.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#707070\" android:pathData=\"M446.84,90.76v363.05H195.49c-34.91,0 -58.18,-39.56 -37.24,-69.82l207.13,-318.84c23.27,-34.91 81.45,-18.62 81.45,25.6zM933.24,456.15H567.85V202.47c0,-34.91 39.56,-58.18 69.82,-37.24L956.51,372.36c37.24,25.6 20.95,83.78 -23.27,83.78zM565.53,933.24V567.85h253.67c34.91,0 58.18,39.56 37.24,69.82l-207.13,318.84c-25.6,37.24 -83.78,20.95 -83.78,-23.27zM90.76,567.85h363.05v253.67c0,34.91 -39.56,58.18 -69.82,37.24L67.49,651.64c-37.24,-25.6 -20.95,-83.78 23.27,-83.78z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_search_api_material_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:pathData=\"M15.5,14l-0.8,0l-0.3,-0.3c1,-1.1 1.6,-2.6 1.6,-4.2C16,5.9 13.1,3 9.5,3C5.9,3 3,5.9 3,9.5S5.9,16 9.5,16c1.6,0 3.1,-0.6 4.2,-1.6l0.3,0.3l0,0.8l5,5l1.5,-1.5L15.5,14zM9.5,14C7,14 5,12 5,9.5S7,5 9.5,5C12,5 14,7 14,9.5S12,14 9.5,14z\"\n            android:fillColor=\"@color/black_alpha_160\"/>\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_search_qr.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M437.73,48.68 L82.9,48.68 82.9,290.29 121.85,290.29 121.85,87.64 437.73,87.64Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M582.64,48.68 L582.64,87.64 898.52,87.64 898.52,290.29 937.47,290.29 937.47,48.68Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M437.73,947.08 L121.85,947.08 121.85,744.43 82.9,744.43 82.9,986.03 437.73,986.03Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M898.52,744.43 L898.52,947.08 582.64,947.08 582.64,986.03 937.47,986.03 937.47,744.43Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M85.33,483.65l852.14,0 0,51.13 -852.14,0 0,-51.13Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_upper_choose.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#F06292\" android:pathData=\"M382.73,766.36L68.77,452.4c-8.22,-8.21 -8.22,-21.53 0,-29.75 8.21,-8.22 21.54,-8.22 29.75,0l284.21,284.21 547.32,-547.32c8.22,-8.22 21.53,-8.22 29.75,0 8.22,8.21 8.22,21.53 0,29.75L382.73,766.36z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/layer_night.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/ic_super_menu_default\"></item>\n    <item >\n        <bitmap\n                android:src=\"@drawable/ic_nav_night\"\n                android:gravity=\"center\"/>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/layer_setting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item   android:drawable=\"@drawable/ic_super_menu_default\"></item>\n    <item >\n        <bitmap\n                android:src=\"@drawable/ic_nav_setting\"\n                android:gravity=\"center\"/>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/layer_theme.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n<item android:drawable=\"@drawable/ic_super_menu_default\"></item>\n<item >\n<bitmap\n        android:src=\"@drawable/ic_nav_theme\"\n        android:gravity=\"center\"/>\n</item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/login_button_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\" android:drawable=\"@color/pink400\">\n        <shape android:shape=\"rectangle\">\n            <!--背景色-->\n            <solid android:color=\"@color/white_alpha_96\"/>\n            <!--圆角-->\n            <corners android:radius=\"@dimen/dp_4\"/>\n            <!--设置边框线的宽度和颜色-->\n            <stroke android:width=\"2dp\" android:color=\"@color/pink400\"/>\n        </shape>\n    </item>\n    <item android:state_pressed=\"false\" android:drawable=\"@color/pink_50\">\n        <shape android:shape=\"rectangle\">\n            <!--背景色-->\n            <solid android:color=\"@color/white_alpha_96\"/>\n            <!--圆角-->\n            <corners android:radius=\"@dimen/dp_4\"/>\n            <!--设置边框线的宽度和颜色-->\n            <stroke android:width=\"2dp\" android:color=\"@color/pink_50\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/nav_menu_text_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_checked=\"true\" android:color=\"@color/colorPrimary\"></item>\n    <item android:state_checked=\"false\" android:color=\"#666\"></item>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/pop_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\" android:drawable=\"@color/black_alpha_112\"/>\n    <item android:state_pressed=\"false\" android:drawable=\"@color/white\"/>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/progress_style_circle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:fromDegrees=\"0\"\n        android:toDegrees=\"360\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n>\n    <shape\n            android:innerRadiusRatio=\"5\"\n            android:useLevel=\"false\"\n            android:shape=\"ring\"\n            android:thicknessRatio=\"20\"\n    >\n        <gradient android:startColor=\"@color/pink_200\"\n                  android:endColor=\"@color/pink_500\"\n                  android:type=\"sweep\"\n        />\n    </shape>\n</rotate>"
  },
  {
    "path": "app/src/main/res/drawable/radius_text_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:shape=\"rectangle\"\n        android:useLevel=\"false\"\n>\n    <!--定义圆角-->\n    <corners\n            android:topLeftRadius=\"@dimen/len_16\"\n            android:topRightRadius=\"@dimen/len_16\"\n            android:bottomLeftRadius=\"@dimen/len_16\"\n            android:bottomRightRadius=\"@dimen/len_16\"\n    />\n    <!--描边-->\n    <stroke\n    android:width=\"0.5dp\"\n    android:color=\"@color/grey_500\"\n    />\n    <solid android:color=\"@color/white\"/>\n    <padding android:top=\"@dimen/len_2\" android:bottom=\"@dimen/len_2\" android:left=\"@dimen/dp_10\" android:right=\"@dimen/dp_10\"/>\n    <!--<size android:width=\"60dp\" android:height=\"60dp\" />-->\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/register_button_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <!--背景色-->\n    <solid android:color=\"@color/white_alpha_96\"/>\n    <!--圆角-->\n    <corners android:radius=\"2dp\"/>\n    <!--设置边框线的宽度和颜色-->\n    <stroke android:width=\"0.3dp\" android:color=\"@color/colorPrimary\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ripple_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:color=\"@color/black_alpha_112\"\n>\n\n    <item android:id=\"@android:id/mask\" android:drawable=\"@color/white\" />\n    <!--<item android:id=\"@android:id/mask\">-->\n        <!--<shape android:shape=\"rectangle\">-->\n            <!--<solid android:color=\"@color/colorPrimary\" />-->\n            <!--<corners android:radius=\"10dp\" />-->\n        <!--</shape>-->\n    <!--</item>-->\n</ripple>"
  },
  {
    "path": "app/src/main/res/drawable/text_live_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\"rectangle\">\n    <solid android:color=\"#ffffff\" />\n    <stroke android:width=\"1dp\" android:color=\"@color/colorPrimary\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable-xhdpi/pop_bottom_text.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/colorGray\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/white\"/>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable-xxhdpi/button_more_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <!--背景色-->\n    <solid android:color=\"@color/black_alpha_32\"/>\n    <!--圆角-->\n    <corners android:radius=\"1dp\"/>\n    <!--设置边框线的宽度和颜色-->\n    <stroke android:width=\"0.1dp\" android:color=\"@color/black_alpha_64\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable-xxhdpi/button_pop_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <!--背景色-->\n    <solid android:color=\"@color/white_alpha_208\"/>\n    <!--圆角-->\n    <corners android:radius=\"1dp\"/>\n    <!--设置边框线的宽度和颜色-->\n    <stroke android:width=\"0.3dp\" android:color=\"@color/black_alpha_32\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/layout/activity_bangumi_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".home.region.ui.BangumiDetailActivity\">\n    <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/app_bar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/web_image_background_height\"\n            android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n    >\n        <com.google.android.material.appbar.CollapsingToolbarLayout\n                android:id=\"@+id/collapsing_Toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:fitsSystemWindows=\"true\"\n                android:background=\"@color/colorPrimary\"\n                app:layout_scrollFlags=\"scroll|exitUntilCollapsed\"\n        >\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_bar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:scaleType=\"fitXY\"\n                    app:layout_collapseMode=\"parallax\"\n                    app:layout_scrollFlags=\"scroll|exitUntilCollapsed\"\n            />\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_collapseMode=\"pin\"\n                    android:layout_marginTop=\"22sp\"\n                    app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n                    app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\" />\n        </com.google.android.material.appbar.CollapsingToolbarLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <LinearLayout\n            android:id=\"@+id/button_bar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_anchor=\"@id/detail\"\n            app:layout_anchorGravity=\"top|end\"\n\n    >\n        <TextView\n                android:id=\"@+id/tv_share\"\n                style=\"@style/text_style_navigation\"\n                android:clickable=\"true\"\n                android:drawableTop=\"@drawable/bangumi_detail_ic_share\"\n                android:text=\"@string/share_text\"\n                android:background=\"@drawable/ripple_background\"\n        />\n        <TextView\n                android:id=\"@+id/tv_chasing\"\n                style=\"@style/text_style_navigation\"\n                android:clickable=\"true\"\n                android:drawableTop=\"@drawable/bangumi_follow_animlist\"\n                android:text=\"@string/bangumi_chasing_text\"\n                android:background=\"@drawable/ripple_background\"\n        />\n\n        <TextView\n                android:id=\"@+id/tv_download\"\n                style=\"@style/text_style_navigation\"\n                android:clickable=\"true\"\n                android:drawableTop=\"@drawable/bangumi_detail_ic_download\"\n                android:text=\"@string/bangumi_download_text\"\n                android:background=\"@drawable/ripple_background\"\n        />\n    </LinearLayout>\n\n    <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_anchor=\"@id/button_bar\"\n            app:layout_anchorGravity=\"top|start\"\n            app:layout_scrollFlags=\"scroll|exitUntilCollapsed\"\n\n    >\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/image_cover\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"133dp\"\n                android:scaleType=\"fitXY\"\n                app:layout_collapseMode=\"parallax\"\n                app:roundingBorderColor=\"@color/white\"\n                app:roundingBorderWidth=\"2dp\"\n                app:roundedCornerRadius=\"@dimen/dp_4\"\n        />\n        <LinearLayout\n\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:layout_marginLeft=\"@dimen/dp_10\"\n        >\n            <TextView\n                    android:id=\"@+id/text_play_count\"\n                    style=\"@style/TextMessage\"\n                    android:textColor=\"@color/white\"\n                    android:text=\"播放： 216.6万\"\n            />\n            <TextView\n                    android:id=\"@+id/text_favorites\"\n                    style=\"@style/TextMessage\"\n                    android:textColor=\"@color/white\"\n                    android:text=\"追番： 11.9万\"\n            />\n            <TextView\n                    android:id=\"@+id/text_status\"\n                    style=\"@style/TextMessage\"\n                    android:textColor=\"@color/white\"\n                    android:text=\"已完结，全13话\"\n            />\n        </LinearLayout>\n    </LinearLayout>\n    <include\n            android:id=\"@+id/detail\"\n            layout=\"@layout/content_bangumi_detail\"\n            />\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_live_all.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".home.live.ui.LiveAllActivity\">\n    <com.google.android.material.appbar.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar\">\n    <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n            app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n            app:layout_scrollFlags=\"scroll|enterAlways|snap\"\n            app:contentInsetStart=\"0dp\"\n            app:title=\"@string/live_all_title\"\n    >\n        <ImageView\n                android:id=\"@+id/image_search\"\n                android:layout_width=\"@dimen/normal_icon_size\"\n                android:layout_height=\"match_parent\"\n                app:srcCompat=\"@drawable/ic_img_search\"\n                android:background=\"@drawable/ripple_background\"\n                android:layout_marginLeft=\"@dimen/dp_4\"\n                android:layout_marginRight=\"@dimen/dp_4\"\n                android:layout_gravity=\"end\"\n        />\n    </androidx.appcompat.widget.Toolbar>\n        <com.bilibili.lingxiao.widget.skin.SkinTabLayout\n                android:id=\"@+id/tabLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:foreground=\"?android:attr/selectableItemBackground\"\n                app:tabTextColor=\"@color/white\"\n                app:tabGravity=\"fill\"\n                android:background=\"@color/colorPrimary\"\n                app:tabIndicatorColor=\"@color/colorPrimary\"\n                app:tabMaxWidth=\"0dp\"\n        >\n        </com.bilibili.lingxiao.widget.skin.SkinTabLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n    <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    >\n        <androidx.viewpager.widget.ViewPager\n                android:id=\"@+id/viewPager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n        >\n        </androidx.viewpager.widget.ViewPager>\n    </RelativeLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_live_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n>\n    <com.google.android.material.appbar.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar\">\n        <include\n                layout=\"@layout/title_bar\"\n        />\n        <com.bilibili.lingxiao.widget.skin.SlidTabLayout\n                android:id=\"@+id/tablayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"48dp\"\n                android:background=\"@color/colorPrimary\"\n                android:paddingLeft=\"5dp\"\n                android:paddingRight=\"5dp\"\n                app:tl_indicator_margin_left=\"2dp\"\n                app:tl_indicator_margin_right=\"2dp\"\n                app:tl_indicator_style=\"BLOCK\"\n                app:tl_indicator_color=\"@color/black_alpha_32\"\n                app:tl_indicator_width_equal_title=\"true\"\n\n        >\n        </com.bilibili.lingxiao.widget.skin.SlidTabLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/viewpager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    >\n\n    </androidx.viewpager.widget.ViewPager>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_live_play.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n    <com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView\n            android:id=\"@+id/live_play\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"200dp\"/>\n    <com.google.android.material.tabs.TabLayout\n            android:id=\"@+id/live_tablayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/button_height\"\n            app:tabTextColor=\"@color/black_alpha_224\"\n            android:elevation=\"2dp\"\n            app:tabMaxWidth=\"0dp\"\n            app:tabGravity=\"fill\"\n            app:tabBackground=\"@color/white\"\n            app:tabIndicatorColor=\"@color/colorPrimary\"\n            app:tabSelectedTextColor=\"@color/colorPrimary\"\n            app:tabTextAppearance=\"@style/TextAppearance.AppCompat.Small\"\n    >\n    </com.google.android.material.tabs.TabLayout>\n    <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/live_viewpager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n    </androidx.viewpager.widget.ViewPager>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        tools:context=\".user.LoginActivity\">\n    <androidx.appcompat.widget.Toolbar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            android:minHeight=\"?attr/actionBarSize\"\n            android:id=\"@+id/login_toolbar\"\n            app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n            app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n            app:title=\"@string/login_title\"\n    >\n        <TextView\n                android:id=\"@+id/login_forget\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/forget_password\"\n                android:textColor=\"@color/white\"\n                android:gravity=\"right\"\n                android:layout_marginLeft=\"200dp\"\n                android:layout_marginRight=\"10dp\"\n        />\n    </androidx.appcompat.widget.Toolbar>\n\n    <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n    >\n        <ImageView\n                android:id=\"@+id/login_img_22\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_22\"\n                android:layout_marginTop=\"40dp\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_bili_logo\"\n                android:layout_centerInParent=\"true\"\n        />\n        <ImageView\n                android:id=\"@+id/login_img_33\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_33\"\n                android:layout_marginTop=\"40dp\"\n                android:layout_alignParentRight=\"true\"\n        />\n    </RelativeLayout>\n\n\n\n\n\n\n\n\n\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"40dp\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n    >\n        <androidx.appcompat.widget.AppCompatImageView\n                android:id=\"@+id/login_iv_username\"\n                android:layout_width=\"35dp\"\n                android:layout_height=\"35dp\"\n                app:srcCompat=\"@drawable/ic_img_header\"\n                android:layout_margin=\"5dp\"\n                android:padding=\"6dp\"\n                android:tint=\"@color/colorPrimary\"\n        />\n        <EditText\n                android:id=\"@+id/login_et_username\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_marginLeft=\"15dp\"\n                android:layout_marginRight=\"15dp\"\n                android:layout_height=\"wrap_content\"\n                android:hint=\"@string/input_username\"\n                android:background=\"@null\"\n                android:padding=\"6dp\"\n        />\n\n        <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"6dp\"\n        >\n            <androidx.appcompat.widget.AppCompatImageView\n                    android:id=\"@+id/login_img_username\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:srcCompat=\"@drawable/ic_img_right\"\n                    android:visibility=\"invisible\"\n                    tools:visibility=\"visible\"/>\n            <ProgressBar\n                    android:id=\"@+id/login_progress_name\"\n                    android:layout_width=\"24dp\"\n                    android:layout_height=\"24dp\"\n                    android:visibility=\"invisible\"\n                    tools:visibility=\"visible\"\n                    android:backgroundTint=\"@color/colorPrimary\"\n            />\n        </FrameLayout>\n    </LinearLayout>\n\n    <ImageView\n            android:id=\"@+id/login_line_between_username\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1.8dp\"\n            android:background=\"@color/colorPrimary\"\n            android:layout_marginLeft=\"50dp\"\n            android:layout_marginRight=\"50dp\"/>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"40dp\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n    >\n        <androidx.appcompat.widget.AppCompatImageView\n                android:id=\"@+id/login_iv_password\"\n                android:layout_width=\"35dp\"\n                android:layout_height=\"35dp\"\n                app:srcCompat=\"@drawable/ic_img_password\"\n                android:layout_margin=\"5dp\"\n                android:padding=\"5dp\"\n                android:tint=\"@color/colorPrimary\"\n        />\n\n        <EditText\n                android:id=\"@+id/login_et_password\"\n                android:layout_marginLeft=\"15dp\"\n                android:layout_marginRight=\"15dp\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:hint=\"@string/input_password\"\n                android:background=\"@null\"\n                android:padding=\"6dp\"\n        />\n\n        <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"6dp\"\n        >\n            <androidx.appcompat.widget.AppCompatImageView\n                    android:id=\"@+id/login_img_password\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:srcCompat=\"@drawable/ic_img_right\"\n                    android:visibility=\"invisible\"\n                    tools:visibility=\"visible\"\n            />\n            <ProgressBar\n                    android:id=\"@+id/login_progress_password\"\n                    android:layout_width=\"24dp\"\n                    android:layout_height=\"24dp\"\n                    android:visibility=\"invisible\"\n                    tools:visibility=\"visible\"\n                    android:backgroundTint=\"@color/colorPrimary\"\n            />\n        </FrameLayout>\n\n    </LinearLayout>\n    <ImageView\n            android:id=\"@+id/login_line_between_password\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1.8dp\"\n            android:background=\"@color/black_alpha_16\"\n            android:layout_marginLeft=\"50dp\"\n            android:layout_marginRight=\"50dp\"/>\n\n\n\n\n\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_horizontal\"\n    android:layout_marginTop=\"20dp\">\n        <Button\n                android:layout_width=\"120dp\"\n                android:layout_height=\"40dp\"\n                android:text=\"@string/register_text\"\n                android:textColor=\"@color/pink_400\"\n                android:layout_marginRight=\"20dp\"\n                android:background=\"@drawable/register_button_background\"\n        />\n        <Button\n                android:id=\"@+id/login\"\n                android:layout_width=\"120dp\"\n                android:layout_height=\"40dp\"\n                android:text=\"@string/login_title\"\n                android:textColor=\"@color/white\"\n                android:layout_marginLeft=\"20dp\"\n                android:background=\"@drawable/login_button_background\"\n        />\n    </LinearLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.drawerlayout.widget.DrawerLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:id=\"@+id/main_drawer_layout\"\n>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:fitsSystemWindows=\"true\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:theme=\"@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar\">\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/main_toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    android:background=\"?attr/colorPrimary\"\n                    app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n                    app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n                    app:layout_scrollFlags=\"scroll|enterAlways|snap\"\n                    app:contentInsetStart=\"0dp\"\n            >\n                <ImageView\n                        android:id=\"@+id/image_drawer_home\"\n                        android:layout_width=\"20dp\"\n                        android:layout_height=\"20dp\"\n                        android:src=\"@drawable/ic_drawer_home\"\n                        android:background=\"@drawable/ripple_background\"\n                />\n                <com.facebook.drawee.view.SimpleDraweeView\n                        android:id=\"@+id/image_header\"\n                        android:layout_width=\"35dp\"\n                        android:layout_height=\"35dp\"\n                        app:progressBarImageScaleType=\"centerInside\"\n                        app:progressBarImage=\"@drawable/ic_img_user_head_default\"\n                        app:roundAsCircle=\"true\"\n                        app:roundingBorderWidth=\"1dp\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:layout_marginLeft=\"@dimen/dp_10\"\n                />\n                <TextView\n                        android:id=\"@+id/username\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        style=\"@style/TextTitle\"\n                        android:textColor=\"@color/white\"\n                        android:text=\"@string/un_login\"\n                        android:layout_marginLeft=\"@dimen/dp_4\"\n                />\n                <RelativeLayout android:layout_width=\"wrap_content\"\n                                android:layout_height=\"match_parent\">\n                    <LinearLayout\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"match_parent\"\n                            android:orientation=\"horizontal\"\n                            android:layout_marginRight=\"10dp\"\n                            android:layout_alignParentRight=\"true\"\n                    >\n                        <ImageView\n                                android:id=\"@+id/image_download\"\n                                android:layout_width=\"@dimen/normal_icon_size\"\n                                android:layout_height=\"match_parent\"\n                                app:srcCompat=\"@drawable/ic_img_download\"\n                                android:background=\"@drawable/ripple_background\"\n                                android:layout_marginLeft=\"@dimen/dp_4\"\n                                android:layout_marginRight=\"@dimen/dp_4\"/>\n                        <ImageView\n                                android:id=\"@+id/image_game\"\n                                android:layout_width=\"@dimen/normal_icon_size\"\n                                android:layout_height=\"match_parent\"\n                                app:srcCompat=\"@drawable/ic_img_game\"\n                                android:background=\"@drawable/ripple_background\"\n                                android:layout_marginLeft=\"@dimen/dp_4\"\n                                android:layout_marginRight=\"@dimen/dp_4\"/>\n                        <ImageView\n                                android:id=\"@+id/image_search\"\n                                android:layout_width=\"@dimen/normal_icon_size\"\n                                android:layout_height=\"match_parent\"\n                                app:srcCompat=\"@drawable/ic_img_search\"\n                                android:background=\"@drawable/ripple_background\"\n                                android:layout_marginLeft=\"@dimen/dp_4\"\n                                android:layout_marginRight=\"@dimen/dp_4\"/>\n                    </LinearLayout>\n                </RelativeLayout>\n\n            </androidx.appcompat.widget.Toolbar>\n            <com.bilibili.lingxiao.widget.skin.SkinTabLayout\n                    android:id=\"@+id/main_tabLayout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:foreground=\"?android:attr/selectableItemBackground\"\n                    app:tabTextColor=\"@color/white\"\n                    app:tabGravity=\"fill\"\n                    android:background=\"@color/colorPrimary\"\n                    app:tabIndicatorColor=\"@color/colorPrimary\"\n                    app:tabMaxWidth=\"0dp\"\n            >\n            </com.bilibili.lingxiao.widget.skin.SkinTabLayout>\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        >\n            <androidx.viewpager.widget.ViewPager\n                    android:id=\"@+id/main_viewPager\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n            >\n            </androidx.viewpager.widget.ViewPager>\n        </RelativeLayout>\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:layout_gravity=\"start\"\n            android:background=\"@color/white\"\n    >\n        <!--侧滑菜单-->\n        <com.google.android.material.navigation.NavigationView\n                android:id=\"@+id/main_navigation\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0dp\"\n                android:layout_weight=\"1\"\n                app:menu=\"@menu/nav_menu\"\n                android:fitsSystemWindows=\"false\"\n                app:itemTextColor=\"@drawable/nav_menu_text_color\"\n                app:itemIconTint=\"@drawable/nav_menu_text_color\"\n                android:scrollbars=\"vertical\"\n        >\n        </com.google.android.material.navigation.NavigationView>\n        <include\n                layout=\"@layout/bottom_menu\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"bottom\"\n        />\n\n    </LinearLayout>\n\n\n</androidx.drawerlayout.widget.DrawerLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_play.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n    <!--<android.support.design.widget.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n    >\n        <android.support.design.widget.CollapsingToolbarLayout\n                android:id=\"@+id/collapsing_Toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:fitsSystemWindows=\"true\"\n                app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n\n\n            <android.support.v7.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_collapseMode=\"pin\"\n                    android:layout_marginTop=\"22sp\"\n                    app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n                    app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\" />\n\n        </android.support.design.widget.CollapsingToolbarLayout>\n\n    </android.support.design.widget.AppBarLayout>-->\n\n    <com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView\n            android:id=\"@+id/play_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"200dp\"\n            app:layout_collapseMode=\"parallax\"\n\n    >\n    </com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    >\n        <FrameLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/black_alpha_176\"\n        >\n            <androidx.cardview.widget.CardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginLeft=\"10dp\"\n                    android:layout_marginRight=\"10dp\"\n                    app:cardCornerRadius=\"15dp\"\n                    app:cardUseCompatPadding=\"true\"\n                    app:cardBackgroundColor=\"#666\"\n            >\n                <EditText android:layout_width=\"match_parent\"\n                          android:layout_height=\"wrap_content\"\n                          android:hint=\"发个友善的弹幕见证当下\"\n                          android:textColorHint=\"@color/white_alpha_160\"\n                          android:textSize=\"14sp\"\n                          android:background=\"@null\"\n                          android:gravity=\"center\"\n                          android:layout_margin=\"2dp\"\n                />\n            </androidx.cardview.widget.CardView>\n\n        </FrameLayout>\n\n        <RelativeLayout\n                android:id=\"@+id/rl_video_detail\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n            <com.google.android.material.tabs.TabLayout\n                    android:id=\"@+id/skin_tabLayout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/button_height\"\n                    android:minHeight=\"20dp\"\n                    app:tabIndicatorHeight=\"2dp\"\n                    app:tabGravity=\"fill\"\n                    app:tabMaxWidth=\"0dp\"\n                    app:tabPaddingStart=\"40dp\"\n                    app:tabPaddingEnd=\"40dp\"\n                    app:tabIndicatorFullWidth=\"false\"\n                    android:elevation=\"2dp\"\n                    app:tabSelectedTextColor=\"@color/colorPrimary\"\n                    app:tabBackground=\"@color/white\"\n                    app:tabIndicatorColor=\"@color/colorPrimary\"\n                    app:tabTextAppearance=\"@style/TextAppearance.AppCompat.Small\"\n            >\n            </com.google.android.material.tabs.TabLayout>\n            <androidx.viewpager.widget.ViewPager\n                    android:id=\"@+id/play_viewpager\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/skin_tabLayout\"\n            >\n            </androidx.viewpager.widget.ViewPager>\n        </RelativeLayout>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_rank_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".home.find.ui.RankListActivity\">\n    <com.google.android.material.appbar.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar\">\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/tool_bar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:background=\"@color/colorPrimary\"\n                android:minHeight=\"?attr/actionBarSize\"\n                app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n                app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n                app:layout_scrollFlags=\"scroll|enterAlways|snap\"\n                app:contentInsetStart=\"0dp\"\n        >\n\n            <LinearLayout\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:orientation=\"horizontal\"\n                    android:layout_marginLeft=\"@dimen/len_100\"\n                    android:layout_gravity=\"end|right\"\n            >\n                <ImageView\n                        android:id=\"@+id/image_download\"\n                        android:layout_width=\"@dimen/normal_icon_size\"\n                        android:layout_height=\"@dimen/normal_icon_size\"\n                        app:srcCompat=\"@drawable/ic_toolbar_menu_download\"\n                        android:background=\"@drawable/ripple_background\"\n                        android:layout_margin=\"@dimen/dp_10\"\n                        android:layout_gravity=\"center\"\n                        android:padding=\"@dimen/dp_4\"\n                        android:clickable=\"true\"\n                />\n                <ImageView\n                        android:id=\"@+id/image_search\"\n                        android:layout_width=\"@dimen/normal_icon_size\"\n                        android:layout_height=\"@dimen/normal_icon_size\"\n                        app:srcCompat=\"@drawable/ic_toolbar_menu_search\"\n                        android:background=\"@drawable/ripple_background\"\n                        android:layout_margin=\"@dimen/dp_10\"\n                        android:layout_gravity=\"center\"\n                        android:padding=\"@dimen/dp_4\"\n                        android:clickable=\"true\"\n                />\n            </LinearLayout>\n        </androidx.appcompat.widget.Toolbar>\n        <com.bilibili.lingxiao.widget.skin.SkinTabLayout\n                android:id=\"@+id/tabLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:foreground=\"?android:attr/selectableItemBackground\"\n                app:tabTextColor=\"@color/white\"\n                app:tabGravity=\"fill\"\n                app:tabMode=\"scrollable\"\n                android:background=\"@color/colorPrimary\"\n                app:tabIndicatorColor=\"@color/colorPrimary\"\n                app:tabMaxWidth=\"0dp\"\n        >\n\n        </com.bilibili.lingxiao.widget.skin.SkinTabLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/viewpager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    >\n\n    </androidx.viewpager.widget.ViewPager>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_search_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".home.find.ui.SearchDetailActivity\">\n    <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"@color/colorPrimary\"\n            android:minHeight=\"?attr/actionBarSize\"\n            app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n            app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n            app:layout_scrollFlags=\"scroll|enterAlways|snap\"\n            app:contentInsetStart=\"0dp\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/tablayout\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:gravity=\"center_vertical\"\n                android:layout_margin=\"@dimen/dp_10\"\n        >\n            <androidx.cardview.widget.CardView\n                    android:layout_width=\"0dp\"\n                    android:layout_weight=\"8\"\n                    android:layout_height=\"wrap_content\"\n                    app:cardBackgroundColor=\"@color/white\"\n                    app:cardCornerRadius=\"@dimen/len_16\"\n            >\n                <LinearLayout\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:gravity=\"center_vertical\"\n                        android:layout_marginLeft=\"@dimen/dp_10\"\n                        android:layout_margin=\"@dimen/len_4\"\n                >\n                    <!--<ImageView\n                            style=\"@style/image_small\"\n                            app:srcCompat=\"@drawable/ic_img_search\"\n                            android:tint=\"@color/black_alpha_112\"\n                    />\n                    <EditText\n                            android:id=\"@+id/edit_text\"\n                            android:layout_width=\"0dp\"\n                            android:layout_weight=\"1\"\n                            android:layout_height=\"wrap_content\"\n                            android:hint=\"@string/search_everyone\"\n                            android:background=\"@null\"\n                            android:textColor=\"@color/black_alpha_160\"\n                            android:textColorHint=\"@color/black_alpha_112\"\n                            android:textSize=\"@dimen/font_14\"\n                    />-->\n                    <ImageView\n                            android:id=\"@+id/close\"\n                            style=\"@style/image_small\"\n                            android:src=\"@drawable/ic_toolbar_menu_search\"\n                            android:tint=\"@color/black_alpha_112\"\n                            android:layout_margin=\"@dimen/dp_4\"\n                    />\n                    <androidx.appcompat.widget.SearchView\n                            android:id=\"@+id/searchview\"\n                            android:layout_width=\"0dp\"\n                            android:layout_weight=\"1\"\n                            android:layout_height=\"wrap_content\"\n                            app:queryHint=\"@string/search_everyone\"\n                            style=\"@style/SearchView\"\n                    >\n\n                    </androidx.appcompat.widget.SearchView>\n\n                    <!--<ImageView\n                            android:id=\"@+id/close\"\n                            style=\"@style/image_small\"\n                            android:src=\"@drawable/ic_search_close\"\n                    />-->\n                </LinearLayout>\n            </androidx.cardview.widget.CardView>\n            <TextView\n                    android:id=\"@+id/text_cancel\"\n                    android:layout_width=\"0dp\"\n                    android:layout_weight=\"1\"\n                    android:layout_height=\"wrap_content\"\n                    android:textColor=\"@color/white\"\n                    android:text=\"@string/cancel\"\n                    android:padding=\"@dimen/dp_4\"\n                    android:layout_marginLeft=\"@dimen/dp_4\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n        </LinearLayout>\n\n    </androidx.appcompat.widget.Toolbar>\n    <com.bilibili.lingxiao.widget.skin.SkinTabLayout\n            android:id=\"@+id/tablayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:foreground=\"?android:attr/selectableItemBackground\"\n            app:tabTextColor=\"@color/white\"\n            app:tabGravity=\"fill\"\n            app:tabMode=\"scrollable\"\n            android:background=\"@color/colorPrimary\"\n            app:tabIndicatorColor=\"@color/colorPrimary\"\n            app:tabMaxWidth=\"0dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/toolbar\"\n            app:layout_constraintBottom_toTopOf=\"@id/common_tablayout\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    >\n    </com.bilibili.lingxiao.widget.skin.SkinTabLayout>\n    <com.flyco.tablayout.CommonTabLayout\n            android:id=\"@+id/common_tablayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"48dp\"\n            app:tl_textSelectColor=\"@color/colorPrimary\"\n            app:tl_textUnselectColor=\"@color/grey_500\"\n            android:paddingLeft=\"5dp\"\n            android:paddingRight=\"5dp\"\n            app:tl_tab_padding=\"@dimen/dp_10\"\n            app:tl_indicator_style=\"BLOCK\"\n            app:tl_indicator_color=\"@color/black_alpha_32\"\n            app:tl_iconVisible=\"true\"\n            app:tl_iconGravity=\"RIGHT\"\n            app:tl_indicator_corner_radius=\"@dimen/dp_4\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tablayout\"\n            app:layout_constraintBottom_toTopOf=\"@id/viewpager\"\n    >\n    </com.flyco.tablayout.CommonTabLayout>\n    <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/viewpager\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/common_tablayout\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    >\n    </androidx.viewpager.widget.ViewPager>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_setting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n    <include\n            layout=\"@layout/title_bar\"\n    />\n    <androidx.core.widget.NestedScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n        >\n            <ImageView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/dp_10\"\n                    style=\"@style/between_line\"/>\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/account_info\"\n                    android:clickable=\"true\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/security_private\"\n                    android:clickable=\"true\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/take_goods_info\"\n            />\n            <ImageView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/dp_10\"\n                    style=\"@style/between_line\"/>\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/play_setting\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/decode_setting\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/danmaku_setting\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/offline_setting\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/bangumi_setting\"\n            />\n            <ImageView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/dp_10\"\n                    style=\"@style/between_line\"/>\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/dynamic_setting\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/push_message\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/clean_sdcard\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/other_setting\"\n            />\n\n            <ImageView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/dp_10\"\n                    style=\"@style/between_line\"/>\n\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:id=\"@+id/my_service\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/my_service\"\n            />\n            <com.bilibili.lingxiao.widget.LinearCardView\n                    android:id=\"@+id/help\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:left_text=\"@string/help\"\n            />\n            <ImageView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/dp_10\"\n                    style=\"@style/between_line\"/>\n            <Button\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/exit_account\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n        </LinearLayout>\n    </androidx.core.widget.NestedScrollView>\n\n</LinearLayout>\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_splash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".SplashActivity\"\n        android:background=\"@color/white\"\n        android:id=\"@+id/splash_root\">\n    <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_splash_default\"\n            android:layout_centerInParent=\"true\"\n            />\n    <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_logo_copyright\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginBottom=\"@dimen/splash_copyright_margin_bottom\"\n    />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_stream_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n    <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"@color/colorPrimary\"\n            app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n            app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    >\n        <TextView\n                android:id=\"@+id/setting\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"设置\"\n                android:textColor=\"@color/white\"\n                android:gravity=\"right\"\n                android:layout_marginLeft=\"200dp\"\n                android:layout_marginRight=\"10dp\"\n        />\n    </androidx.appcompat.widget.Toolbar>\n    <com.bilibili.lingxiao.widget.ArcView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"80dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/toolbar\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:arcbackground=\"@color/colorPrimary\"\n    />\n    <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_live_stream_tv_head_port\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n    />\n    <androidx.cardview.widget.CardView\n            android:id=\"@+id/card\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/toolbar\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:cardBackgroundColor=\"@color/white\"\n            app:cardCornerRadius=\"@dimen/len_4\"\n            android:layout_marginTop=\"@dimen/len_20\"\n            android:layout_marginLeft=\"@dimen/len_20\"\n            android:layout_marginRight=\"@dimen/len_20\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center_horizontal\"\n        >\n            <EditText\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@null\"\n                    android:text=\"xxx的直播间\"\n                    android:textColor=\"@color/black_alpha_112\"\n                    android:textSize=\"@dimen/font_16\"\n                    android:padding=\"@dimen/dp_10\"\n                    android:drawableRight=\"@drawable/ic_edit_gray\"\n                    android:drawableTint=\"@color/colorPrimary\"\n            />\n            <ImageView style=\"@style/between_line\"/>\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/set_up_bordcast\"\n                    android:textColor=\"@color/colorPrimary\"\n                    android:padding=\"@dimen/dp_10\"\n            />\n        </LinearLayout>\n    </androidx.cardview.widget.CardView>\n\n    <ImageView\n            android:id=\"@+id/streaming_live_by_camera\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/img_streaming_live_by_camera\"\n            app:layout_constraintTop_toBottomOf=\"@id/card\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_marginTop=\"@dimen/dp_40\"\n    />\n\n    <ImageView\n            android:id=\"@+id/streaming_live_by_screen_record\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/img_streaming_live_by_screen_record\"\n            app:layout_constraintTop_toBottomOf=\"@id/streaming_live_by_camera\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_marginTop=\"@dimen/dp_10\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_theme.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".home.navigation.ThemeActivity\"\n        android:background=\"@color/grey_200\"\n>\n    <include\n            android:id=\"@+id/bar\"\n            layout=\"@layout/title_bar\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n\n<TextView\n        android:id=\"@+id/text_home\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"首页视图\"\n        style=\"@style/TextMessage\"\n        app:layout_constraintTop_toBottomOf=\"@id/bar\"\n        app:layout_constraintBottom_toTopOf=\"@id/ll_single\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.02\"\n        android:layout_marginTop=\"@dimen/dp_10\"\n        android:paddingBottom=\"@dimen/dp_4\"\n/>\n    <LinearLayout\n            android:id=\"@+id/ll_single\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:background=\"@color/white\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_home\"\n            android:gravity=\"center_vertical\"\n            android:padding=\"@dimen/dp_10\"\n    >\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_theme_single\"\n        />\n        <TextView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"单列\"\n                style=\"@style/TextTitle\"\n                android:layout_marginLeft=\"@dimen/dp_10\"\n        />\n        <ImageView\n                android:id=\"@+id/image_choose_single\"\n                style=\"@style/image_small\"\n                android:src=\"@drawable/ic_upper_choose\"\n                android:layout_marginRight=\"@dimen/dp_4\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n                android:backgroundTint=\"@color/colorPrimary\"\n        />\n    </LinearLayout>\n    <LinearLayout\n            android:id=\"@+id/ll_double\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:background=\"@color/white\"\n            app:layout_constraintTop_toBottomOf=\"@id/ll_single\"\n            android:gravity=\"center_vertical\"\n            android:padding=\"@dimen/dp_10\"\n            android:layout_marginTop=\"0.5dp\"\n    >\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_theme_double\"\n        />\n        <TextView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"双列\"\n                style=\"@style/TextTitle\"\n                android:layout_marginLeft=\"@dimen/dp_10\"\n        />\n        <ImageView\n                android:id=\"@+id/image_choose_double\"\n                style=\"@style/image_small\"\n                android:src=\"@drawable/ic_upper_choose\"\n                android:layout_marginRight=\"@dimen/dp_4\"\n                android:visibility=\"visible\"\n                tools:visibility=\"visible\"\n                android:backgroundTint=\"@color/colorPrimary\"\n        />\n    </LinearLayout>\n\n    <TextView\n            android:id=\"@+id/text_color\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"主题颜色\"\n            style=\"@style/TextMessage\"\n            app:layout_constraintTop_toBottomOf=\"@id/ll_double\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.02\"\n            android:layout_marginTop=\"@dimen/dp_10\"\n            android:paddingBottom=\"@dimen/dp_4\"\n    />\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycerView\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_color\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n    >\n\n    </androidx.recyclerview.widget.RecyclerView>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_topic_center.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n>\n    <include layout=\"@layout/title_bar\"/>\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n    >\n        <com.scwang.smartrefresh.header.BezierCircleHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n        <include\n                layout=\"@layout/footer_loadmore\"/>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n    <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/app_bar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/web_image_background_height\"\n            android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n    >\n        <com.google.android.material.appbar.CollapsingToolbarLayout\n                android:id=\"@+id/collapsing_Toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:fitsSystemWindows=\"true\"\n                android:background=\"@color/colorPrimary\"\n                app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_bar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:scaleType=\"fitXY\"\n                    android:visibility=\"invisible\"\n                    app:progressBarImage=\"@color/colorPrimary\"\n                    app:layout_collapseMode=\"parallax\"/>\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_collapseMode=\"pin\"\n                    android:layout_marginTop=\"22sp\"\n                    android:background=\"@color/colorPrimary\"\n                    app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n                    app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\" />\n        </com.google.android.material.appbar.CollapsingToolbarLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n    <androidx.core.widget.NestedScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n        >\n            <skin.support.widget.SkinCompatProgressBar\n                    android:id=\"@+id/progressBar\"\n                    style=\"@style/Base.Widget.AppCompat.ProgressBar.Horizontal\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"2dp\"/>\n            <com.tencent.smtt.sdk.WebView\n                    android:id=\"@+id/webview\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n            >\n            </com.tencent.smtt.sdk.WebView>\n        </LinearLayout>\n\n    </androidx.core.widget.NestedScrollView>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"45dp\"\n            android:background=\"@color/white\"\n            android:orientation=\"horizontal\"\n            android:layout_gravity=\"bottom\"\n            android:elevation=\"6dp\"\n            android:gravity=\"center_vertical\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\"\n    >\n        <androidx.cardview.widget.CardView\n                android:id=\"@+id/card_edit\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"4\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                app:cardCornerRadius=\"15dp\"\n                app:cardUseCompatPadding=\"true\"\n                app:cardElevation=\"1dp\"\n                app:cardBackgroundColor=\"@color/colorGray\"\n        >\n            <EditText android:layout_width=\"wrap_content\"\n                      android:layout_height=\"wrap_content\"\n                      android:hint=\"说点什么吧\"\n                      android:textColorHint=\"@color/black_alpha_96\"\n                      android:textSize=\"14sp\"\n                      android:background=\"@null\"\n                      android:gravity=\"center\"\n                      android:layout_marginLeft=\"10dp\"\n                      android:layout_marginTop=\"3dp\"\n                      android:layout_marginBottom=\"3dp\"\n            />\n        </androidx.cardview.widget.CardView>\n        <TextView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:drawableTop=\"@drawable/ic_light_browser_comment\"\n                android:text=\"123\"\n                android:layout_margin=\"2dp\"\n                android:gravity=\"center_horizontal\"\n        />\n        <TextView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:drawableTop=\"@drawable/ic_light_browser_clip_collect\"\n                android:text=\"123\"\n                android:layout_margin=\"2dp\"\n                android:gravity=\"center_horizontal\"\n        />\n        <TextView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:drawableTop=\"@drawable/ic_light_browser_repost\"\n                android:text=\"123\"\n                android:layout_margin=\"2dp\"\n                android:gravity=\"center_horizontal\"\n        />\n        <TextView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:drawableTop=\"@drawable/ic_light_browser_like\"\n                android:text=\"123\"\n                android:layout_margin=\"2dp\"\n                android:gravity=\"center_horizontal\"\n        />\n    </LinearLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/bottom_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"@color/white\"\n              android:clickable=\"true\"\n              android:focusable=\"true\"\n              android:elevation=\"@dimen/dp_4\"\n>\n    <!--<ImageView\n            style=\"@style/between_line\"\n    />-->\n    <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_marginBottom=\"5dp\">\n        <LinearLayout\n                android:id=\"@+id/ll_nav_setting\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\"\n                android:background=\"@drawable/ripple_background\"\n        >\n\n            <ImageView\n                    android:layout_width=\"25dp\"\n                    android:layout_height=\"25dp\"\n                    app:srcCompat=\"@drawable/layer_setting\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"15sp\"\n                    android:layout_marginLeft=\"5dp\"\n                    android:text=\"设置\"\n\n            />\n        </LinearLayout>\n        <LinearLayout\n                android:id=\"@+id/ll_nav_theme\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\"\n                android:background=\"@drawable/ripple_background\"\n        >\n\n            <ImageView\n                    android:layout_width=\"25dp\"\n                    android:layout_height=\"25dp\"\n                    app:srcCompat=\"@drawable/layer_theme\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"15sp\"\n                    android:text=\"主题\"\n                    android:layout_marginLeft=\"5dp\"\n            />\n        </LinearLayout>\n        <LinearLayout\n                android:id=\"@+id/ll_nav_night\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\"\n                android:background=\"@drawable/ripple_background\"\n        >\n\n            <ImageView\n                    android:layout_width=\"25dp\"\n                    android:layout_height=\"25dp\"\n                    app:srcCompat=\"@drawable/layer_night\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"15sp\"\n                    android:text=\"夜间\"\n                    android:layout_marginLeft=\"5dp\"\n            />\n        </LinearLayout>\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/content_bangumi_contract.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n\n>\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"@dimen/dp_4\"\n            app:cardElevation=\"@dimen/dp_4\"\n            app:cardCornerRadius=\"@dimen/dp_4\"\n            app:cardUseCompatPadding=\"false\"\n            app:cardBackgroundColor=\"@color/white\"\n    >\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/const_contract\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n        >\n            <androidx.constraintlayout.widget.Guideline\n                    android:id=\"@+id/guideline\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_constraintGuide_begin=\"70dp\"\n                    android:orientation=\"vertical\"\n            />\n            <TextView\n                    android:id=\"@+id/tv_please_contract\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/bangumi_contract_me\"\n                    android:textColor=\"@color/yellow_700\"\n                    android:textSize=\"20sp\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n                    app:layout_constraintLeft_toRightOf=\"@id/guideline\"\n            />\n            <TextView\n                    android:id=\"@+id/tv_people_contract_num\"\n                    app:layout_constraintTop_toBottomOf=\"@id/tv_please_contract\"\n                    app:layout_constraintBottom_toTopOf=\"@id/between_line\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"已有316人承包了这部剧\"\n                    android:textColor=\"@color/yellow_700\"\n                    android:textSize=\"16sp\"\n                    android:layout_marginBottom=\"@dimen/dp_10\"\n                    app:layout_constraintLeft_toRightOf=\"@id/guideline\"\n            />\n            <Button\n                    android:layout_width=\"@dimen/button_width\"\n                    android:layout_height=\"@dimen/button_height\"\n                    android:text=\"承包\"\n                    android:textColor=\"@color/white\"\n                    android:background=\"@color/yellow_700\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toTopOf=\"@id/between_line\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:layout_marginRight=\"@dimen/dp_4\"\n            />\n            <ImageView\n                    android:id=\"@+id/between_line\"\n                    style=\"@style/between_line\"\n                    app:layout_constraintTop_toBottomOf=\"@id/tv_people_contract_num\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/bangumi_contract_message\"\n                    app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:padding=\"@dimen/dp_10\"\n            />\n            <Button\n                    android:layout_width=\"@dimen/button_width\"\n                    android:layout_height=\"@dimen/button_height\"\n                    android:text=\"查看榜单\"\n                    app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:background=\"@drawable/register_button_background\"\n                    android:layout_marginRight=\"@dimen/dp_4\"\n            />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.cardview.widget.CardView>\n\n    <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_pay_bangumi_tips\"\n            app:layout_anchor=\"@id/const_contract\"\n            app:layout_anchorGravity=\"top|left\"\n            android:elevation=\"@dimen/dp_10\"\n            android:layout_marginLeft=\"@dimen/dp_10\"\n    />\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/content_bangumi_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:showIn=\"@layout/activity_bangumi_detail\"\n        android:orientation=\"vertical\"\n>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@color/white\"\n            android:layout_marginTop=\"@dimen/dp_40\"\n            android:orientation=\"vertical\"\n    >\n        <LinearLayout\n                android:id=\"@+id/ll_category\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n\n                android:layout_marginLeft=\"@dimen/dp_10\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n        >\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@drawable/bangumi_season_title_background_first\"\n                    android:text=\"TV\"\n                    style=\"@style/TextTitle\"\n                    android:gravity=\"center\"\n                    android:elevation=\"@dimen/dp_4\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@drawable/bangumi_season_title_background_last\"\n                    android:text=\"僅港澳台\"\n                    style=\"@style/TextTitle\"\n                    android:gravity=\"center\"\n                    android:elevation=\"@dimen/dp_4\"\n            />\n        </LinearLayout>\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/cons_history\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/white\"\n                android:elevation=\"2dp\"\n                app:layout_constraintTop_toBottomOf=\"@id/ll_category\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                android:layout_margin=\"@dimen/dp_10\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n                >\n            <TextView\n                    style=\"@style/TextTitle\"\n                    android:text=\"上次观看到第2话\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    android:padding=\"6dp\"\n            />\n            <TextView\n                    style=\"@style/TextTitle\"\n                    android:text=\"继续观看\"\n                    android:textColor=\"@color/colorPrimary\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    android:padding=\"6dp\"\n            />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintTop_toBottomOf=\"@id/cons_history\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:layout_marginTop=\"@dimen/dp_10\"\n        >\n            <TextView\n                    style=\"@style/TextTitle\"\n                    android:text=\"选集\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toTopOf=\"@id/recycler_select_set\"\n                    android:padding=\"6dp\"\n                    android:layout_marginLeft=\"@dimen/dp_10\"\n            />\n            <TextView\n                    android:id=\"@+id/text_count\"\n                    style=\"@style/TextTitle\"\n                    android:text=\"13话全\"\n                    android:textColor=\"@color/black_alpha_112\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toTopOf=\"@id/recycler_select_set\"\n                    android:padding=\"6dp\"\n                    android:drawableRight=\"@drawable/ic_img_right\"\n                    android:layout_marginRight=\"@dimen/dp_4\"\n                    android:layout_marginTop=\"8dp\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n            <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/recycler_select_set\"\n                    app:layout_constraintTop_toBottomOf=\"@id/text_count\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\">\n            </androidx.recyclerview.widget.RecyclerView>\n            <include\n                    android:id=\"@+id/content_bangumi_contract\"\n                    layout=\"@layout/content_bangumi_contract\"\n                    app:layout_constraintTop_toBottomOf=\"@id/recycler_select_set\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"@dimen/dp_4\"\n            />\n            <ImageView\n                    android:id=\"@+id/between_line1\"\n                    style=\"@style/between_line\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/content_bangumi_contract\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n            />\n            <TextView\n                    style=\"@style/TextTitle\"\n                    android:text=\"简介\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/between_line1\"\n                    android:padding=\"6dp\"\n                    android:layout_marginLeft=\"@dimen/dp_10\"\n            />\n            <TextView\n                    android:id=\"@+id/text_more\"\n                    style=\"@style/TextTitle\"\n                    android:text=\"更多\"\n                    android:textColor=\"@color/black_alpha_112\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/between_line1\"\n                    android:padding=\"6dp\"\n                    android:drawableRight=\"@drawable/ic_img_right\"\n                    android:layout_marginRight=\"@dimen/dp_10\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n            <TextView\n                    android:id=\"@+id/text_evaluate\"\n                    style=\"@style/TextMessage\"\n                    android:text=\"@string/bangumi_evaluate_default\"\n                    app:layout_constraintTop_toBottomOf=\"@id/text_more\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:maxLines=\"3\"\n                    android:ellipsize=\"end\"\n                    android:layout_marginLeft=\"@dimen/dp_10\"\n                    android:layout_marginRight=\"@dimen/dp_10\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n                    android:layout_width=\"0dp\"/>\n            <com.bilibili.lingxiao.widget.ColorTextView\n                    android:id=\"@+id/type_name\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:padding=\"5dp\"\n                    app:ctvBackground=\"@color/white\"\n                    app:ctvCornerSize=\"40\"\n                    app:ctvMargin=\"3dp\"\n                    app:ctvText=\"游戏\"\n                    app:ctvTextColor=\"@color/black_alpha_144\"\n                    app:ctvTextSize=\"14sp\"\n                    android:layout_marginLeft=\"10dp\"\n                    android:layout_marginRight=\"10dp\"\n                    android:elevation=\"@dimen/dp_10\"\n                    app:layout_constraintTop_toBottomOf=\"@id/text_evaluate\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_goneMarginLeft=\"@dimen/dp_10\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n            />\n            <ImageView\n                    android:id=\"@+id/between_line2\"\n                    style=\"@style/between_line\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/type_name\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n            />\n            <TextView\n                    style=\"@style/TextTitle\"\n                    android:text=\"更多推荐\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/between_line2\"\n                    android:padding=\"6dp\"\n                    android:layout_marginLeft=\"@dimen/dp_10\"\n\n            />\n            <TextView\n                    android:id=\"@+id/text_refresh_recommend\"\n                    style=\"@style/TextMessage\"\n                    android:text=\"换一换\"\n                    android:textColor=\"@color/black_alpha_112\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/between_line2\"\n                    android:padding=\"6dp\"\n                    android:gravity=\"center\"\n                    android:drawableRight=\"@drawable/ic_bangumi_refresh_pink\"\n                    android:backgroundTint=\"@color/colorPrimary\"\n                    android:layout_marginRight=\"@dimen/dp_10\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n            <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                    android:id=\"@+id/recycler_recommend\"\n                    app:layout_constraintTop_toBottomOf=\"@id/text_refresh_recommend\"\n                    app:layout_constraintBottom_toTopOf=\"@id/between_line3\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n            >\n            </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n            <ImageView\n                    android:id=\"@+id/between_line3\"\n                    style=\"@style/between_line\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/recycler_recommend\"\n                    android:layout_marginTop=\"@dimen/dp_10\"\n            />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </LinearLayout>\n</androidx.core.widget.NestedScrollView>"
  },
  {
    "path": "app/src/main/res/layout/find_line_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/ripple_background\"\n>\n    <ImageView\n            android:id=\"@+id/image_head\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_group\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@id/between_line\"\n            android:padding=\"@dimen/len_12\"\n    />\n    <TextView\n            android:id=\"@+id/text_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextTitle\"\n            android:padding=\"@dimen/len_12\"\n            android:text=\"兴趣圈\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@id/between_line\"\n            app:layout_constraintLeft_toRightOf=\"@id/image_head\"\n    />\n    <ImageView\n            android:id=\"@+id/image_right\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_img_right\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@id/between_line\"\n            android:layout_marginRight=\"@dimen/dp_4\"\n            android:padding=\"@dimen/len_12\"\n    />\n    <ImageView\n            android:id=\"@+id/between_line\"\n            style=\"@style/between_line\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_title\"\n            app:layout_constraintVertical_bias=\"1.0\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/footer_live_showall.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n    <Button\n            android:id=\"@+id/button\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/button_height\"\n            android:background=\"@drawable/button_white_line_background\"\n            android:layout_marginLeft=\"60dp\"\n            android:layout_marginRight=\"60dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"10dp\"\n            android:text=\"全部直播\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/footer_loadmore.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginBottom=\"5dp\"\n>\n    <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.5\"\n    >\n        <ProgressBar\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:indeterminateDrawable=\"@drawable/progress_style_circle\"\n                android:indeterminateDuration=\"1000\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"@dimen/user_name_text_size\"\n                style=\"@style/TextMessage\"\n                android:text=\"加载数据中\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_comment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/ll_bottom\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n    >\n        <com.scwang.smartrefresh.header.BezierCircleHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n\n        />\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/comment_recy\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"/>\n        <include layout=\"@layout/footer_loadmore\"\n                 android:layout_width=\"match_parent\"\n                 android:layout_height=\"wrap_content\"/>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n\n    <LinearLayout\n            android:id=\"@+id/ll_bottom\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:elevation=\"6dp\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintTop_toBottomOf=\"@id/refresh\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:background=\"@color/white\"\n    >\n        <androidx.cardview.widget.CardView\n                android:id=\"@+id/card_edit\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"4\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                app:cardCornerRadius=\"15dp\"\n                app:cardUseCompatPadding=\"true\"\n                app:cardBackgroundColor=\"@color/grey_100\"\n        >\n            <EditText android:layout_width=\"wrap_content\"\n                      android:layout_height=\"wrap_content\"\n                      android:hint=\"说点什么吧\"\n                      android:textColorHint=\"@color/black_alpha_96\"\n                      android:textSize=\"14sp\"\n                      android:background=\"@null\"\n                      android:gravity=\"center\"\n                      android:layout_marginLeft=\"10dp\"\n                      android:layout_marginTop=\"3dp\"\n                      android:layout_marginBottom=\"3dp\"\n            />\n\n        </androidx.cardview.widget.CardView>\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_player_emoji\"\n                android:layout_marginRight=\"10dp\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_comment_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n    <RelativeLayout\n            android:id=\"@+id/top_bar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/white\"\n            android:elevation=\"@dimen/dp_4\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/main_comment\"\n    >\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/comment_detail\"\n                style=\"@style/TextTitle\"\n                android:layout_centerVertical=\"true\"\n                android:layout_margin=\"10dp\"\n        />\n        <ImageView\n                android:id=\"@+id/image_close\"\n                android:src=\"@drawable/ic_light_browser_comment_close\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginRight=\"10dp\"\n                style=\"@style/image_normal\"\n        />\n    </RelativeLayout>\n    <include\n            android:id=\"@+id/replay\"\n            layout=\"@layout/fragment_fans_detail\"\n            app:layout_constraintTop_toBottomOf=\"@id/top_bar\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_dialog_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/white\"\n        android:elevation=\"@dimen/dp_4\"\n        android:orientation=\"vertical\"\n        android:layout_marginLeft=\"@dimen/dp_4\"\n        android:layout_marginRight=\"@dimen/dp_4\"\n>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n            android:padding=\"@dimen/dp_4\"\n    >\n        <ImageView\n                android:id=\"@+id/image_exit\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_image_left\"\n                android:layout_margin=\"@dimen/dp_4\"\n                android:layout_marginRight=\"@dimen/dp_10\"\n        />\n        <EditText\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:hint=\"搜索房间号或主播\"\n                android:background=\"@null\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_light_browser_comment_close\"\n                android:layout_margin=\"@dimen/dp_4\"\n                android:layout_marginLeft=\"@dimen/dp_4\"\n                android:layout_marginRight=\"@dimen/dp_4\"\n        />\n        <ImageView\n                android:id=\"@+id/image_search\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_search_query\"\n                android:layout_margin=\"@dimen/dp_4\"\n                android:layout_marginRight=\"@dimen/dp_4\"\n        />\n    </LinearLayout>\n    <androidx.recyclerview.widget.RecyclerView\n            android:visibility=\"gone\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n    </androidx.recyclerview.widget.RecyclerView>\n    <TextView\n            android:visibility=\"gone\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"清除搜索记录\"\n            android:layout_gravity=\"center_horizontal\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_dynamic.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\" xmlns:tools=\"http://schemas.android.com/tools\" android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n    <ImageView\n            android:id=\"@+id/imageview\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_vip_login\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_marginTop=\"@dimen/dp_40\"\n    />\n    <TextView\n            android:text=\"@string/dynamic_login\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/textView\"\n            android:layout_marginTop=\"8dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/imageview\"\n            android:layout_marginBottom=\"8dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            android:layout_marginEnd=\"8dp\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            android:layout_marginStart=\"8dp\"\n            android:textSize=\"@dimen/font_14\"\n    />\n    <Button\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/login_title\"\n            app:layout_constraintTop_toBottomOf=\"@id/textView\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_marginTop=\"@dimen/len_20\"\n            android:layout_marginLeft=\"@dimen/dp_40\"\n            android:layout_marginRight=\"@dimen/dp_40\"\n            android:background=\"@color/colorPrimary\"\n            android:textColor=\"@color/white\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_fans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <com.flyco.tablayout.SegmentTabLayout\n            android:id=\"@+id/fans_tablayout\"\n            android:layout_width=\"200dp\"\n            android:layout_height=\"36dp\"\n            android:layout_gravity=\"center_horizontal\"\n            app:tl_bar_color=\"#ffffff\"\n            app:tl_indicator_anim_enable=\"true\"\n            app:tl_indicator_color=\"@color/colorPrimary\"\n            app:tl_textBold=\"SELECT\"\n            app:tl_indicator_style=\"BLOCK\"\n            app:tl_textSelectColor=\"@color/white\"\n            app:tl_textUnselectColor=\"@color/black_alpha_128\"\n            android:layout_marginTop=\"15dp\"\n    >\n    </com.flyco.tablayout.SegmentTabLayout>\n    <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/viewpager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginTop=\"5dp\"\n    >\n    </androidx.viewpager.widget.ViewPager>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_fans_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n>\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n    >\n        <com.scwang.smartrefresh.header.WaterDropHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </androidx.recyclerview.widget.RecyclerView>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_find.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:background=\"@color/black_alpha_16\"\n        >\n\n            <androidx.cardview.widget.CardView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:cardUseCompatPadding=\"true\"\n                    app:cardCornerRadius=\"@dimen/dp_4\"\n                    android:layout_margin=\"@dimen/dp_10\"\n            >\n                <LinearLayout\n                        android:id=\"@+id/search\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:gravity=\"center_vertical\"\n                        android:padding=\"@dimen/len_8\"\n                >\n                    <ImageView\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            app:srcCompat=\"@drawable/ic_img_search\"\n                            android:tint=\"@color/black_alpha_112\"\n                    />\n                    <TextView\n                            android:layout_width=\"0dp\"\n                            android:layout_weight=\"1\"\n                            android:layout_height=\"wrap_content\"\n                            android:hint=\"@string/search_bar_hint\"\n                            android:textSize=\"@dimen/font_14\"\n                            android:layout_marginLeft=\"@dimen/dp_10\"\n                    />\n                    <ImageView\n                            android:id=\"@+id/search_qr\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            app:srcCompat=\"@drawable/ic_search_qr\"\n                            android:tint=\"@color/black_alpha_112\"\n                    />\n                </LinearLayout>\n            </androidx.cardview.widget.CardView>\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/search_everyone\"\n                    android:layout_marginLeft=\"@dimen/dp_10\"\n                    style=\"@style/TextTitle\"\n            />\n            <com.bilibili.lingxiao.widget.LaybelLayout\n                    android:id=\"@+id/laybel\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:text_background=\"@drawable/radius_text_background\"\n                    app:line_padding=\"10\"\n            >\n\n            </com.bilibili.lingxiao.widget.LaybelLayout>\n\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:id=\"@+id/show_more\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n                    android:padding=\"@dimen/dp_4\"\n            >\n                <ImageView\n                        android:layout_width=\"0dp\"\n                        android:layout_weight=\"1\"\n                        style=\"@style/between_line\"\n                        android:layout_marginLeft=\"@dimen/len_20\"\n                        android:layout_marginRight=\"@dimen/dp_10\"\n                />\n                <LinearLayout\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:gravity=\"center_vertical\"\n                >\n                    <ImageView\n                            android:id=\"@+id/image_show_more\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:src=\"@drawable/ic_arrow_down_gray_round\"\n                            android:layout_marginRight=\"@dimen/dp_4\"\n                    />\n                    <TextView\n                            android:id=\"@+id/text_show_more\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:text=\"查看更多\"\n                    />\n                </LinearLayout>\n\n                <ImageView\n                        android:layout_width=\"0dp\"\n                        android:layout_weight=\"1\"\n                        style=\"@style/between_line\"\n                        android:layout_marginLeft=\"@dimen/dp_10\"\n                        android:layout_marginRight=\"@dimen/len_20\"\n                />\n            </LinearLayout>\n\n        </LinearLayout>\n\n\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/interest_group\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_group\"\n                app:text=\"@string/find_line_interest\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/topic_center\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_header_topic_center\"\n                app:text=\"@string/find_line_topic\"\n                android:clickable=\"true\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/activity_center\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_header_activity_center\"\n                app:text=\"@string/find_line_activity\"\n                android:clickable=\"true\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/black_door\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_header_black_list_center\"\n                app:text=\"@string/find_line_blackdoor\"\n                android:clickable=\"true\"\n        />\n        <ImageView\n                style=\"@style/between_line\"\n                android:layout_height=\"@dimen/len_20\"\n                android:background=\"@color/black_alpha_16\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/origin_rank_list\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_btn_rank_original\"\n                app:text=\"@string/find_line_top_original\"\n                app:showRightIcon=\"true\"\n                android:clickable=\"true\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/all_rank_list\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_btn_rank_all\"\n                app:text=\"@string/find_line_top_all\"\n                app:showRightIcon=\"true\"\n                android:clickable=\"true\"\n        />\n        <ImageView\n                style=\"@style/between_line\"\n                android:layout_height=\"@dimen/len_20\"\n                android:background=\"@color/black_alpha_16\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_btn_game\"\n                app:text=\"@string/find_line_game_center\"\n                app:showRightIcon=\"true\"\n                android:clickable=\"true\"\n        />\n        <com.bilibili.lingxiao.widget.FindLineView\n                android:id=\"@+id/round_shop\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:src=\"@drawable/ic_btn_shop\"\n                app:text=\"@string/find_line_shop\"\n                app:showRightIcon=\"true\"\n                android:clickable=\"true\"\n        />\n    </LinearLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_fleet.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n>\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n    >\n        <com.scwang.smartrefresh.header.WaterDropHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_interact.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n>\n    <include\n            android:id=\"@+id/card_up\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            layout=\"@layout/layout_header_room_info\"\n    />\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/card_up\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/ll_send\"\n            app:layout_constraintVertical_bias=\"0.0\"\n    >\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintTop_toBottomOf=\"@id/card_up\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        >\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n        <include\n                layout=\"@layout/footer_loadmore\"\n        />\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n\n\n    <LinearLayout\n            android:id=\"@+id/ll_send\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            android:elevation=\"@dimen/dp_4\"\n            android:gravity=\"center_vertical\"\n            android:layout_margin=\"3dp\"\n            android:background=\"@color/white\"\n    >\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_live_medal_none_medal_enter\"\n                android:layout_marginLeft=\"10dp\"\n        />\n        <androidx.cardview.widget.CardView\n                android:id=\"@+id/card_edit\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"4\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                app:cardCornerRadius=\"15dp\"\n                app:cardUseCompatPadding=\"true\"\n                app:cardElevation=\"1dp\"\n                app:cardBackgroundColor=\"@color/colorGray\"\n        >\n            <EditText android:layout_width=\"wrap_content\"\n                      android:layout_height=\"wrap_content\"\n                      android:hint=\"说点什么吧\"\n                      android:textColorHint=\"@color/black_alpha_96\"\n                      android:textSize=\"14sp\"\n                      android:background=\"@null\"\n                      android:gravity=\"center\"\n                      android:layout_marginLeft=\"10dp\"\n                      android:layout_marginTop=\"3dp\"\n                      android:layout_marginBottom=\"3dp\"\n            />\n        </androidx.cardview.widget.CardView>\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_liveroom_gift_list\"\n                android:layout_marginRight=\"10dp\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_introduce.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n    <LinearLayout\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n    >\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"10dp\"\n                android:layout_marginLeft=\"3dp\"\n                android:layout_marginRight=\"3dp\"\n                android:layout_marginBottom=\"3dp\"\n        >\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/img_head\"\n                    android:layout_width=\"35dp\"\n                    android:layout_height=\"35dp\"\n                    app:placeholderImage=\"@drawable/ic_im_avator_default\"\n                    app:roundAsCircle=\"true\"\n                    app:roundingBorderWidth=\"1dp\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginRight=\"5dp\"\n                    android:layout_marginLeft=\"5dp\"/>\n            <LinearLayout\n                    android:layout_toRightOf=\"@id/img_head\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_centerVertical=\"true\"\n                    android:orientation=\"vertical\">\n                <TextView\n                        android:id=\"@+id/username\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:textSize=\"@dimen/user_name_text_size\"\n                        tools:text=\"没有如果\"\n                />\n                <TextView\n                        android:id=\"@+id/fensi\"\n                        style=\"@style/TextMessage\"\n                        tools:text=\"213个粉丝\"\n                />\n            </LinearLayout>\n\n            <LinearLayout\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"@dimen/button_height\"\n                    android:background=\"@color/colorPrimary\"\n                    android:layout_alignParentRight=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_marginRight=\"5dp\"\n            >\n                <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:src=\"@drawable/ic_add_follow\"\n                        android:layout_marginLeft=\"10dp\"\n                />\n                <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"关注\"\n                        android:textSize=\"14sp\"\n                        android:textColor=\"@color/white\"\n                        android:layout_marginLeft=\"3dp\"\n                        android:layout_marginRight=\"10dp\"\n                />\n            </LinearLayout>\n        </RelativeLayout>\n\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n        >\n        <com.bilibili.lingxiao.widget.FoldableLayout\n                android:id=\"@+id/fold_layout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:maxCollapsedLines=\"1\"\n                android:orientation=\"vertical\"\n        >\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n            >\n                <TextView\n                        android:id=\"@id/expand_textview\"\n                        android:layout_width=\"0dp\"\n                        android:layout_weight=\"1\"\n                        android:layout_height=\"wrap_content\"\n                        android:textSize=\"@dimen/description_text_size\"\n                        android:layout_marginTop=\"5dp\"\n                        android:layout_marginBottom=\"5dp\"\n                        android:layout_marginLeft=\"10dp\"\n                        android:layout_marginRight=\"15dp\"\n                        android:ellipsize=\"end\"\n                />\n                <ImageButton\n                        android:id=\"@id/expand_collapse\"\n                        android:layout_width=\"15dp\"\n                        android:layout_height=\"15dp\"\n                        android:background=\"@android:color/transparent\"\n                        android:padding=\"10dp\"\n                        android:layout_marginRight=\"10dp\"\n                />\n            </LinearLayout>\n        </com.bilibili.lingxiao.widget.FoldableLayout>\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n            >\n                <LinearLayout\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:layout_margin=\"5dp\"\n                        android:gravity=\"center_vertical\"\n                >\n                    <ImageView\n                            android:layout_width=\"15dp\"\n                            android:layout_height=\"15dp\"\n                            app:srcCompat=\"@drawable/ic_img_play_number\"\n                            android:tint=\"@color/black_alpha_64\"\n                            android:layout_margin=\"2dp\"\n                    />\n                    <TextView\n                            android:id=\"@+id/play_num\"\n                            style=\"@style/TextMessage\"\n                            tools:text=\"14.1万\"\n                    />\n                </LinearLayout>\n\n                <LinearLayout\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:layout_margin=\"5dp\"\n                        android:gravity=\"center_vertical\"\n                >\n                    <ImageView\n                            android:layout_width=\"15dp\"\n                            android:layout_height=\"15dp\"\n                            app:srcCompat=\"@drawable/ic_img_danmaku_number\"\n                            android:layout_margin=\"2dp\"\n                            android:tint=\"@color/black_alpha_64\"\n                    />\n                    <TextView\n                            android:id=\"@+id/damku_num\"\n                            style=\"@style/TextMessage\"\n                            tools:text=\"14.1万\"\n                    />\n                    <TextView\n                            android:id=\"@+id/av_num\"\n                            style=\"@style/TextMessage\"\n                            android:text=\"        \"\n                    />\n                </LinearLayout>\n\n            </LinearLayout>\n            <com.bilibili.lingxiao.widget.FoldableLayout\n                    android:id=\"@+id/fold_message\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:maxCollapsedLines=\"0\"\n                    android:orientation=\"vertical\"\n                    app:foldClickable=\"false\"\n            >\n                <TextView\n                        android:id=\"@id/expand_textview\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"20dp\"\n                        android:layout_marginLeft=\"10dp\"\n                        android:layout_marginRight=\"10dp\"\n                />\n            </com.bilibili.lingxiao.widget.FoldableLayout>\n\n        </LinearLayout>\n\n\n\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/endpage_recycler\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </androidx.recyclerview.widget.RecyclerView>\n\n\n        <ImageView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0.6dp\"\n                android:background=\"@color/black_alpha_32\"\n                android:layout_marginTop=\"5dp\"\n                android:layout_marginBottom=\"5dp\"\n        />\n\n        <com.bilibili.lingxiao.widget.ColorTextView\n                android:id=\"@+id/type_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"5dp\"\n                app:ctvBackground=\"@color/grey_300\"\n                app:ctvCornerSize=\"40\"\n                app:ctvMargin=\"3dp\"\n                app:ctvTextColor=\"@color/black_alpha_144\"\n                app:ctvTextSize=\"14sp\"\n                android:layout_marginLeft=\"10dp\"\n                android:layout_marginRight=\"10dp\"\n                android:elevation=\"@dimen/dp_4\"\n        />\n\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recommend_recycler\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n\n        </androidx.recyclerview.widget.RecyclerView>\n\n    </LinearLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_live.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n>\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n            android:focusable=\"true\"\n            android:focusableInTouchMode=\"true\"\n    >\n        <com.scwang.smartrefresh.header.BezierCircleHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </com.scwang.smartrefresh.header.BezierCircleHeader>\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/live_recy\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n\n        >\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n\n    <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|right\"\n            android:layout_marginBottom=\"?actionBarSize\"\n    >\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/fab_live\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end|bottom\"\n                app:maxImageSize=\"@dimen/fab_image_size\"\n                android:layout_margin=\"@dimen/fab_margin\"\n                android:visibility=\"visible\"\n                app:backgroundTint=\"@color/colorPrimary\"\n                app:fabSize=\"normal\"\n                android:scaleType=\"center\"\n                app:layout_behavior=\"@string/scroll_behavior\"\n                app:rippleColor=\"#33728dff\"\n                app:srcCompat=\"@drawable/ic_live_entrance\"\n\n        />\n    </LinearLayout>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_mikan.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n        android:id=\"@+id/refresh\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:srlPrimaryColor=\"@color/colorPrimary\"\n>\n    <com.scwang.smartrefresh.header.BezierCircleHeader\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n    </com.scwang.smartrefresh.header.BezierCircleHeader>\n    <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n            android:id=\"@+id/recyclerview_edit\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n    </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n    <include layout=\"@layout/footer_loadmore\"\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"wrap_content\"/>\n</com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_recommend.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n>\n    <include layout=\"@layout/top_recommend_bar\"/>\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n    >\n        <com.scwang.smartrefresh.header.BezierCircleHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </com.scwang.smartrefresh.header.BezierCircleHeader>\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n        >\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n\n        <include layout=\"@layout/footer_loadmore\"\n                 android:layout_width=\"match_parent\"\n                 android:layout_height=\"wrap_content\"/>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_region.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:focusable=\"true\"\n            android:focusableInTouchMode=\"true\"\n    >\n        <com.scwang.smartrefresh.header.BezierCircleHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/category_recyclerview\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n        >\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_region_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n\n>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n    >\n        <include\n                android:id=\"@+id/root_banner\"\n                layout=\"@layout/layout_banner\"\n                android:visibility=\"gone\"\n        />\n        <include layout=\"@layout/normal_refresh_view\"/>\n    </LinearLayout>\n</androidx.core.widget.NestedScrollView>"
  },
  {
    "path": "app/src/main/res/layout/fragment_up_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n    >\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n    >\n        <include\n                android:id=\"@+id/card_up\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                layout=\"@layout/layout_header_room_info\"\n        />\n        <TextView\n                android:id=\"@+id/text_up\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"主播荣誉\"\n                style=\"@style/TextMessage\"\n                android:layout_margin=\"5dp\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/card_up\"\n        />\n        <LinearLayout\n                android:id=\"@+id/ll_certification\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                app:layout_constraintTop_toBottomOf=\"@id/text_up\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n                android:layout_margin=\"5dp\"\n                android:gravity=\"center_vertical\"\n        >\n            <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:src=\"@drawable/live_ic_certification_official\"\n            />\n            <TextView\n                    android:id=\"@+id/certification\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"bilibili 十周年成就奖UP主、2018百大UP主\"\n                    style=\"@style/TextTitle\"\n            />\n        </LinearLayout>\n        <ImageView\n                android:id=\"@+id/between_line\"\n                style=\"@style/between_line\"\n                app:layout_constraintTop_toBottomOf=\"@id/ll_certification\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                android:layout_marginTop=\"3dp\"\n                android:layout_marginBottom=\"3dp\"\n        />\n        <TextView\n                android:id=\"@+id/broadcast\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"主播公告\"\n                style=\"@style/TextMessage\"\n                android:layout_margin=\"5dp\"\n                android:maxLines=\"3\"\n                android:ellipsize=\"end\"\n                app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n        />\n        <TextView\n                android:id=\"@+id/text_broadcast\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"@dimen/fen_si_text_size\"\n                android:layout_marginTop=\"5dp\"\n                android:layout_marginBottom=\"5dp\"\n                android:layout_marginLeft=\"10dp\"\n                android:layout_marginRight=\"15dp\"\n                android:ellipsize=\"end\"\n                android:text=\"biaoti\"\n                android:maxLines=\"4\"\n                app:layout_constraintTop_toBottomOf=\"@id/broadcast\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        />\n        <ImageView\n                android:id=\"@+id/between_line2\"\n                style=\"@style/between_line\"\n                android:background=\"@color/grey_200\"\n                android:layout_height=\"10dp\"\n                app:layout_constraintTop_toBottomOf=\"@id/text_broadcast\"\n                app:layout_constraintBottom_toTopOf=\"@id/text_video\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        />\n        <TextView\n                android:id=\"@+id/text_video\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"视频\"\n                android:textColor=\"@color/colorPrimary\"\n                android:layout_margin=\"5dp\"\n                app:layout_constraintTop_toBottomOf=\"@id/between_line2\"\n                app:layout_constraintBottom_toTopOf=\"@id/refresh\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n        />\n        <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n                android:id=\"@+id/refresh\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:srlPrimaryColor=\"@color/colorPrimary\"\n                app:layout_constraintTop_toBottomOf=\"@id/text_video\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.0\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        >\n            <com.scwang.smartrefresh.header.WaterDropHeader\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"/>\n            <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                    android:id=\"@+id/recycerView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:minHeight=\"200dp\"\n            >\n\n            </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n            <include\n                    layout=\"@layout/footer_loadmore\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n\n            />\n        </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_bangumi_tv.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"@dimen/bangumi_tv_width\"\n        android:layout_height=\"@dimen/bangumi_tv_height\"\n        android:orientation=\"vertical\"\n        android:padding=\"@dimen/dp_10\"\n        android:background=\"@color/white\"\n        android:elevation=\"@dimen/dp_4\"\n        android:gravity=\"center\"\n        android:layout_marginLeft=\"@dimen/dp_10\"\n        android:layout_marginRight=\"@dimen/dp_10\"\n        android:layout_marginTop=\"@dimen/dp_4\"\n        android:layout_marginBottom=\"@dimen/dp_4\"\n>\n    <TextView\n            android:id=\"@+id/text_title\"\n           style=\"@style/TextTitle\"\n           android:text=\"第一话\"\n    />\n    <TextView\n            android:id=\"@+id/text_message\"\n            style=\"@style/TextMessage\"\n            android:text=\"guizu\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_comment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" xmlns:tools=\"http://schemas.android.com/tools\"\n>\n\n    <com.facebook.drawee.view.SimpleDraweeView\n            android:layout_width=\"@dimen/user_header_size\"\n            android:layout_height=\"@dimen/user_header_size\"\n            app:placeholderImage=\"@drawable/ic_im_avator_default\"\n            app:roundAsCircle=\"true\"\n            app:roundingBorderWidth=\"1dp\"\n            android:layout_margin=\"10dp\"\n            android:id=\"@+id/header\"/>\n\n    <LinearLayout\n            android:id=\"@+id/ll_top\"\n            android:layout_margin=\"10dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:layout_toRightOf=\"@id/header\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:gravity=\"center_vertical\"\n        >\n            <TextView\n                    android:id=\"@+id/username\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    tools:text=\"名字哈哈\"\n                    style=\"@style/TextMessage\"\n            />\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_level\"\n                    android:layout_width=\"20dp\"\n                    android:layout_height=\"wrap_content\"\n                    app:viewAspectRatio=\"2.0\"\n                    android:layout_marginLeft=\"5dp\"\n            />\n        </LinearLayout>\n        <TextView\n                android:id=\"@+id/build_num\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"楼层数 #66  昨天\"\n                style=\"@style/TextMessage\"\n                android:layout_marginTop=\"2dp\"\n                android:layout_marginBottom=\"2dp\"\n        />\n        <TextView\n                android:id=\"@+id/comment_desc\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"这是评论内容\"\n                style=\"@style/TextTitle\"\n                android:layout_marginTop=\"5dp\"\n                android:layout_marginBottom=\"5dp\"\n        />\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingTop=\"5dp\"\n                android:paddingBottom=\"5dp\"\n        >\n            <ImageView\n                    android:id=\"@+id/recommend\"\n                    app:srcCompat=\"@drawable/biligame_comment_liked\"\n                    android:layout_centerVertical=\"true\"\n                    style=\"@style/image_small\"\n            />\n            <TextView\n                    android:id=\"@+id/recommend_num\"\n                    android:layout_toRightOf=\"@id/recommend\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    tools:text=\"获赞数\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginLeft=\"5dp\"\n            />\n            <ImageView\n                    android:id=\"@+id/dislike\"\n                    app:srcCompat=\"@drawable/biligame_comment_disliked\"\n                    android:layout_centerVertical=\"true\"\n                    style=\"@style/image_small\"\n                    android:layout_toRightOf=\"@id/recommend_num\"\n                    android:layout_marginLeft=\"20dp\"\n            />\n            <ImageView\n                    android:id=\"@+id/share\"\n                    app:srcCompat=\"@drawable/ic_following_repost\"\n                    android:tint=\"@color/grey_400\"\n                    android:layout_centerVertical=\"true\"\n                    style=\"@style/image_small\"\n                    android:layout_toRightOf=\"@id/dislike\"\n                    android:layout_marginLeft=\"20dp\"\n                    android:visibility=\"visible\"\n                    android:padding=\"2dp\"\n            />\n            <ImageView\n                    android:id=\"@+id/more\"\n                    app:srcCompat=\"@drawable/ic_img_more_menu\"\n                    android:layout_centerVertical=\"true\"\n                    style=\"@style/image_small\"\n                    android:layout_alignParentRight=\"true\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n        </RelativeLayout>\n\n        <LinearLayout\n                android:id=\"@+id/ll_comment_replie\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:background=\"@color/grey_200\"\n                android:padding=\"5dp\"\n                android:visibility=\"gone\"\n        >\n            <TextView\n                    android:id=\"@+id/comment_hot1\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"@dimen/fen_si_text_size\"\n                    android:visibility=\"gone\"\n            />\n            <TextView\n                    android:id=\"@+id/comment_hot2\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"@dimen/fen_si_text_size\"\n                    android:visibility=\"gone\"\n            />\n            <TextView\n                    android:id=\"@+id/comment_hot3\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"@dimen/fen_si_text_size\"\n                    android:visibility=\"gone\"\n            />\n            <TextView\n                    android:id=\"@+id/comment_hot_more\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textColor=\"@color/blue300\"\n                    android:textSize=\"@dimen/fen_si_text_size\"\n                    tools:text=\"共4条回复>\"\n                    android:visibility=\"gone\"\n            />\n        </LinearLayout>\n    </LinearLayout>\n\n    <ImageView\n            android:id=\"@+id/segment\"\n            style=\"@style/between_line\"\n            android:layout_below=\"@id/ll_top\"\n    />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_endpage.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:gravity=\"center\"\n              android:layout_margin=\"5dp\">\n    <ImageView\n            android:id=\"@+id/item_image\"\n            style=\"@style/image_small\"\n            android:layout_margin=\"3dp\"\n            android:tint=\"@color/black_alpha_64\"\n    />\n    <TextView\n            android:id=\"@+id/item_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"标题\"\n            android:textColor=\"@color/black_alpha_112\"\n            android:textSize=\"@dimen/fen_si_text_size\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_fans_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginRight=\"20dp\"\n>\n    <LinearLayout\n            android:id=\"@+id/ll_username\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            android:layout_margin=\"5dp\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n    >\n        <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n        >\n            <ImageView\n                    android:id=\"@+id/image_rank_level\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:src=\"@drawable/ic_live_rank_1\"\n            />\n            <TextView\n                    android:id=\"@+id/text_rank_level\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"@dimen/font_12\"\n                    android:textColor=\"@color/black_alpha_112\"\n                    android:layout_gravity=\"center\"\n            />\n        </FrameLayout>\n\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/image_header\"\n                style=\"@style/image_normal\"\n                app:progressBarImageScaleType=\"centerInside\"\n                app:progressBarImage=\"@drawable/ic_im_avator_default\"\n                app:roundAsCircle=\"true\"\n                app:roundingBorderWidth=\"1dp\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n        />\n        <TextView\n                android:id=\"@+id/text_medal_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/pink_200\"\n                android:text=\"小太阳\"\n                android:textSize=\"@dimen/font_10\"\n                android:textColor=\"@color/white\"\n                android:padding=\"5dp\"\n                android:layout_marginLeft=\"8dp\"\n                android:layout_marginRight=\"8dp\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n        />\n        <TextView\n                android:id=\"@+id/username\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:maxWidth=\"100dp\"\n                android:maxLines=\"1\"\n                android:ellipsize=\"end\"\n                style=\"@style/TextMessage\"\n                android:text=\"名字\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n        />\n    </LinearLayout>\n\n\n\n    <LinearLayout\n            android:id=\"@+id/ll_gold\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.9\"\n    >\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/image_rank_gold\"\n                style=\"@style/image_small\"\n                app:progressBarImageScaleType=\"centerInside\"\n                app:progressBarImage=\"@drawable/ic_rank_seeds\"\n                app:overlayImage=\"@drawable/ic_rank_seeds\"\n                android:layout_marginRight=\"5dp\"\n        />\n        <TextView\n                android:id=\"@+id/text_gold_num\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"12345\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_fleet_header_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"15dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginRight=\"10dp\"\n>\n    <LinearLayout\n            android:id=\"@+id/ll_top2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:gravity=\"center\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintRight_toLeftOf=\"@id/ll_top1\"\n    >\n        <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n        >\n\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_top2\"\n                    style=\"@style/image_live_top\"\n                    app:progressBarImageScaleType=\"centerInside\"\n                    app:progressBarImage=\"@drawable/ic_img_user_head_default\"\n                    app:roundAsCircle=\"true\"\n                    app:roundingBorderWidth=\"1dp\"\n                    android:padding=\"5dp\"\n                    android:layout_gravity=\"center\"\n            />\n            <ImageView\n                    style=\"@style/image_live_top\"\n                    android:src=\"@drawable/ic_live_guard_commander_border_v2\"\n                    android:layout_gravity=\"center\"\n            />\n        </FrameLayout>\n        <TextView\n                android:id=\"@+id/text_top2\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:maxLines=\"1\"\n                android:maxWidth=\"100dp\"\n                android:ellipsize=\"end\"\n        />\n    </LinearLayout>\n\n    <LinearLayout\n            android:id=\"@+id/ll_top1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:gravity=\"center\"\n            app:layout_constraintLeft_toRightOf=\"@id/ll_top2\"\n            app:layout_constraintRight_toLeftOf=\"@id/ll_top3\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n\n    >\n        <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n        >\n\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_top1\"\n                    style=\"@style/image_live_top1\"\n                    app:progressBarImageScaleType=\"centerInside\"\n                    app:progressBarImage=\"@drawable/ic_im_avator_default\"\n                    app:roundAsCircle=\"true\"\n                    app:roundingBorderWidth=\"1dp\"\n                    android:layout_gravity=\"center\"\n                    android:padding=\"5dp\"\n            />\n            <ImageView\n                    style=\"@style/image_live_top1\"\n                    android:src=\"@drawable/ic_live_guard_commander_border_v2\"\n                    android:layout_gravity=\"center\"\n            />\n        </FrameLayout>\n        <TextView\n                android:id=\"@+id/text_top1\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:maxLines=\"1\"\n                android:maxWidth=\"100dp\"\n                android:ellipsize=\"end\"\n        />\n    </LinearLayout>\n\n\n    <LinearLayout\n            android:id=\"@+id/ll_top3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:gravity=\"center\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toRightOf=\"@id/ll_top1\"\n    >\n        <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n        >\n\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_top3\"\n                    style=\"@style/image_live_top\"\n                    app:progressBarImageScaleType=\"centerInside\"\n                    app:progressBarImage=\"@drawable/ic_img_user_head_default\"\n                    app:roundAsCircle=\"true\"\n                    app:roundingBorderWidth=\"1dp\"\n                    android:padding=\"5dp\"\n                    android:layout_gravity=\"center\"\n            />\n            <ImageView\n                    style=\"@style/image_live_top\"\n                    android:src=\"@drawable/ic_live_guard_commander_border_v2\"\n                    android:layout_gravity=\"center\"\n            />\n        </FrameLayout>\n        <TextView\n                android:id=\"@+id/text_top3\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:maxLines=\"1\"\n                android:maxWidth=\"100dp\"\n                android:ellipsize=\"end\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_fleet_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n>\n    <FrameLayout\n            android:id=\"@+id/frame_header\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n    >\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/image_header\"\n                style=\"@style/image_normal\"\n                app:progressBarImageScaleType=\"centerInside\"\n                app:progressBarImage=\"@drawable/ic_im_avator_default\"\n                app:roundAsCircle=\"true\"\n                app:roundingBorderWidth=\"1dp\"\n                android:padding=\"5dp\"\n                android:layout_gravity=\"center\"\n        />\n        <ImageView\n                style=\"@style/image_normal\"\n                android:src=\"@drawable/ic_live_guard_governor_border_v2\"\n                android:layout_gravity=\"center\"\n        />\n    </FrameLayout>\n\n    <TextView\n            android:id=\"@+id/username\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextMessage\"\n            android:text=\"名字\"\n            app:layout_constraintLeft_toRightOf=\"@id/frame_header\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            android:layout_marginLeft=\"10dp\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_hot_segment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:orientation=\"horizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:layout_marginTop=\"2dp\"\n        android:layout_marginBottom=\"2dp\"\n>\n    <ImageView\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:layout_height=\"0.6dp\"\n            android:background=\"@color/black_alpha_32\"\n            android:layout_marginRight=\"10dp\"\n    />\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"更多热门评论 >\"\n            android:textColor=\"@color/blue300\"\n    />\n    <ImageView\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:layout_height=\"0.6dp\"\n            android:background=\"@color/black_alpha_32\"\n            android:layout_marginLeft=\"10dp\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_live_category.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:gravity=\"center\"\n              android:layout_margin=\"5dp\"\n              android:padding=\"15dp\"\n              android:background=\"@drawable/ripple_background\"\n>\n    <com.facebook.drawee.view.SimpleDraweeView\n            android:id=\"@+id/item_live_image\"\n            style=\"@style/image_live_top\"\n            android:padding=\"@dimen/dp_4\"\n    />\n    <TextView\n            android:id=\"@+id/item_live_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"标题\"\n            android:padding=\"@dimen/dp_4\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_live_chat.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            android:layout_margin=\"5dp\"\n            android:gravity=\"center_vertical\"\n    >\n        <TextView\n                android:id=\"@+id/user_level\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/text_live_background\"\n                android:text=\"UL1\"\n                android:textSize=\"12sp\"\n                android:textColor=\"@color/colorPrimary\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                android:padding=\"3dp\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/live_room_new_title_head\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n        />\n        <TextView\n                android:id=\"@+id/username\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"我是谁: \"\n                style=\"@style/TextTitle\"\n        />\n        <TextView\n                android:id=\"@+id/message\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"我是你得不到的沙雕网友\"\n                style=\"@style/TextTitle\"\n        />\n    </LinearLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_live_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        style=\"@style/cardStyle\"\n        app:cardElevation=\"@dimen/dp_4\"\n>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/live_user_image\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:viewAspectRatio=\"1.43\"\n                app:placeholderImageScaleType=\"fitXY\"\n                app:placeholderImage=\"@drawable/ic_upper_video_default\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/live_category_name\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n                app:layout_constraintVertical_bias=\"0.0\"/>\n        <TextView\n                android:id=\"@+id/live_username\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:maxWidth=\"100dp\"\n                android:ellipsize=\"end\"\n                android:text=\"username\"\n                android:textColor=\"@color/white\"\n                tools:textColor=\"@color/black\"\n                android:textSize=\"@dimen/fen_si_text_size\"\n                android:layout_margin=\"3dp\"\n                app:layout_constraintBottom_toBottomOf=\"@id/live_user_image\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n        />\n\n        <TextView\n                android:id=\"@+id/live_people_number\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:drawableLeft=\"@drawable/ic_img_live_people\"\n                android:text=\"people number\"\n                android:textColor=\"@color/white\"\n                tools:textColor=\"@color/black\"\n                android:textSize=\"@dimen/fen_si_text_size\"\n                android:layout_margin=\"3dp\"\n                app:layout_constraintBottom_toBottomOf=\"@id/live_user_image\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        />\n\n        <TextView\n                android:id=\"@+id/live_title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"title\"\n                android:maxLines=\"1\"\n                android:ellipsize=\"end\"\n                android:layout_margin=\"2dp\"\n                app:layout_constraintTop_toBottomOf=\"@id/live_user_image\"\n                app:layout_constraintBottom_toTopOf=\"@id/live_category_name\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n        />\n        <TextView\n                android:id=\"@+id/live_category_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"category name\"\n                android:textColor=\"@color/grey_400\"\n                android:layout_margin=\"2dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/live_title\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n        />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/item_mikan_fall.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        android:id=\"@+id/mikan_foot\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"@dimen/dp_4\"\n        android:orientation=\"vertical\"\n>\n    <com.facebook.drawee.view.SimpleDraweeView\n            android:id=\"@+id/mikan_image\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:viewAspectRatio=\"3.5\"\n    />\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextTitle\"\n            android:text=\"这是标题\"\n            android:maxLines=\"2\"\n            android:ellipsize=\"end\"\n            android:id=\"@+id/title\"\n    />\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextMessage\"\n            android:text=\"这是内容\"\n            android:maxLines=\"4\"\n            android:ellipsize=\"end\"\n            android:id=\"@+id/content\"\n    />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_mikan_top_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/rl_top\"\n        android:layout_margin=\"@dimen/dp_4\"\n>\n    <ImageView\n            android:id=\"@+id/imageview\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:srcCompat=\"@drawable/bangumi_follow_home_ic_bangumi\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_margin=\"5dp\"\n            android:layout_centerVertical=\"true\"\n    />\n    <TextView\n            android:id=\"@+id/text_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextMessage\"\n            android:text=\"番剧推荐\"\n            android:layout_toRightOf=\"@id/imageview\"\n            android:layout_centerVertical=\"true\"\n    />\n    <LinearLayout\n            android:id=\"@+id/show_more\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_margin=\"8dp\"\n            android:gravity=\"center\"\n    >\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"查看更多\"\n        />\n        <ImageView\n                android:id=\"@+id/imageview_right\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/ic_img_right\"\n        />\n\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_mikan_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/mikan_video\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n>\n    <com.facebook.drawee.view.SimpleDraweeView\n            android:id=\"@+id/image_cover\"\n            android:layout_width=\"@dimen/banner_height\"\n            android:layout_height=\"wrap_content\"\n            app:viewAspectRatio=\"0.8\"\n            app:roundedCornerRadius=\"@dimen/dp_4\"\n            app:roundingBorderWidth=\"@dimen/dp_4\"\n            app:roundingBorderPadding=\"@dimen/dp_4\"\n            android:elevation=\"@dimen/dp_4\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n    <TextView\n            android:id=\"@+id/text_num\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextMessage\"\n           android:textColor=\"@color/white\"\n            app:layout_constraintBottom_toBottomOf=\"@id/image_cover\"\n            app:layout_constraintLeft_toLeftOf=\"@id/image_cover\"\n            android:layout_margin=\"5dp\"\n    />\n    <TextView\n            android:id=\"@+id/text_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextTitle\"\n            android:text=\"标题\"\n            android:maxLines=\"1\"\n            android:ellipsize=\"end\"\n            android:focusable=\"true\"\n            android:layout_marginTop=\"3dp\"\n            android:layout_marginBottom=\"3dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/image_cover\"\n    />\n    <TextView\n            android:id=\"@+id/text_cover\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextMessage\"\n            android:text=\"内容\"\n            android:maxLines=\"2\"\n            android:ellipsize=\"end\"\n            android:layout_margin=\"5dp\"\n            android:focusable=\"true\"\n            android:layout_marginBottom=\"3dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_title\"\n    />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_play_support_quility.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n>\n    <ImageView\n            android:id=\"@+id/image_vip\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_badge_vip\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/text_quility\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"1\"\n            android:padding=\"@dimen/dp_4\"\n    />\n    <TextView\n            android:id=\"@+id/text_quility\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"高清 1080P\"\n            android:textColor=\"@color/white\"\n            tools:textColor=\"@color/black_alpha_208\"\n            android:textSize=\"@dimen/font_16\"\n            app:layout_constraintTop_toBottomOf=\"@id/image_vip\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.0\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_rank_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:orientation=\"vertical\"\n>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n        <TextView\n                android:id=\"@+id/text_rank\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"1\"\n                android:textColor=\"@color/colorPrimary\"\n                android:textSize=\"@dimen/font_22\"\n                android:textStyle=\"bold\"\n                android:padding=\"@dimen/dp_10\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toLeftOf=\"@id/cover_image\"\n\n        />\n\n\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/cover_image\"\n                android:layout_width=\"120dp\"\n                android:layout_height=\"wrap_content\"\n                app:viewAspectRatio=\"1.43\"\n                app:roundedCornerRadius=\"@dimen/dp_4\"\n                android:scaleType=\"centerCrop\"\n                app:placeholderImageScaleType=\"centerInside\"\n                app:placeholderImage=\"@drawable/ic_live_no_face\"\n                android:layout_margin=\"5dp\"\n                android:layout_centerVertical=\"true\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toRightOf=\"@id/text_rank\"\n                app:layout_constraintRight_toLeftOf=\"@id/ll_detail\"\n                app:layout_constraintVertical_bias=\"0.5\"\n        />\n        <LinearLayout\n                android:id=\"@+id/ll_detail\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:layout_toRightOf=\"@id/cover_image\"\n                android:layout_margin=\"5dp\"\n                app:layout_constraintLeft_toRightOf=\"@id/cover_image\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n        >\n            <TextView\n                    android:id=\"@+id/title\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"@dimen/user_name_text_size\"\n                    android:textColor=\"@color/black_alpha_176\"\n                    tools:text=\"ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大\"\n                    android:maxLines=\"2\"\n                    android:ellipsize=\"end\"\n            />\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_margin=\"2dp\"\n            >\n                <ImageView\n                        android:layout_width=\"15dp\"\n                        android:layout_height=\"15dp\"\n                        app:srcCompat=\"@drawable/ic_img_up_name\"\n                        android:layout_margin=\"2dp\"\n                />\n                <TextView\n                        android:id=\"@+id/up_name\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        style=\"@style/TextMessage\"\n                />\n\n            </LinearLayout>\n\n            <RelativeLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n            >\n                <TextView\n                        android:id=\"@+id/grade\"\n                        style=\"@style/TextMessage\"\n                        tools:text=\"综合评分：22222\"\n                />\n\n                <ImageView\n                        android:id=\"@+id/more\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        app:srcCompat=\"@drawable/ic_img_more_menu\"\n                        android:layout_alignParentRight=\"true\"\n                        android:layout_centerVertical=\"true\"\n                />\n            </RelativeLayout>\n        </LinearLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n    <LinearLayout\n            android:id=\"@+id/root_show_all\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n    >\n        <TextView\n                android:id=\"@+id/text_show_all\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/show_all_ranking_list_video\"\n                android:drawablePadding=\"@dimen/dp_4\"\n                android:textSize=\"@dimen/font_14\"\n                android:textColor=\"@color/colorPrimary\"\n                android:drawableTint=\"@color/colorPrimary\"\n                android:drawableRight=\"@drawable/ic_arrow_down_gray_round\"\n                android:layout_gravity=\"center_horizontal\"\n                android:background=\"@drawable/ripple_background\"\n                android:padding=\"@dimen/dp_4\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n        />\n    </LinearLayout>\n    <ImageView\n            style=\"@style/between_line\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_marginBottom=\"5dp\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_rank_list_child.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n>\n    <TextView\n            android:id=\"@+id/text_title\"\n            style=\"@style/TextTitle\"\n            android:text=\"标题\"\n            android:layout_marginLeft=\"@dimen/len_24\"\n            android:padding=\"@dimen/dp_4\"\n\n    />\n    <TextView\n            android:id=\"@+id/text_grade\"\n            style=\"@style/TextMessage\"\n            android:text=\"内容\"\n            android:layout_marginLeft=\"@dimen/len_24\"\n            android:padding=\"@dimen/dp_4\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_region.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        >\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"5dp\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:id=\"@+id/cons_header\"\n    >\n        <ImageView\n                android:id=\"@+id/image_logo\"\n                style=\"@style/image_normal\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n        />\n        <TextView\n                android:id=\"@+id/region_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:text=\"番剧区\"\n                android:layout_marginLeft=\"5dp\"\n                app:layout_constraintLeft_toRightOf=\"@id/image_logo\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n        />\n        <Button\n                android:id=\"@+id/button_goto\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"@dimen/button_height\"\n                android:background=\"@drawable/button_more_background\"\n                android:textColor=\"@color/white\"\n                android:text=\"进去看看\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n        />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerview\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/cons_header\"\n            android:layout_margin=\"5dp\"\n    >\n    </androidx.recyclerview.widget.RecyclerView>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/recyclerview\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n    >\n        <Button\n                android:id=\"@+id/button_more\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"@dimen/button_height\"\n                android:background=\"@drawable/button_white_line_background\"\n                android:text=\"更多番剧\"\n                android:textColor=\"@color/black_alpha_112\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:elevation=\"@dimen/dp_4\"\n                android:padding=\"2dp\"\n        />\n        <LinearLayout\n                android:id=\"@+id/ll_refresh\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                android:gravity=\"center_vertical\"\n                android:background=\"@drawable/ripple_background\"\n        >\n            <TextView\n                    android:id=\"@+id/text_new_number\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"0条新动态，点击刷新！\"\n                    style=\"@style/TextMessage\"\n            />\n            <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:src=\"@drawable/ic_bangumi_refresh_pink\"\n                    android:tint=\"@color/colorPrimary\"\n            />\n        </LinearLayout>\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_region_bottom_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\">\n    <Button\n            android:id=\"@+id/button_more\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"@dimen/button_height\"\n            android:background=\"@drawable/button_white_line_background\"\n            android:text=\"更多番剧\"\n            android:textColor=\"@color/black_alpha_112\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            android:elevation=\"@dimen/dp_4\"\n            android:padding=\"2dp\"\n    />\n    <LinearLayout\n            android:id=\"@+id/ll_refresh\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:gravity=\"center_vertical\"\n            android:background=\"@drawable/ripple_background\"\n    >\n        <TextView\n                android:id=\"@+id/text_new_number\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"0条新动态，点击刷新！\"\n                style=\"@style/TextMessage\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_bangumi_refresh_pink\"\n                android:tint=\"@color/colorPrimary\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_region_top_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/cons_header\"\n        android:layout_margin=\"5dp\"\n>\n\n    <ImageView\n            android:id=\"@+id/image_logo\"\n            style=\"@style/image_normal\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n    />\n    <TextView\n            android:id=\"@+id/region_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextTitle\"\n            android:text=\"番剧区\"\n            android:layout_marginLeft=\"5dp\"\n            app:layout_constraintLeft_toRightOf=\"@id/image_logo\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintVertical_bias=\"0.5\"\n    />\n    <Button\n            android:id=\"@+id/button_goto\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"@dimen/button_height\"\n            android:background=\"@drawable/button_more_background\"\n            android:textColor=\"@color/white\"\n            android:text=\"进去看看\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintVertical_bias=\"0.5\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_theme.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:padding=\"@dimen/dp_4\"\n        android:elevation=\"@dimen/dp_4\"\n        android:orientation=\"vertical\"\n        android:background=\"@color/white\"\n>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n\n    >\n        <ImageView\n                android:id=\"@+id/image_color\"\n                style=\"@style/image_small\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n        />\n        <LinearLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintLeft_toRightOf=\"@id/image_color\"\n                app:layout_constraintRight_toLeftOf=\"@id/button_pay\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center_vertical\"\n                app:layout_constraintHorizontal_bias=\"0.02\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                android:layout_marginLeft=\"@dimen/dp_10\"\n        >\n            <TextView\n                    android:id=\"@+id/text_theme_name\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"少女粉\"\n                    style=\"@style/TextTitle\"\n                    app:layout_constraintLeft_toRightOf=\"@id/image_color\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n            />\n            <TextView\n                    android:id=\"@+id/text_theme_price\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"5硬币/月\"\n                    style=\"@style/TextMessage\"\n                    android:visibility=\"gone\"\n                    tools:visibility=\"visible\"\n            />\n        </LinearLayout>\n\n        <Button\n                android:id=\"@+id/button_pay\"\n                android:layout_width=\"@dimen/button_width\"\n                android:layout_height=\"@dimen/button_height\"\n                android:text=\"订阅\"\n                android:textColor=\"@color/colorPrimary\"\n                android:background=\"@drawable/register_button_background\"\n                app:layout_constraintRight_toLeftOf=\"@id/image_choose\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:layout_marginRight=\"@dimen/dp_10\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n        />\n        <ImageView\n                android:id=\"@+id/image_choose\"\n                style=\"@style/image_small\"\n                android:src=\"@drawable/ic_upper_choose\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:layout_marginRight=\"8dp\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\"\n                android:backgroundTint=\"@color/colorPrimary\"\n        />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n    <ImageView\n            style=\"@style/between_line\"\n            android:layout_marginTop=\"@dimen/dp_4\"\n    />\n</LinearLayout>\n\n"
  },
  {
    "path": "app/src/main/res/layout/item_topic_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:cardBackgroundColor=\"@color/white\"\n        android:layout_margin=\"@dimen/dp_10\"\n        app:cardCornerRadius=\"@dimen/len_2\"\n        app:cardElevation=\"@dimen/dp_4\"\n        app:cardUseCompatPadding=\"true\"\n>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n    >\n\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/image_cover\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:viewAspectRatio=\"2.5\"\n                app:placeholderImageScaleType=\"fitXY\"\n                app:placeholderImage=\"@drawable/ic_upper_video_default\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/title\"\n        />\n        <ImageView\n                android:id=\"@+id/image_state\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/ic_badge_going\"\n                app:layout_constraintTop_toTopOf=\"@id/image_cover\"\n                app:layout_constraintLeft_toLeftOf=\"@id/image_cover\"\n                app:layout_constraintRight_toRightOf=\"@id/image_cover\"\n                app:layout_constraintHorizontal_bias=\"0.9\"\n        />\n        <TextView\n                android:id=\"@+id/title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:text=\"哒哒哒\"\n                android:textSize=\"@dimen/font_18\"\n                app:layout_constraintTop_toBottomOf=\"@id/image_cover\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n                android:layout_margin=\"@dimen/dp_10\"\n        />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        style=\"@style/cardStyle\"\n        app:cardCornerRadius=\"3dp\"\n        android:id=\"@+id/item_video\"\n>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/play_image\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:viewAspectRatio=\"1.6\"\n                app:placeholderImageScaleType=\"fitXY\"\n                app:placeholderImage=\"@drawable/ic_upper_video_default\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/play_title\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.0\"\n        />\n        <LinearLayout\n                android:id=\"@+id/ll_info\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:gravity=\"center_vertical\"\n                app:layout_constraintBottom_toBottomOf=\"@id/play_image\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n                android:layout_margin=\"3dp\"\n        >\n            <ImageView\n                    android:layout_width=\"20dp\"\n                    android:layout_height=\"20dp\"\n                    app:srcCompat=\"@drawable/ic_img_play_number\"\n                    android:layout_marginLeft=\"5dp\"\n                    android:layout_marginRight=\"2dp\"\n                    android:tint=\"@color/white\"\n            />\n            <TextView\n                    android:id=\"@+id/play_number\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"play number\"\n                    android:textColor=\"@color/white\"\n                    tools:textColor=\"@color/black\"\n\n            />\n\n            <ImageView\n                    android:id=\"@+id/image_comment_number\"\n                    android:layout_width=\"20dp\"\n                    android:layout_height=\"20dp\"\n                    app:srcCompat=\"@drawable/ic_img_danmaku_number\"\n                    android:layout_marginLeft=\"5dp\"\n                    android:layout_marginRight=\"2dp\"\n                    android:tint=\"@color/white\"\n            />\n            <TextView\n                    android:id=\"@+id/comment_number\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"comment\"\n                    android:textColor=\"@color/white\"\n                    tools:textColor=\"@color/black\"\n            />\n        </LinearLayout>\n        <TextView\n                android:id=\"@+id/play_title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"title\"\n                android:maxLines=\"2\"\n                android:ellipsize=\"end\"\n                android:layout_marginLeft=\"@dimen/dp_4\"\n                android:layout_marginTop=\"@dimen/dp_4\"\n                android:layout_marginRight=\"@dimen/dp_4\"\n                app:layout_constraintTop_toBottomOf=\"@id/play_image\"\n                app:layout_constraintBottom_toBottomOf=\"@id/cons_category\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n        />\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/cons_category\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintTop_toBottomOf=\"@id/play_title\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n\n                app:layout_goneMarginBottom=\"0dp\"\n                app:layout_goneMarginTop=\"0dp\"\n        >\n            <TextView\n                    android:id=\"@+id/category_name\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"category name\"\n                    style=\"@style/TextMessage\"\n                    android:layout_marginLeft=\"@dimen/dp_4\"\n                    android:layout_marginStart=\"@dimen/dp_4\"\n                    android:textColor=\"@color/grey_400\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toLeftOf=\"@id/image_more\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintVertical_bias=\"0.5\"\n                    app:layout_constraintHorizontal_bias=\"0.0\"\n            />\n            <ImageView\n                    android:id=\"@+id/image_more\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:srcCompat=\"@drawable/ic_img_more_menu\"\n                    android:padding=\"3dp\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintVertical_bias=\"0.5\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/item_videodetail_recommend.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"10dp\"\n>\n    <com.facebook.drawee.view.SimpleDraweeView\n            android:id=\"@+id/cover_image\"\n            android:layout_width=\"120dp\"\n            android:layout_height=\"wrap_content\"\n            app:viewAspectRatio=\"1.43\"\n            app:roundedCornerRadius=\"@dimen/dp_4\"\n            android:scaleType=\"centerCrop\"\n            app:placeholderImageScaleType=\"centerInside\"\n            app:placeholderImage=\"@drawable/ic_live_no_face\"\n            android:layout_margin=\"5dp\"\n            android:layout_centerVertical=\"true\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toLeftOf=\"@id/ll_detail\"\n            app:layout_constraintVertical_bias=\"0.5\"\n    />\n    <LinearLayout\n            android:id=\"@+id/ll_detail\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:layout_toRightOf=\"@id/cover_image\"\n            android:layout_margin=\"5dp\"\n            app:layout_constraintLeft_toRightOf=\"@id/cover_image\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintVertical_bias=\"0.5\"\n    >\n        <TextView\n                android:id=\"@+id/title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"@dimen/user_name_text_size\"\n                tools:text=\"ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大ha哈哈大\"\n                android:maxLines=\"2\"\n                android:ellipsize=\"end\"\n        />\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:gravity=\"center_vertical\"\n                android:layout_margin=\"2dp\"\n        >\n            <ImageView\n                    android:layout_width=\"15dp\"\n                    android:layout_height=\"15dp\"\n                    app:srcCompat=\"@drawable/ic_img_up_name\"\n                    android:layout_margin=\"2dp\"\n            />\n            <TextView\n                    android:id=\"@+id/up_name\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    style=\"@style/TextMessage\"\n            />\n\n        </LinearLayout>\n\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n        >\n            <LinearLayout\n                    android:id=\"@+id/ll_play\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:layout_margin=\"1dp\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_centerVertical=\"true\"\n            >\n                <ImageView\n                        android:layout_width=\"15dp\"\n                        android:layout_height=\"15dp\"\n                        app:srcCompat=\"@drawable/ic_img_play_number\"\n                        android:layout_margin=\"2dp\"\n                        android:tint=\"@color/black_alpha_64\"\n                />\n                <TextView\n                        android:id=\"@+id/play_num\"\n                        style=\"@style/TextMessage\"\n                        tools:text=\"14.1万\"\n                />\n            </LinearLayout>\n\n            <LinearLayout\n                    android:id=\"@+id/ll_damku\"\n                    android:layout_toRightOf=\"@id/ll_play\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:layout_margin=\"1dp\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_centerVertical=\"true\"\n            >\n                <ImageView\n                        android:layout_width=\"15dp\"\n                        android:layout_height=\"15dp\"\n                        app:srcCompat=\"@drawable/ic_img_danmaku_number\"\n                        android:tint=\"@color/black_alpha_64\"\n                        android:layout_margin=\"2dp\"\n\n                />\n                <TextView\n                        android:id=\"@+id/damku_num\"\n                        style=\"@style/TextMessage\"\n                        tools:text=\"14.1万\"\n                />\n                <TextView\n                        android:id=\"@+id/av_num\"\n                        style=\"@style/TextMessage\"\n                        android:text=\"        \"\n                />\n            </LinearLayout>\n            <ImageView\n                    android:id=\"@+id/more\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:srcCompat=\"@drawable/ic_img_more_menu\"\n                    android:layout_alignParentRight=\"true\"\n                    android:layout_centerVertical=\"true\"\n            />\n        </RelativeLayout>\n    </LinearLayout>\n    <ImageView\n            style=\"@style/between_line\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_marginBottom=\"5dp\"\n            android:layout_below=\"@id/ll_detail\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_banner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                                             xmlns:app=\"http://schemas.android.com/apk/res-auto\" android:layout_width=\"match_parent\"\n                                             android:layout_height=\"120dp\">\n    <com.youth.banner.Banner\n            android:id=\"@+id/live_banner\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/banner_height\"\n            android:layout_marginBottom=\"8dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            android:layout_marginStart=\"8dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            android:layout_marginEnd=\"8dp\"\n            app:layout_constraintHorizontal_bias=\"0.0\"\n            app:layout_constraintVertical_bias=\"0.0\">\n    </com.youth.banner.Banner>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_category.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                                             xmlns:app=\"http://schemas.android.com/apk/res-auto\" xmlns:tools=\"http://schemas.android.com/tools\" android:layout_width=\"match_parent\"\n                                             android:layout_height=\"wrap_content\">\n\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycerView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\" app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" app:layout_constraintHorizontal_bias=\"0.0\"\n            app:layout_constraintVertical_bias=\"0.0\"/>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:gravity=\"center\"\n>\n    <ImageView\n            android:id=\"@+id/image_error\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/img_tips_error_not_foud\"\n    />\n    <TextView\n            android:id=\"@+id/text_desc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"电波无法到达哟\"\n            android:layout_marginTop=\"10dp\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_header_comment_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                                             android:layout_width=\"match_parent\"\n                                             android:layout_height=\"wrap_content\"\n                                             xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <include\n            android:id=\"@+id/main_comment\"\n            layout=\"@layout/item_comment\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/top_bar\"\n            app:layout_constraintBottom_toTopOf=\"@id/text_count\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n    <TextView\n            android:id=\"@+id/text_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"相关回复共100条\"\n            style=\"@style/TextMessage\"\n            app:layout_constraintTop_toBottomOf=\"@id/main_comment\"\n            app:layout_constraintBottom_toTopOf=\"@id/replay\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.03\"\n            android:layout_margin=\"3dp\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_header_room_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" >\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n    >\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:layout_width=\"45dp\"\n                android:layout_height=\"45dp\"\n                app:progressBarImageScaleType=\"centerInside\"\n                app:progressBarImage=\"@drawable/ic_img_user_head_default\"\n                app:roundAsCircle=\"true\"\n                app:roundingBorderWidth=\"1dp\"\n                android:layout_margin=\"8dp\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                android:id=\"@+id/image_header\"/>\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintLeft_toRightOf=\"@id/image_header\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:layout_margin=\"5dp\"\n        >\n            <LinearLayout\n                    android:id=\"@+id/ll_up\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n            >\n                <TextView\n                        android:id=\"@+id/up_name\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"海带Monster\"\n                        style=\"@style/TextTitle\"\n\n                />\n                <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:src=\"@drawable/mall_mine_vip_level_6\"\n                        android:layout_marginLeft=\"5dp\"\n                />\n            </LinearLayout>\n            <LinearLayout\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/ll_up\"\n            >\n                <TextView\n                        android:id=\"@+id/people_num\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"人气：798\"\n                        style=\"@style/TextTitle\"\n\n                />\n                <TextView\n                        android:id=\"@+id/fensi_num\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"粉丝：798\"\n                        style=\"@style/TextTitle\"\n                        android:layout_marginLeft=\"5dp\"\n                />\n                <TextView\n                        android:id=\"@+id/category\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        style=\"@style/TextTitle\"\n                        android:layout_marginLeft=\"5dp\"\n                />\n            </LinearLayout>\n        </androidx.constraintlayout.widget.ConstraintLayout>\n        <LinearLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"@dimen/button_height\"\n                android:background=\"@color/colorPrimary\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                android:orientation=\"horizontal\"\n                android:gravity=\"center_vertical\"\n                android:layout_marginRight=\"5dp\"\n        >\n            <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:src=\"@drawable/ic_add_follow\"\n                    android:layout_marginLeft=\"10dp\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"关注\"\n                    android:textSize=\"14sp\"\n                    android:textColor=\"@color/white\"\n                    android:layout_marginLeft=\"3dp\"\n                    android:layout_marginRight=\"10dp\"\n            />\n        </LinearLayout>\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/layout_laybel_watch_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/show_more\"\n        android:orientation=\"horizontal\"\n        android:gravity=\"center_vertical\"\n        android:padding=\"@dimen/dp_4\"\n        android:background=\"@color/black_alpha_16\"\n>\n        <ImageView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                style=\"@style/between_line\"\n                android:layout_marginLeft=\"@dimen/dp_10\"\n                android:layout_marginRight=\"@dimen/dp_10\"\n        />\n        <LinearLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:gravity=\"center_vertical\"\n        >\n            <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:src=\"@drawable/ic_arrow_down_gray_round\"\n                    android:layout_marginRight=\"@dimen/dp_4\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"查看更多\"\n            />\n        </LinearLayout>\n\n        <ImageView\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                style=\"@style/between_line\"\n                android:layout_marginLeft=\"@dimen/dp_10\"\n                android:layout_marginRight=\"@dimen/dp_10\"\n        />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_partition.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"@dimen/dp_4\"\n>\n    <com.facebook.drawee.view.SimpleDraweeView\n            android:id=\"@+id/image_part\"\n            style=\"@style/image_small\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/live_partition_recy\"\n            app:layout_constraintVertical_bias=\"0.5\"\n            app:viewAspectRatio=\"1\"\n            app:placeholderImageScaleType=\"centerInside\"\n            app:actualImageScaleType=\"centerInside\"\n    />\n    <TextView\n            android:id=\"@+id/live_category_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"视频唱见\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/live_partition_recy\"\n            app:layout_constraintLeft_toRightOf=\"@id/image_part\"\n            app:layout_constraintVertical_bias=\"0.5\"\n            android:layout_marginLeft=\"@dimen/dp_4\"\n    />\n    <TextView\n            android:id=\"@+id/live_look_more\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"当前0个直播\"\n            style=\"@style/TextMessage\"\n            android:layout_gravity=\"right\"\n            android:textColor=\"@color/black_alpha_112\"\n            android:gravity=\"center_vertical\"\n            app:layout_constraintRight_toLeftOf=\"@id/image_more\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/live_partition_recy\"\n            app:layout_constraintVertical_bias=\"0.5\"\n    />\n    <ImageView\n            android:id=\"@+id/image_more\"\n            style=\"@style/image_small\"\n            android:src=\"@drawable/ic_img_right\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/live_partition_recy\"\n            app:layout_constraintVertical_bias=\"0.5\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_margin=\"@dimen/dp_4\"\n    />\n\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/live_partition_recy\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/image_part\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    >\n\n    </androidx.recyclerview.widget.RecyclerView>\n    <ImageView\n            style=\"@style/between_line\"\n            app:layout_constraintTop_toBottomOf=\"@id/live_partition_recy\"\n            android:layout_marginTop=\"5dp\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_recommend.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n>\n\n        <ImageView\n                android:id=\"@+id/image_recommend\"\n                style=\"@style/image_normal\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/recycerView\"\n                android:src=\"@drawable/live_home_follow_anchor\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"推荐直播\"\n                android:layout_margin=\"5dp\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/recycerView\"\n                app:layout_constraintLeft_toRightOf=\"@id/image_recommend\"\n        />\n        <TextView\n                android:id=\"@+id/live_recommend_refresh\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"换一换\"\n                style=\"@style/TextMessage\"\n                android:drawablePadding=\"5dp\"\n                android:gravity=\"center_vertical\"\n                android:drawableRight=\"@drawable/ic_bangumi_refresh_pink\"\n                android:layout_marginRight=\"5dp\"\n                android:padding=\"5dp\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/recycerView\"\n        />\n\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintTop_toBottomOf=\"@id/image_recommend\"\n        >\n        </androidx.recyclerview.widget.RecyclerView>\n        <TextView\n                android:id=\"@+id/live_recommend_more\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"更多个推荐直播 >\"\n                android:padding=\"5dp\"\n                android:layout_margin=\"5dp\"\n                android:textColor=\"@color/colorPrimary\"\n                app:layout_constraintTop_toBottomOf=\"@id/recycerView\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        />\n    <ImageView\n            style=\"@style/between_line\"\n            app:layout_constraintTop_toBottomOf=\"@id/live_recommend_more\"\n            android:layout_marginTop=\"5dp\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout >"
  },
  {
    "path": "app/src/main/res/layout/linear_card_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:background=\"@drawable/ripple_background\"\n>\n    <TextView\n            android:id=\"@+id/text_left\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/account_info\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@id/between_line\"\n            style=\"@style/TextTitle\"\n            android:padding=\"@dimen/len_12\"\n    />\n    <TextView\n            android:id=\"@+id/text_right\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"1234546\"\n            app:layout_constraintRight_toLeftOf=\"@id/image_right\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@id/between_line\"\n            style=\"@style/TextTitle\"\n            android:padding=\"@dimen/len_12\"\n    />\n    <ImageView\n            android:id=\"@+id/image_right\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_img_right\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@id/between_line\"\n            android:layout_marginRight=\"@dimen/dp_4\"\n            android:padding=\"@dimen/len_12\"\n    />\n    <ImageView\n            android:id=\"@+id/between_line\"\n            style=\"@style/between_line\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_left\"\n            app:layout_constraintVertical_bias=\"1.0\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/live_top_region.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        style=\"@style/cardStyle\"\n        app:cardCornerRadius=\"2dp\"\n        >\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n    >\n        <include layout=\"@layout/layout_banner\"/>\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"5\"\n                android:orientation=\"horizontal\"\n        >\n            <TextView\n                    android:id=\"@+id/tv_live_follow\"\n                    style=\"@style/text_style_navigation\"\n                    android:clickable=\"true\"\n                    android:drawableTop=\"@drawable/live_home_follow_anchor\"\n                    android:text=\"@string/nav_follow\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n\n            <TextView\n                    android:id=\"@+id/tv_live_happy\"\n                    style=\"@style/text_style_navigation\"\n                    android:clickable=\"true\"\n                    android:drawableTop=\"@drawable/ic_live_home_entertainment\"\n                    android:text=\"@string/nav_entertainment\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n\n            <TextView\n                    android:id=\"@+id/tv_live_video\"\n                    style=\"@style/text_style_navigation\"\n                    android:clickable=\"true\"\n                    android:drawableTop=\"@drawable/ic_live_home_game\"\n                    android:text=\"@string/nav_game\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n\n            <TextView\n                    android:id=\"@+id/tv_live_game\"\n                    style=\"@style/text_style_navigation\"\n                    android:clickable=\"true\"\n                    android:drawableTop=\"@drawable/ic_live_home_mobile_game\"\n                    android:text=\"@string/nav_mobile_game\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n\n            <TextView\n                    android:id=\"@+id/tv_live_draw\"\n                    style=\"@style/text_style_navigation\"\n                    android:clickable=\"true\"\n                    android:drawableTop=\"@drawable/ic_live_home_painting\"\n                    android:text=\"@string/nav_painting\"\n                    android:background=\"@drawable/ripple_background\"\n            />\n        </LinearLayout>\n    </LinearLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/mikan_content_cn.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/white\"\n>\n    <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:id=\"@+id/rl_top\"\n    >\n        <ImageView\n                android:id=\"@+id/imageview_jp\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/bangumi_follow_home_ic_domestic\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_margin=\"5dp\"\n                android:layout_centerVertical=\"true\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"国漫推荐\"\n                android:layout_toRightOf=\"@id/imageview_jp\"\n                android:layout_centerVertical=\"true\"\n        />\n        <ImageView\n                android:id=\"@+id/imageview_right\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/ic_img_right\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_margin=\"5dp\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"查看更多\"\n                android:layout_toLeftOf=\"@id/imageview_right\"\n                android:layout_centerVertical=\"true\"\n        />\n    </RelativeLayout>\n\n\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycerView_cn\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/rl_top\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    >\n    </androidx.recyclerview.widget.RecyclerView>\n\n    <LinearLayout\n            android:id=\"@+id/fall\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintTop_toBottomOf=\"@id/recycerView_cn\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n\n            android:layout_margin=\"10dp\"\n    >\n        <com.facebook.drawee.view.SimpleDraweeView\n                android:id=\"@+id/mikan_image_cn\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:viewAspectRatio=\"3.5\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:text=\"这是标题\"\n                android:id=\"@+id/title_cn\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"这是内容\"\n                android:id=\"@+id/content_cn\"\n        />\n    </LinearLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/mikan_content_jp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/white\"\n>\n    <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:id=\"@+id/rl_top\"\n    >\n        <ImageView\n                android:id=\"@+id/imageview_jp\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/bangumi_follow_home_ic_bangumi\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_margin=\"5dp\"\n                android:layout_centerVertical=\"true\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"番剧推荐\"\n                android:layout_toRightOf=\"@id/imageview_jp\"\n                android:layout_centerVertical=\"true\"\n        />\n        <ImageView\n                android:id=\"@+id/imageview_right\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/ic_img_right\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_margin=\"8dp\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\"查看更多\"\n                android:layout_toLeftOf=\"@id/imageview_right\"\n                android:layout_centerVertical=\"true\"\n        />\n    </RelativeLayout>\n\n\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/rl_top\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    >\n    </androidx.recyclerview.widget.RecyclerView>\n\n    <include\n            android:id=\"@+id/fall\"\n            layout=\"@layout/item_mikan_fall\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toBottomOf=\"@id/recycerView\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/mikan_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/cons_top_root\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/between_line\"\n    >\n\n        <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/guide_center\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_percent=\"0.5\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/bangumi_follow_home_ic_index_bangumi\"\n                android:id=\"@+id/imageView_index_bangumi\"\n                app:layout_constraintRight_toRightOf=\"@id/guide_center\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                app:layout_constraintHorizontal_bias=\"0.5\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/bangumi_follow_home_ic_index_bangumi2\"\n                android:id=\"@+id/imageView_index_bangumi2\"\n                app:layout_constraintBottom_toBottomOf=\"@id/imageView_index_bangumi\"\n                app:layout_constraintLeft_toLeftOf=\"@id/imageView_index_bangumi\"\n\n        />\n\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/bangumi_follow_home_ic_index_domestic\"\n                android:id=\"@+id/imageView_index_domestic\"\n                app:layout_constraintLeft_toLeftOf=\"@id/guide_center\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.5\"\n                app:layout_constraintHorizontal_bias=\"0.5\"\n        />\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:srcCompat=\"@drawable/bangumi_follow_home_ic_index_domestic2\"\n                android:id=\"@+id/imageView_index_domestic2\"\n                app:layout_constraintBottom_toBottomOf=\"@id/imageView_index_domestic\"\n                app:layout_constraintLeft_toLeftOf=\"@id/imageView_index_domestic\"\n\n        />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n    <ImageView\n            android:id=\"@+id/between_line\"\n            style=\"@style/between_line\"\n            app:layout_constraintTop_toBottomOf=\"@id/cons_top_root\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n    <ImageView\n            android:id=\"@+id/between_hor\"\n            style=\"@style/between_line\"\n            android:layout_width=\"0.6dp\"\n            android:layout_height=\"24dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n            app:layout_constraintBottom_toTopOf=\"@id/between_line_large\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.5\"\n            app:layout_constraintVertical_bias=\"0.5\"\n\n    />\n    <LinearLayout\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center\"\n            app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n            app:layout_constraintRight_toLeftOf=\"@id/between_hor\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/between_line_large\"\n            android:padding=\"@dimen/dp_4\"\n            android:background=\"@drawable/ripple_background\"\n    >\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/bangumi_follow_home_ic_timeline\"\n\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"时间表\"\n                android:layout_marginLeft=\"10dp\"\n        />\n    </LinearLayout>\n\n    <LinearLayout\n            android:id=\"@+id/ll_bangumi_index\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center\"\n            app:layout_constraintLeft_toRightOf=\"@id/between_hor\"\n            app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@id/between_line_large\"\n            android:padding=\"@dimen/dp_4\"\n            android:background=\"@drawable/ripple_background\"\n    >\n        <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/bangumi_follow_home_ic_index\"\n\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"索引\"\n                android:layout_marginLeft=\"10dp\"\n        />\n    </LinearLayout>\n    <ImageView\n            android:id=\"@+id/between_line_large\"\n            style=\"@style/between_line\"\n            android:layout_height=\"14dp\"\n            android:layout_marginTop=\"5dp\"\n            app:layout_constraintTop_toBottomOf=\"@id/ll_bangumi_index\"\n            app:layout_constraintBottom_toTopOf=\"@id/imageview_login\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n    <ImageView\n            android:id=\"@+id/imageview_login\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:scaleType=\"centerCrop\"\n            app:srcCompat=\"@drawable/bangumi_follow_home_login_guide\"\n            app:layout_constraintTop_toBottomOf=\"@id/between_line_large\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/nav_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:fresco=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"180dp\"\n            android:background=\"@color/colorPrimary\"\n    >\n        <LinearLayout\n                android:id=\"@+id/ll_header\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                fresco:layout_constraintEnd_toEndOf=\"parent\"\n                fresco:layout_constraintStart_toStartOf=\"parent\"\n                fresco:layout_constraintBottom_toBottomOf=\"parent\"\n                fresco:layout_constraintTop_toTopOf=\"parent\"\n                fresco:layout_constraintHorizontal_bias=\"0.1\"\n                fresco:layout_constraintVertical_bias=\"0.9\"\n        >\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:layout_width=\"45dp\"\n                    android:layout_height=\"45dp\"\n                    fresco:progressBarImageScaleType=\"centerInside\"\n                    fresco:progressBarImage=\"@drawable/ic_img_user_head_default\"\n                    fresco:roundAsCircle=\"true\"\n                    fresco:roundingBorderWidth=\"1dp\"\n                    android:layout_margin=\"8dp\"\n                    android:id=\"@+id/nav_header\"/>\n            <LinearLayout\n                    android:id=\"@+id/ll_user_info\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n            >\n                <TextView\n                        android:id=\"@+id/text_name\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"你的名字\"\n                        android:textColor=\"@color/white\"\n                        android:textSize=\"16sp\"\n                        android:layout_marginBottom=\"5dp\"\n                        android:layout_marginTop=\"5dp\"\n                        android:layout_marginEnd=\"5dp\"\n                        android:layout_marginStart=\"5dp\"\n                />\n\n                <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        fresco:srcCompat=\"@drawable/ic_user_level_2\"\n                />\n            </LinearLayout>\n\n            <LinearLayout\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    fresco:layout_constraintBottom_toBottomOf=\"parent\"\n                    fresco:layout_constraintTop_toBottomOf=\"@+id/ll_user_info\"\n                    fresco:layout_constraintEnd_toEndOf=\"parent\"\n                    fresco:layout_constraintStart_toStartOf=\"parent\"\n                    fresco:layout_constraintLeft_toLeftOf=\"parent\"\n                    fresco:layout_constraintRight_toRightOf=\"parent\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_marginBottom=\"5dp\"\n            >\n                <TextView\n                        android:id=\"@+id/icon_num\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"B币：0.0\"\n                        android:textSize=\"14sp\"\n                        android:textColor=\"@color/white_alpha_160\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:layout_marginStart=\"8dp\"\n                />\n                <TextView\n                        android:id=\"@+id/ying_bi_num\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"硬币：701.0\"\n                        android:textSize=\"14sp\"\n                        android:textColor=\"@color/white_alpha_160\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:layout_marginStart=\"8dp\"\n                />\n            </LinearLayout>\n        </LinearLayout>\n\n\n\n        <ImageView\n                style=\"@style/image_normal\"\n                fresco:srcCompat=\"@drawable/ic_img_scan_qr_code\"\n                android:layout_marginEnd=\"8dp\"\n                fresco:layout_constraintEnd_toEndOf=\"parent\"\n                android:layout_marginTop=\"8dp\"\n                fresco:layout_constraintTop_toTopOf=\"parent\"\n                fresco:layout_constraintStart_toEndOf=\"@+id/ll_header\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginBottom=\"8dp\"\n                fresco:layout_constraintBottom_toBottomOf=\"parent\"\n                fresco:layout_constraintHorizontal_bias=\"0.929\"\n                fresco:layout_constraintVertical_bias=\"0.195\"/>\n\n        <ImageView\n                android:layout_width=\"150dp\"\n                android:layout_height=\"150dp\"\n                fresco:srcCompat=\"@drawable/bili_drawerbg_not_logined\"\n                fresco:layout_constraintRight_toRightOf=\"parent\"\n                fresco:layout_constraintBottom_toBottomOf=\"parent\"\n                android:alpha=\"0.2\"\n        />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60dp\"\n            android:orientation=\"horizontal\"\n    >\n        <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center\"\n        >\n            <TextView\n                    android:id=\"@+id/dynamic_num\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"2\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"动态\"\n            />\n        </LinearLayout>\n        <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center\"\n        >\n            <TextView\n                    android:id=\"@+id/followed_num\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"10\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"关注\"\n            />\n        </LinearLayout>\n        <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center\"\n        >\n            <TextView\n                    android:id=\"@+id/following_num\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"1\"\n            />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"粉丝\"\n            />\n        </LinearLayout>\n    </LinearLayout>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/normal_refresh_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n>\n    <com.flyco.tablayout.CommonTabLayout\n            android:id=\"@+id/tablayout\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"48dp\"\n            app:tl_textSelectColor=\"@color/colorPrimary\"\n            app:tl_textUnselectColor=\"@color/grey_500\"\n            android:paddingLeft=\"5dp\"\n            android:paddingRight=\"5dp\"\n            app:tl_tab_padding=\"@dimen/dp_10\"\n            app:tl_indicator_style=\"BLOCK\"\n            app:tl_indicator_color=\"@color/black_alpha_32\"\n            android:visibility=\"gone\"\n            app:tl_iconVisible=\"false\"\n            app:tl_indicator_corner_radius=\"@dimen/dp_4\"\n\n    />\n    <com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlPrimaryColor=\"@color/colorPrimary\"\n    >\n        <com.scwang.smartrefresh.header.WaterDropHeader\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n        <com.bilibili.lingxiao.widget.ScrollerloadRecyclerView\n                android:id=\"@+id/recycerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n        </com.bilibili.lingxiao.widget.ScrollerloadRecyclerView>\n        <include\n                layout=\"@layout/footer_loadmore\"/>\n    </com.bilibili.lingxiao.widget.skin.SmartSkinRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/pop_comment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:elevation=\"@dimen/dp_10\"\n        android:translationZ=\"@dimen/dp_10\"\n        android:background=\"@color/white\"\n>\n    <TextView\n            android:id=\"@+id/pop_add_blacklist\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"16sp\"\n            style=\"@style/TextTitle\"\n            android:text=\"加入黑名单                        \"\n            android:background=\"@drawable/pop_bottom_text\"\n            android:padding=\"10dp\"/>\n\n    <TextView\n            android:id=\"@+id/pop_report\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"16sp\"\n            style=\"@style/TextTitle\"\n            android:text=\"举报\"\n            android:background=\"@drawable/pop_bottom_text\"\n            android:padding=\"10dp\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/pop_detail_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:background=\"@color/white\"\n>\n\n    <TextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            style=\"@style/TextTitle\"\n            android:text=\"添加至稍后再看\"\n            android:padding=\"10dp\"\n    />\n    <ImageView\n            style=\"@style/between_line\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"10dp\"\n    />\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_margin=\"10dp\"\n    >\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:text=\"反馈\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\" (选择后将优化首页此类内容)\"\n        />\n    </LinearLayout>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"40dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"10dp\"\n    >\n        <Button\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginRight=\"10dp\"\n                android:text=\"恐怖血腥\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n        <Button\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginLeft=\"10dp\"\n                android:text=\"色情低俗\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n    </LinearLayout>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"40dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"10dp\"\n    >\n        <Button\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginRight=\"10dp\"\n                android:text=\"封面恶心\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n        <Button\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginLeft=\"10dp\"\n                android:text=\"标题党/封面党\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n    </LinearLayout>\n    <ImageView\n            style=\"@style/between_line\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"10dp\"\n    />\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_margin=\"10dp\"\n    >\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextTitle\"\n                android:text=\"不感兴趣\"\n        />\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                style=\"@style/TextMessage\"\n                android:text=\" (选择后将减少相似内容推荐)\"\n        />\n\n    </LinearLayout>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"40dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"10dp\"\n    >\n        <Button\n                android:id=\"@+id/pop_up_name\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginRight=\"10dp\"\n                android:text=\"UP主：啦啦啦\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n        <Button\n                android:id=\"@+id/pop_category\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginLeft=\"10dp\"\n                android:text=\"分区：动物圈\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n    </LinearLayout>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"40dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"10dp\"\n    >\n        <Button\n                android:id=\"@+id/pop_region\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginRight=\"10dp\"\n                android:text=\"频道：样子\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n        <Button\n                android:id=\"@+id/pop_dislike\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"@dimen/button_height\"\n                android:layout_marginLeft=\"10dp\"\n                android:text=\"不感兴趣\"\n                android:background=\"@drawable/button_pop_background\"\n\n        />\n    </LinearLayout>\n    <ImageView\n            style=\"@style/between_line\"\n            android:layout_height=\"10dp\"\n    />\n    <TextView\n            android:id=\"@+id/pop_cancel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"取消\"\n            android:gravity=\"center\"\n            android:padding=\"15dp\"\n            android:background=\"@drawable/pop_selector\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/pop_user_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.card.MaterialCardView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        app:cardBackgroundColor=\"@color/white\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:cardCornerRadius=\"@dimen/dp_4\"\n        app:cardElevation=\"@dimen/dp_4\"\n        app:cardUseCompatPadding=\"true\"\n>\n    <androidx.constraintlayout.widget.ConstraintLayout\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n    >\n        <ImageView\n                android:id=\"@+id/image_bg\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/mall_order_evaluate_dialog_bg\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/ll_info\"\n        />\n        <TextView\n                android:id=\"@+id/image_more\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/white\"\n                android:text=\"更多\"\n                android:textSize=\"@dimen/description_text_size\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                android:layout_margin=\"10dp\"\n        />\n        <ImageView\n                android:id=\"@+id/image_close\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:src=\"@drawable/live_ic_player_close\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                android:layout_margin=\"10dp\"\n\n        />\n\n        <FrameLayout\n                android:id=\"@+id/frame_header\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintBottom_toTopOf=\"@id/ll_info\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.5\"\n                android:layout_marginBottom=\"5dp\"\n        >\n            <com.facebook.drawee.view.SimpleDraweeView\n                    android:id=\"@+id/image_header\"\n                    style=\"@style/image_large\"\n                    app:progressBarImageScaleType=\"centerInside\"\n                    app:progressBarImage=\"@drawable/ic_img_user_head_default\"\n                    app:roundAsCircle=\"true\"\n                    app:roundingBorderWidth=\"1dp\"\n                    android:padding=\"5dp\"\n                    android:layout_gravity=\"center\"\n            />\n            <ImageView\n                    style=\"@style/image_large\"\n                    android:src=\"@drawable/ic_live_guard_governor_border_v2\"\n                    android:layout_gravity=\"center\"\n            />\n        </FrameLayout>\n        <LinearLayout\n                android:id=\"@+id/ll_info\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintTop_toBottomOf=\"@id/image_bg\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                android:layout_marginTop=\"20dp\"\n                android:gravity=\"center_horizontal\"\n        >\n            <TextView\n                    android:id=\"@+id/username\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    style=\"@style/TextTitle\"\n                    android:text=\"1212\"\n                    android:textSize=\"16sp\"\n\n            />\n            <LinearLayout\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_margin=\"5dp\"\n            >\n                <ImageView\n                        style=\"@style/image_small\"\n                        android:src=\"@drawable/widget_live_icon_guard_captain\"\n                />\n                <TextView\n                        android:id=\"@+id/user_level\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"@drawable/text_live_background\"\n                        android:text=\"UL 1\"\n                        android:textSize=\"10sp\"\n                        android:textColor=\"@color/colorPrimary\"\n                        android:padding=\"3dp\"\n                        android:layout_marginLeft=\"5dp\"\n                />\n            </LinearLayout>\n\n            <TextView\n                    android:id=\"@+id/follow_num\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    style=\"@style/TextTitle\"\n                    android:text=\"关注：5     粉丝：6\"\n                    android:textSize=\"14sp\"\n\n            />\n        </LinearLayout>\n        <ImageView\n                android:id=\"@+id/between_line\"\n                style=\"@style/between_line\"\n                app:layout_constraintTop_toBottomOf=\"@id/ll_info\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/ll_bottom\"\n                android:layout_margin=\"5dp\"\n                android:background=\"@color/black_alpha_112\"\n        />\n        <LinearLayout\n                android:id=\"@+id/ll_bottom\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:layout_marginTop=\"5dp\"\n                app:layout_constraintTop_toBottomOf=\"@id/between_line\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n        >\n            <TextView\n                    android:id=\"@+id/text_user_space\"\n                    android:layout_width=\"0dp\"\n                    android:layout_weight=\"1\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"个人空间\"\n                    android:gravity=\"center\"\n                    android:padding=\"10dp\"\n                    android:background=\"@drawable/pop_bottom_text\"\n            />\n            <TextView\n                    android:id=\"@+id/text_user_follow\"\n                    android:layout_width=\"0dp\"\n                    android:layout_weight=\"1\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"+关注\"\n                    android:textColor=\"@color/colorPrimary\"\n                    android:gravity=\"center\"\n                    android:padding=\"10dp\"\n                    android:background=\"@drawable/pop_bottom_text\"\n            />\n        </LinearLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</com.google.android.material.card.MaterialCardView>\n"
  },
  {
    "path": "app/src/main/res/layout/pop_watch_later.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        android:gravity=\"center_vertical\"\n        android:background=\"@drawable/popup_right_down\"\n        android:id=\"@+id/watch_later\"\n>\n    <ImageView\n            style=\"@style/image_normal\"\n            android:src=\"@drawable/ic_following_watch_later\"\n            android:padding=\"3dp\"\n    />\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/pop_watch_later\"\n            android:layout_marginLeft=\"10dp\"\n            android:padding=\"10dp\"\n    />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/popwindow_play_support_quality.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n        android:background=\"@color/black_alpha_160\"\n        android:padding=\"@dimen/dp_10\"\n>\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerview\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_centerInParent=\"true\"\n            android:layout_marginTop=\"@dimen/len_20\"\n            android:layout_marginBottom=\"@dimen/len_20\"\n    >\n    </androidx.recyclerview.widget.RecyclerView>\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/title_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.appcompat.widget.Toolbar\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:id=\"@+id/title_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        android:background=\"@color/colorPrimary\"\n        android:minHeight=\"?attr/actionBarSize\"\n        app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n        app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n        app:layout_scrollFlags=\"scroll|enterAlways|snap\"\n        app:contentInsetStart=\"0dp\"\n>\n</androidx.appcompat.widget.Toolbar>"
  },
  {
    "path": "app/src/main/res/layout/top_recommend_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/filter_bar_size\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:background=\"@color/colorGray\"\n>\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"综合\"\n            android:paddingLeft=\"22dp\"\n            android:paddingRight=\"22dp\"\n            android:paddingTop=\"5dp\"\n            android:paddingBottom=\"5dp\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n    />\n\n    <ImageView\n            android:id=\"@+id/image_rank\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:paddingLeft=\"12dp\"\n            android:paddingRight=\"8dp\"\n            android:src=\"@drawable/ic_index_rank\"\n            android:tint=\"@color/colorPrimary\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintRight_toLeftOf=\"@id/image_attent\"\n    />\n    <ImageView\n            android:id=\"@+id/image_attent\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:paddingLeft=\"12dp\"\n            android:paddingRight=\"8dp\"\n            android:src=\"@drawable/ic_index_attention\"\n            android:tint=\"@color/colorPrimary\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n    />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/menu/nav_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <group\n            android:id=\"@+id/group1\"\n            android:checkableBehavior=\"single\">\n        <item android:id=\"@+id/nav_home\"\n            android:icon=\"@drawable/ic_nav_home\"\n            android:title=\"首页\"\n            />\n        <item android:id=\"@+id/nav_vertical\"\n            android:icon=\"@drawable/ic_nav_history\"\n            android:title=\"历史记录\"\n            >\n        </item>\n        <item android:id=\"@+id/nav_mzitu\"\n            android:icon=\"@drawable/ic_nav_outline\"\n            android:title=\"离线缓存\"\n            />\n        <item android:id=\"@+id/nav_sousiba\"\n            android:icon=\"@drawable/ic_nav_collect\"\n            android:title=\"我的收藏\"\n            android:visible=\"false\"\n            />\n        <item android:id=\"@+id/nav_cosplayla\"\n            android:icon=\"@drawable/ic_nav_next_watch\"\n            android:title=\"稍后再看\"\n            android:visible=\"true\"\n            />\n\n\n    </group>\n    <group\n            android:id=\"@+id/group2\"\n            android:checkableBehavior=\"single\"\n    >\n        <item android:id=\"@+id/nav_creat_center\"\n              android:icon=\"@drawable/ic_nav_create_center\"\n              android:title=\"创作中心\"/>\n        <item android:id=\"@+id/nav_vip\"\n              android:icon=\"@drawable/ic_nav_big_vip\"\n              android:title=\"我的大会员\"/>\n        <item android:id=\"@+id/nav_free_flow\"\n              android:icon=\"@drawable/ic_nav_free_flow\"\n              android:title=\"免流量服务\"/>\n        <item android:id=\"@+id/nav_buyset\"\n              android:icon=\"@drawable/ic_nav_buyset\"\n              android:title=\"我的订单\"\n        />\n    </group>\n\n    <group\n\n            android:checkableBehavior=\"single\"\n    >\n        <item\n              android:icon=\"@drawable/ic_nav_create_center\"\n              android:title=\"创作中心\"/>\n        <item\n              android:icon=\"@drawable/ic_nav_big_vip\"\n              android:title=\"我的大会员\"/>\n        <item\n              android:icon=\"@drawable/ic_nav_free_flow\"\n              android:title=\"免流量服务\"/>\n        <item\n              android:icon=\"@drawable/ic_nav_buyset\"\n              android:title=\"我的订单\"\n              android:orderInCategory=\"200\"\n        />\n    </group>\n\n</menu>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n>\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground\n            android:drawable=\"@drawable/ic_launcher_foreground\"\n    />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground\n            android:drawable=\"@drawable/ic_launcher_foreground\"\n    />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"FoldableLayout\">\n        <attr name=\"maxCollapsedLines\" format=\"integer\"/>\n        <attr name=\"animDuration\" format=\"integer\"/>\n        <attr name=\"animAlphaStart\" format=\"float\"/>\n\n        <attr name=\"expandToggleType\" format=\"enum\">\n            <enum name=\"ImageButton\" value=\"0\"/>\n            <enum name=\"TextView\" value=\"1\"/>\n        </attr>\n        <attr name=\"expandIndicator\" format=\"reference\"/>\n        <attr name=\"collapseIndicator\" format=\"reference\"/>\n\n        <attr name=\"textViewId\" format=\"reference\"/>\n        <attr name=\"messageViewId\" format=\"reference\"/>\n        <attr name=\"expandCollapseToggleId\" format=\"reference\"/>\n        <attr name=\"foldClickable\" format=\"boolean\"/>\n    </declare-styleable>\n\n    <declare-styleable name=\"ColorTextView\">\n        <attr name=\"ctvText\" format=\"string\" />\n        <attr name=\"ctvBackground\" format=\"color\"/>\n        <attr name=\"ctvTextSize\" format=\"dimension\"/>\n        <attr name=\"ctvTextColor\" format=\"color\"/>\n        <attr name=\"ctvCornerSize\" format=\"integer\"/>\n        <attr name=\"ctvMargin\" format=\"dimension\"></attr>\n    </declare-styleable>\n\n    <declare-styleable name=\"LinearCardView\">\n        <attr name=\"left_text\" format=\"string\"/>\n        <attr name=\"right_text\" format=\"string\"/>\n        <attr name=\"show_right_text\" format=\"boolean\"/>\n    </declare-styleable>\n    <declare-styleable name=\"FindLineView\">\n        <attr name=\"src\" format=\"reference\"/>\n        <attr name=\"text\" format=\"string\" />\n        <attr name=\"showRightIcon\" format=\"boolean\"/>\n    </declare-styleable>\n\n    <declare-styleable name=\"LaybelLayout\">\n        <attr name=\"line_padding\" format=\"float\"/>\n        <attr name=\"text_background\" format=\"reference\"/><!-- TextView的背景 -->\n        <attr name=\"child_margin\" format=\"integer\"/><!-- 子View的外边距 -->\n    </declare-styleable>\n\n    <declare-styleable name=\"ArcView\">\n        <attr name=\"arcbackground\" format=\"color\"/>\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#F06292</color>\n    <color name=\"colorPrimaryDark\">#E91E63</color>\n    <color name=\"colorAccent\">#D81B60</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"splash_copyright_margin_bottom\">20dp</dimen>\n    <dimen name=\"user_header_size\">40dp</dimen>\n    <dimen name=\"user_name_text_size\">14sp</dimen>\n    <dimen name=\"fen_si_text_size\">12sp</dimen>\n    <dimen name=\"description_text_size\">16sp</dimen>\n\n    <dimen name=\"button_width\">60dp</dimen>\n    <dimen name=\"button_height\">30dp</dimen>\n\n    <dimen name=\"normal_icon_size\">30dp</dimen>\n    <dimen name=\"filter_bar_size\">40.0dp</dimen>\n\n    <dimen name=\"text_size_xlarge\">18sp</dimen>\n    <dimen name=\"text_size_large\">16sp</dimen>\n    <dimen name=\"text_size_normal\">14sp</dimen>\n\n    <dimen name=\"web_image_background_height\">180dp</dimen>\n    <dimen name=\"fab_margin\">20dp</dimen>\n    <dimen name=\"fab_image_size\">40dp</dimen>\n\n    <dimen name=\"pop_watch_later_xoffset\">15dp</dimen>\n    <dimen name=\"pop_watch_later_yoffset\">-10dp</dimen>\n\n    <dimen name=\"banner_height\">120dp</dimen>\n\n    <dimen name=\"bangumi_tv_width\">140dp</dimen>\n    <dimen name=\"bangumi_tv_height\">100dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item type=\"id\" name=\"expand_textview\"/>\n    <item type=\"id\" name=\"expand_collapse\"/>\n    <item type=\"id\" name=\"expand_message_textview\"/>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">BiliBili</string>\n    <string name=\"open\">open</string>\n    <string name=\"close\">close</string>\n\n    <!--login-->\n    <string name=\"login_title\">登录</string>\n    <string name=\"register_text\">注册</string>\n    <string name=\"forget_password\">忘记密码？</string>\n    <string name=\"input_username\">请输入用户名</string>\n    <string name=\"input_password\">请输入密码</string>\n    <string name=\"un_login\">未登陆</string>\n    <string name=\"login_then_next\">请登录后再试！( • ̀ω•́ )✧</string>\n    <string name=\"dynamic_login\">想看最新的UP主动态？快来登录吧！</string>\n\n    <string name=\"search_bar_hint\">搜索视频、番剧、UP主或av号</string>\n    <string name=\"search_everyone\">大家都在搜</string>\n    <string name=\"cancel\">取消</string>\n\n    <string-array name=\"main_tab\">\n        <item>直播</item>\n        <item>推荐</item>\n        <item>分区</item>\n        <item>追番</item>\n        <item>动态</item>\n        <item>发现</item>\n    </string-array>\n\n    <!--live-->\n    <string-array name=\"live_tab\">\n        <item>互动</item>\n        <item>主播</item>\n        <item>贡献榜</item>\n        <item>大航海</item>\n    </string-array>\n    <string name=\"nav_follow\">关注</string>\n    <string name=\"nav_entertainment\">娱乐</string>\n    <string name=\"nav_game\">游戏</string>\n    <string name=\"nav_mobile_game\">手游</string>\n    <string name=\"nav_painting\">绘画</string>\n    <string name=\"scroll_behavior\">com.bilibili.lingxiao.widget.behavior.ScrollAwareFabBehaviorDefault</string>\n    <string name=\"player_behavior\">com.bilibili.lingxiao.widget.behavior.PlayerBehavior</string>\n\n    <string-array name=\"live_fans\">\n        <item>金瓜子榜</item>\n        <item>礼物榜</item>\n        <item>粉丝榜</item>\n    </string-array>\n    <string-array name=\"live_all\">\n        <item>最热直播</item>\n        <item>最新开播</item>\n    </string-array>\n    <string name=\"live_all_title\">全部直播</string>\n\n    <!--comment-->\n    <string name=\"comment_detail\">评论详情</string>\n\n    <string name=\"pop_watch_later\">添加至稍后再看</string>\n\n    <string name=\"bangumi_cn\">国漫推荐</string>\n    <string name=\"bangumi_jp\">番剧推荐</string>\n    <string name=\"bangumi_edit\">编辑推荐</string>\n    <!--bangumi detail-->\n    <string name=\"share_text\">分享</string>\n    <string name=\"bangumi_chasing_text\">追番</string>\n    <string name=\"bangumi_download_text\">下载</string>\n    <string name=\"bangumi_contract_me\">请承包我吧！</string>\n    <string name=\"bangumi_contract_message\">快来抢占七日榜！！！(≧∇≦)ﾉ</string>\n    <string name=\"bangumi_evaluate_default\">古枪vs现代枪，绝望之战—— \\n 全世界因核战争而荒废，在那之后的时代——。在世界帝府的绝对统治之下，\n        人们全都受到管制，在被夺走了自由的世界中生存。 但，在一切武力均被禁止之时，还存在着为了打破世界帝的独...\n    </string>\n    <string-array name=\"level_drawable\">\n        <item>@drawable/mall_mine_vip_level_0</item>\n        <item>@drawable/mall_mine_vip_level_1</item>\n        <item>@drawable/mall_mine_vip_level_2</item>\n        <item>@drawable/mall_mine_vip_level_3</item>\n        <item>@drawable/mall_mine_vip_level_4</item>\n        <item>@drawable/mall_mine_vip_level_5</item>\n        <item>@drawable/mall_mine_vip_level_6</item>\n    </string-array>\n\n\n    <!--find-->\n    <string name=\"find_line_interest\">兴趣圈</string>\n    <string name=\"find_line_topic\">话题中心</string>\n    <string name=\"find_line_activity\">活动中心</string>\n    <string name=\"find_line_blackdoor\">小黑屋</string>\n\n    <string name=\"find_line_top_original\">原创排行榜</string>\n    <string name=\"find_line_top_all\">全区排行榜</string>\n\n    <string name=\"find_line_game_center\">游戏中心</string>\n    <string name=\"find_line_shop\">周边商城</string>\n\n    <!--search detail-->\n    <string-array name=\"search_type\">\n        <item>默认排序</item>\n        <item>全部时长</item>\n        <item>全部分区</item>\n    </string-array>\n\n    <!-- top list-->\n    <string-array name=\"origin_ranking_list\">\n        <item>原创</item>\n        <item>全站</item>\n        <item>番剧</item>\n    </string-array>\n    <string name=\"show_all_ranking_list_video\">显示此UP主全部上榜视频</string>\n    <!--<string name=\"search_sort_type\">默认排序</string>-->\n    <!--<string name=\"search_all_time\">全部时长</string>-->\n    <!--<string name=\"search_all_region\">全部分区</string>-->\n\n    <!--setting-->\n    <string name=\"account_info\">账号资料</string>\n    <string name=\"security_private\">安全隐私</string>\n    <string name=\"take_goods_info\">收货信息</string>\n\n    <string name=\"play_setting\">播放设置</string>\n    <string name=\"decode_setting\">解码设置</string>\n    <string name=\"danmaku_setting\">弹幕设置</string>\n    <string name=\"offline_setting\">离线设置</string>\n    <string name=\"bangumi_setting\">追番设置</string>\n    <string name=\"dynamic_setting\">动态设置</string>\n    <string name=\"push_message\">推送与消息</string>\n    <string name=\"clean_sdcard\">清理存储空间</string>\n    <string name=\"other_setting\">其他设置</string>\n    <string name=\"my_service\">我的客服</string>\n    <string name=\"help\">帮助</string>\n    <string name=\"exit_account\">退出登录</string>\n    <string name=\"find_searching\">搜索中</string>\n    <string name=\"reset_app_change\">下次进入Bilibili生效</string>\n    <string name=\"not_idcard_approve\">未身份认证</string>\n    <string name=\"set_up_bordcast\">设置主播公告</string>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources >\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n\n    <style name=\"MainTheme\" parent=\"Theme.MaterialComponents.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <!-- 设置activity切换动画 -->\n        <item name=\"android:windowAnimationStyle\">@style/activityAnimation</item>\n        <!--<item name=\"android:alertDialogTheme\">@android:style/Theme.Holo.Light.Dialog</item>-->\n    </style>\n\n\n    <style name=\"activityAnimation\" parent=\"@android:style/Animation\">\n        <item name=\"android:activityOpenEnterAnimation\">@anim/right_in</item>\n        <item name=\"android:activityOpenExitAnimation\">@anim/left_out</item>\n        <item name=\"android:activityCloseEnterAnimation\">@anim/left_in</item>\n        <item name=\"android:activityCloseExitAnimation\">@anim/right_out</item>\n    </style>\n\n    <!--全屏activity-->\n    <style name=\"FullScreen\" parent=\"Theme.MaterialComponents.Light.NoActionBar\">\n        <item name=\"android:windowFullscreen\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowActionBar\">false</item>\n    </style>\n    <!--去掉dialogfragment的背景阴影-->\n    <style name=\"fragmentDialog\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <item name=\"android:windowTitleStyle\">@null</item>\n        <item name=\"android:colorBackgroundCacheHint\">@null</item>\n        <item name=\"android:windowAnimationStyle\">@android:style/Animation.Dialog</item>\n        <item name=\"android:windowSoftInputMode\">stateUnspecified|adjustPan</item>\n        <item name=\"android:backgroundDimEnabled\">false</item><!-- dim:模糊的 阴影效果 -->\n    </style>\n\n    <!--card style-->\n    <style name=\"cardStyle\">\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_marginTop\">5dp</item>\n        <item name=\"android:layout_marginBottom\">5dp</item>\n        <item name=\"android:layout_margin\">3dp</item>\n        <item name=\"android:foreground\">?android:attr/selectableItemBackground</item>\n    </style>\n\n\n    <style name=\"TextTitle\">\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:textSize\">@dimen/user_name_text_size</item>\n        <item name=\"android:textColor\">@color/black_alpha_176</item>\n    </style>\n    <style name=\"TextMessage\">\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:textSize\">@dimen/fen_si_text_size</item>\n        <item name=\"android:textColor\">@color/black_alpha_112</item>\n    </style>\n\n\n\n    <style name=\"image_small\">\n        <item name=\"android:layout_height\">20dp</item>\n        <item name=\"android:layout_width\">20dp</item>\n    </style>\n\n    <style name=\"image_normal\">\n        <item name=\"android:layout_height\">30dp</item>\n        <item name=\"android:layout_width\">30dp</item>\n    </style>\n\n    <style name=\"image_large\">\n        <item name=\"android:layout_height\">60dp</item>\n        <item name=\"android:layout_width\">60dp</item>\n    </style>\n\n    <style name=\"image_live_top\">\n        <item name=\"android:layout_height\">50dp</item>\n        <item name=\"android:layout_width\">50dp</item>\n    </style>\n\n    <style name=\"image_live_top1\">\n        <item name=\"android:layout_height\">60dp</item>\n        <item name=\"android:layout_width\">60dp</item>\n    </style>\n\n    <!--分割线-->\n    <style name=\"between_line\">\n        <item name=\"android:layout_height\">0.4dp</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:background\">@color/black_alpha_32</item>\n    </style>\n\n    <!--popwindow anim-->\n    <style name=\"contextMenuAnim\" parent=\"@android:style/Animation.Activity\">\n        <item name=\"android:windowEnterAnimation\">@anim/pop_show</item>\n        <item name=\"android:windowExitAnimation\">@anim/pop_hide</item>\n    </style>\n\n    <style name=\"pop_watch_later_Anim\" parent=\"@android:style/Animation.Activity\">\n        <item name=\"android:windowEnterAnimation\">@anim/pop_watch_later_show</item>\n        <item name=\"android:windowExitAnimation\">@anim/pop_watch_later_hide</item>\n    </style>\n\n\n    <style name=\"pop_player_support_quility\" parent=\"@android:style/Animation.Activity\">\n        <item name=\"android:windowEnterAnimation\">@anim/pop_right_show</item>\n        <item name=\"android:windowExitAnimation\">@anim/pop_left_hide</item>\n    </style>\n\n    <style name=\"text_style_normal\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:textSize\">@dimen/text_size_normal</item>\n        <item name=\"android:textColor\">@color/black</item>\n    </style>\n\n    <style name=\"text_style_navigation\" parent=\"text_style_normal\">\n        <item name=\"android:layout_weight\">1</item>\n        <item name=\"android:gravity\">center_horizontal</item>\n        <item name=\"android:padding\">8dp</item>\n    </style>\n\n    <style name=\"SearchView\" parent=\"Widget.AppCompat.SearchView\">\n        <item name=\"android:tint\">@color/black_alpha_112</item>\n        <item name=\"closeIcon\">@drawable/ic_search_close</item>\n        <!--<item name=\"searchIcon\">@drawable/ic_search_api_material_dark</item>-->\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/file_path.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <paths>\n        <external-path path=\"\" name=\"download\"/>\n\n        <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->\n        <external-path name=\"beta_external_path\" path=\"Download/\"/>\n        <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->\n        <external-path name=\"beta_external_files_path\" path=\"Android/data/\"/>\n    </paths>\n</resources>"
  },
  {
    "path": "app/src/main/res/xml/network_security_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"true\" />\n</network-security-config>"
  },
  {
    "path": "app/src/test/java/com/bilibili/lingxiao/ExampleUnitTest.kt",
    "content": "package com.bilibili.lingxiao\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    //ext.kotlin_version = '1.0.0'\n    ext.kotlin_version = '1.3.31'\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.2.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        maven {url 'https://dl.bintray.com/jetbrains/anko'}\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\next {\n    //版本号相关\n    versionCode = 2\n    versionName = '0.0.2'\n    minSdkVersion = 21\n    targetSdkVersion = 28\n    compileSdkVersion = 28\n    buildToolsVersion = \"26.0.0\"\n    //依赖库相关\n    supportVersion = '28.0.0'\n    butterknifeVersion = '8.7.0'\n    circleimageVersion = '2.2.0'\n    constraintVersion = \"1.0.2\"\n    //沉浸式\n    ultimatebarVersion = \"2.0.0\"\n    gsonVersion = \"2.7\"\n    frescoVersion = \"0.12.0\"\n    retrofitVersion = \"2.1.0\"\n    bannerVersion = \"1.4.10\"\n    rxandroidVersion = \"2.0.1\"\n    rxjavaVersion = \"2.1.1\"\n    rxjavaAdapterVersion = \"2.3.0\"\n    rxlifescyleVersion = \"2.2.1\"\n    photoViewVersion = \"2.1.4\"\n    //拦截器\n    interceptorVersion = \"3.10.0\"\n    easypermissionsVersion = \"2.0.1\"\n    skinSupportVersion = \"3.1.1\"\n\n    dbFlowVersion = \"4.0.3\"\n    leak = \"1.5.4\"\n    hotfixVersion = \"3.2.3\"\n    leancloudVersion = \"v4.7.3\"\n    qiniuVersion = \"7.3.4\"\n    ijkplayerVersion = \"0.8.8\"\n\n    baseRecyclerAdapterVersion = \"2.9.30\"\n    daggerVersion = \"2.21\"\n    frescoVersion = \"1.13.0\"\n    eventBusVersion = \"3.1.1\"\n    danmakuVersion = \"0.9.25\"\n    danmakuNdk = \"0.9.21\"\n    FlycoTabLayout = \"2.1.2@aar\"\n    bottomNavigationBar = \"2.1.0\"\n    room_version = \"2.1.0\"\n\n}\nsubprojects {\n    project.configurations.all {\n        resolutionStrategy.eachDependency { details ->\n            if (details.requested.group == 'androidx.core' &&\n                    !details.requested.name.contains('androidx')) {\n                details.useVersion \"1.3.1\"\n            }\n        }\n    }\n}"
  },
  {
    "path": "common/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "common/build.gradle",
    "content": "if (isModule.toBoolean()) {\n    apply plugin: 'com.android.application'\n} else {\n    apply plugin: 'com.android.library'\n}\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode rootProject.ext.versionCode\n        versionName rootProject.ext.versionName\n\n        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'\n\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    sourceSets {\n        main {\n            if (isModule.toBoolean()) {\n                manifest.srcFile 'src/main/module/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/AndroidManifest.xml'\n            }\n        }\n    }\n    //buildToolsVersion '27.0.3'\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.2.0'\n    //implementation \"com.jakewharton:butterknife:$rootProject.ext.butterknifeVersion\"\n    implementation \"com.github.zackratos.ultimatebar:ultimatebar2:$rootProject.ext.ultimatebarVersion\"\n\n    implementation \"io.reactivex.rxjava2:rxjava:$rootProject.ext.rxjavaVersion\"\n    implementation \"io.reactivex.rxjava2:rxandroid:$rootProject.ext.rxandroidVersion\"\n    implementation \"com.squareup.retrofit2:retrofit:$rootProject.ext.retrofitVersion\"\n    implementation \"com.squareup.retrofit2:converter-gson:$rootProject.ext.retrofitVersion\"\n    implementation \"com.squareup.retrofit2:adapter-rxjava2:$rootProject.ext.rxjavaAdapterVersion\"\n    implementation \"com.squareup.okhttp3:logging-interceptor:$rootProject.ext.interceptorVersion\"//拦截器\n    implementation \"com.youth.banner:banner:$rootProject.ext.bannerVersion\"\n    //implementation \"io.reactivex:rxandroid:$rootProject.ext.rxandroidVersion\"\n\n    implementation \"com.trello.rxlifecycle2:rxlifecycle:$rootProject.ext.rxlifescyleVersion\"\n    // If you want to use Android Lifecycle for providers\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:$rootProject.ext.rxlifescyleVersion\"\n    // If you want pre-written Activities and Fragments you can subclass as providers\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-components:$rootProject.ext.rxlifescyleVersion\"\n\n    // If you want to use Kotlin syntax\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-kotlin:$rootProject.ext.rxlifescyleVersion\"\n\n    // If you want to use Kotlin syntax with Android Lifecycle\n    implementation \"com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:$rootProject.ext.rxlifescyleVersion\"\n\n    //annotationProcessor \"com.jakewharton:butterknife-compiler:$rootProject.ext.butterknifeVersion\"\n    implementation \"pub.devrel:easypermissions:$rootProject.ext.easypermissionsVersion\"\n    //七牛对象存储\n    implementation \"com.qiniu:qiniu-android-sdk:$rootProject.ext.qiniuVersion\"\n    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'\n    implementation \"org.greenrobot:eventbus:$rootProject.ext.eventBusVersion\"\n    implementation \"com.github.zackratos.ultimatebar:ultimatebar2:$rootProject.ext.ultimatebarVersion\"\n\n    implementation 'com.tencent.bugly:crashreport_upgrade:1.4.5'\n\n    //其中latest.release指代最新版本号，也可以指定明确的版本号，例如1.2.0\n    implementation 'com.tencent.bugly:nativecrashreport:3.7.471'\n\n    api \"com.github.CymChad:BaseRecyclerViewAdapterHelper:$rootProject.ext.baseRecyclerAdapterVersion\"\n    api 'androidx.recyclerview:recyclerview:1.1.0'\n    api 'androidx.cardview:cardview:1.0.0'\n    api 'com.google.android.material:material:1.2.1'\n    api 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-21'\n    api 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-21'\n    api 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'//没有使用特殊Header，可以不加这行\n\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {\n        exclude group: 'com.android.support', module: 'support-annotations'\n    })\n\n}\n"
  },
  {
    "path": "common/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "common/src/androidTest/java/com/camera/lingxiao/common/ExampleInstrumentedTest.java",
    "content": "package com.camera.lingxiao.common;\n\nimport android.content.Context;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.camera.lingxiao.common.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "common/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.camera.lingxiao.common\">\n\n    <application>\n        <activity android:name=\".app.BaseActivity\"/>\n        <activity android:name=\".exception.crash.CrashActivity\">\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/Common.kt",
    "content": "package com.camera.lingxiao.common\n\nimport android.app.AlertDialog\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.util.Log\nimport com.camera.lingxiao.common.exception.crash.CrashActivity\nimport com.tencent.bugly.Bugly\nimport com.tencent.bugly.crashreport.CrashReport\n\nobject Common {\n    private val TAG = Common::class.java.simpleName\n    /**\n     * 当前皮肤的id\n     */\n    val SKIN_ID = \"skin_id\"\n\n    private fun showSelect(urls: Array<String>, context: Context) {\n        val builder = AlertDialog.Builder(context)\n        val alertDialog = builder.create()\n        alertDialog.setTitle(\"选择播放路径\")\n        builder.setItems(urls) { dialogInterface, i -> }\n    }\n\n    fun initCrash(context: Context,isDebug:Boolean){\n        val strategy = CrashReport.UserStrategy(context)\n        strategy.setCrashHandleCallback(object : CrashReport.CrashHandleCallback() {\n            @Synchronized\n            override fun onCrashHandleStart(\n                crashType: Int,\n                errorType: String?,\n                errorMessage: String?,\n                errorStack: String?\n            ): Map<String, String> {\n                val intent = Intent(context, CrashActivity::class.java)\n                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK\n                intent.putExtra(\"msg\", errorStack)\n                context.startActivity(intent)\n                Log.e(TAG,\"异常堆栈${errorStack}, 异常类型${errorType}, 异常内容${errorMessage}\")\n                return super.onCrashHandleStart(crashType, errorType, errorMessage, errorStack)\n            }\n        })\n        Bugly.init(context,\"180f968345\",isDebug,strategy)\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/VersionModle.kt",
    "content": "package com.camera.lingxiao.common\n\n/**\n * Created by lingxiao on 2017/9/7.\n */\n\nclass VersionModle {\n    /**\n     * versionCode : 3\n     * downloadUrl :\n     * versionDes : 3.0重大更新，贴心的小bug修复，优化你的体验！\n     * versionName : 3.0\n     */\n\n    var versionCode: Int = 0\n    var downloadUrl: String? = null\n    var versionDes: String? = null\n    var versionName: String? = null\n\n    override fun toString(): String {\n        return \"VersionModle{\" +\n                \"versionCode=\" + versionCode +\n                \", downloadUrl='\" + downloadUrl + '\\''.toString() +\n                \", versionDes='\" + versionDes + '\\''.toString() +\n                \", versionName='\" + versionName + '\\''.toString() +\n                '}'.toString()\n    }\n}\n\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/api/MainApi.kt",
    "content": "package com.camera.lingxiao.common.api\n\nimport com.camera.lingxiao.common.body.CosplayBody\nimport com.camera.lingxiao.common.http.response.HttpResponse\nimport java.util.TreeMap\n\nimport io.reactivex.Observable\nimport okhttp3.RequestBody\nimport retrofit2.Call\nimport retrofit2.http.Body\nimport retrofit2.http.Field\nimport retrofit2.http.FieldMap\nimport retrofit2.http.FormUrlEncoded\nimport retrofit2.http.GET\nimport retrofit2.http.HeaderMap\nimport retrofit2.http.POST\nimport retrofit2.http.Path\nimport retrofit2.http.Query\nimport retrofit2.http.QueryMap\nimport retrofit2.http.Url\n\ninterface MainApi {\n    /**\n     * GET请求\n     *\n     * @param url     api接口url\n     * @param request 请求参数map\n     * @return\n     */\n    @GET\n    operator fun get(@Url url: String, @QueryMap request: TreeMap<String, Any>): Observable<HttpResponse>\n\n    /**\n     * POST请求\n     *\n     * @param url     api接口url\n     * @param request 请求参数map\n     * @return\n     */\n    @FormUrlEncoded\n    @POST\n    fun post(@Url url: String, @FieldMap request: TreeMap<String, Any>): Observable<HttpResponse>\n\n    /**\n     * 全路径Get调用\n     * @param url 全路径\n     * @return\n     */\n    @GET\n    fun fullPathGet(@Url url: String, @QueryMap request: TreeMap<String, Any>): Observable<HttpResponse>\n    /**\n     * 全路径Post调用\n     * @param url 全路径\n     * @return\n     */\n    @FormUrlEncoded\n    @POST\n    fun fullPathPost(@Url url: String, @FieldMap request: TreeMap<String, Any>): Observable<HttpResponse>\n\n\n    /**\n     * 全路径Get调用\n     * @param url 全路径\n     * @return\n     */\n    @GET\n    fun fullPathGetWithoutCheck(@Url url: String,@QueryMap request: TreeMap<String, Any>): Observable<Any>\n    /**\n     * 全路径Post调用\n     * @param url 全路径\n     * @return\n     */\n    @FormUrlEncoded\n    @POST\n    fun fullPathPostWithoutCheck(@Url url: String,@QueryMap request: TreeMap<String, Any>): Observable<Any>\n\n    /**\n     * 首页轮播图\n     * /v1/wallpaper/album/{id}/wallpaper/limit/skip/adult/order\n     */\n    @GET(\"/{version}/{wallpaper}/{category}/{id}/{wallpapertype}\")\n    fun desk(\n        @Path(\"version\") version: String,\n        @Path(\"wallpaper\") wallpaper: String,\n        @Path(\"category\") category: String,\n        @Path(\"id\") id: String,\n        @Path(\"wallpapertype\") wallpapertype: String,\n        @QueryMap request: TreeMap<String, Any>\n    ): Observable<HttpResponse>\n\n    /**\n     * 其他api调用\n     * @param url 全路径\n     * @return\n     */\n    @FormUrlEncoded\n    @POST\n    fun otherHeader(\n        @Url url: String, @HeaderMap headers: Map<String, String>,\n        @FieldMap values: Map<String, Any>\n    ): Observable<Any>\n\n\n    /**\n     * 短信验证码\n     * @param url 全路径\n     * @return\n     */\n    @POST\n    fun sendCode(\n        @Url url: String, @HeaderMap headers: Map<String, String>,\n        @Body body: RequestBody\n    ): Observable<Any>\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/ActivityController.kt",
    "content": "package com.camera.lingxiao.common.app\n\nimport android.app.Activity\n\nimport java.util.ArrayList\n\n/**\n * Created by lingxiao on 2017/8/3.\n */\n\nobject ActivityController {\n    var activities: MutableList<Activity> = ArrayList()\n    fun addActivity(activity: Activity) {\n        activities.add(activity)\n    }\n\n    fun removeActivity(activity: Activity) {\n        activities.remove(activity)\n    }\n\n    fun finishAll() {\n        for (activity in activities) {\n            activity.finish()\n        }\n        activities.clear()\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/BaseActivity.kt",
    "content": "package com.camera.lingxiao.common.app\n\nimport android.annotation.SuppressLint\nimport android.app.AlertDialog\nimport android.app.ProgressDialog\n\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.content.pm.ActivityInfo\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.net.Uri\nimport android.os.*\nimport androidx.fragment.app.Fragment\nimport androidx.core.content.ContextCompat\nimport androidx.core.content.FileProvider\nimport androidx.appcompat.app.ActionBar\nimport androidx.appcompat.app.AppCompatDelegate\nimport androidx.appcompat.widget.Toolbar\nimport android.util.Log\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport com.camera.lingxiao.common.Common\n\nimport com.camera.lingxiao.common.R\nimport com.camera.lingxiao.common.rxbus.RxBus\nimport com.camera.lingxiao.common.rxbus.SkinChangedEvent\nimport com.camera.lingxiao.common.listener.LifeCycleListener\nimport com.camera.lingxiao.common.utills.SpUtils\nimport com.github.zackratos.ultimatebar.UltimateBar\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity\nimport org.reactivestreams.Subscription\n\nimport java.io.File\n\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.functions.Consumer\nimport org.greenrobot.eventbus.EventBus\nimport org.greenrobot.eventbus.Subscribe\nimport org.greenrobot.eventbus.ThreadMode\nimport pub.devrel.easypermissions.AppSettingsDialog\nimport pub.devrel.easypermissions.EasyPermissions\n\nabstract class BaseActivity : RxAppCompatActivity() ,EasyPermissions.PermissionCallbacks{\n\n    private var mPmanager: PackageManager? = null\n    private var versionCode: Int = 0\n    var mListener: LifeCycleListener? = null\n    //protected var unBinder: Unbinder? = null\n\n    private var mBarcolor: Int = 0\n    private val mRxBus: Subscription? = null\n\n    private var progressDialog: ProgressDialog? = null\n\n    /**\n     * 得到当前界面的资源文件id\n     */\n    protected abstract val contentLayoutId: Int\n    /**\n     * 初始化dagger注入\n     */\n    protected open fun initInject(){\n\n\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        /**\n         * 设置为横屏\n         */\n        if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){\n            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\n        }\n        super.onCreate(savedInstanceState)\n        //在界面未初始化之前调用的初始化窗口\n        initWindows()\n        mListener?.onCreate(savedInstanceState)\n        if (initArgs(intent.extras)) {\n            // 得到界面Id并设置到Activity界面中\n            val layId = contentLayoutId\n            if (layId != 0) {\n                setContentView(layId)\n            }\n            initInject()\n            initBefore()\n            initWidget()\n            initData()\n        } else {\n            finish()\n        }\n    }\n\n    /**\n     * 初始化控件调用之前\n     */\n    protected open fun initBefore() {\n        mBarcolor = SpUtils.getInt(this, Common.SKIN_ID, ContextCompat.getColor(this,R.color.colorPrimary))\n        //半透明\n        UltimateBar.newColorBuilder()\n            .statusColor(mBarcolor)   // 状态栏颜色\n            .applyNav(true)             // 是否应用到导航栏\n            .navColor(mBarcolor)         // 导航栏颜色\n            .navDepth(0)            // 导航栏颜色深度\n            .build(this)\n            .apply()\n        ActivityController.addActivity(this)\n    }\n\n    /**\n     * 初始化\n     */\n    private fun initWindows() {\n\n    }\n\n    /**\n     * 初始化相关参数\n     * 如果参数正确返回True，错误返回False\n     */\n    protected fun initArgs(bundle: Bundle?): Boolean {\n        return true\n    }\n\n    /**\n     * 初始化控件\n     */\n    protected open fun initWidget() {\n        //unBinder = ButterKnife.bind(this)\n        //initSubscription()\n    }\n\n    /**\n     * 初始化数据\n     */\n    protected fun initData() {\n\n    }\n\n    /**\n     * 皮肤改变调用\n     */\n    protected open fun isSkinChanged() :Boolean{\n        return true\n    }\n\n    fun StartActivity(clzz: Class<*>, isFinish: Boolean) {\n        startActivity(Intent(applicationContext, clzz))\n        if (isFinish) {\n            finish()\n        }\n    }\n\n    /**\n     * 订阅消息\n     */\n    private fun initSubscription() {\n        val regist = RxBus.getInstance().register(SkinChangedEvent::class.java) { skinChangedEvent ->\n            UltimateBar.newColorBuilder()\n                .statusColor(ContextCompat.getColor(applicationContext, skinChangedEvent.color))   // 状态栏颜色\n                .applyNav(true)             // 是否应用到导航栏\n                .navColor(ContextCompat.getColor(applicationContext, skinChangedEvent.color))         // 导航栏颜色\n                .build(this@BaseActivity)\n                .apply()\n        }\n        RxBus.getInstance().addSubscription(this, regist)\n    }\n\n\n    /**\n     * 检查更新\n     */\n    fun checkUpdate(): Boolean {\n\n        mPmanager = packageManager\n        val serverVersion = SpUtils\n            .getInt(this@BaseActivity, ContentValue.VERSION_CODE, 1)\n        val info = mPmanager!!.getPackageInfo(packageName, 0)\n        versionCode = info.versionCode\n        return if (versionCode < serverVersion) {\n            true\n        } else {\n            false\n        }\n    }\n\n\n    private fun showDialog(url: String) {\n        val builder = AlertDialog.Builder(this)\n        builder.setTitle(\"检测到新版本\")\n        builder.setMessage(SpUtils.getString(this, ContentValue.VERSION_DES, \"\"))\n        builder.setPositiveButton(\"下载apk\") { dialogInterface, i ->\n            //下载\n            //showDownLoadDia();\n            //downLoadApk(url);\n            goToMarket(this@BaseActivity, packageName)\n        }\n        builder.setNegativeButton(\"取消\") { dialogInterface, i -> dialogInterface.cancel() }\n        builder.show()\n    }\n\n    /**\n     * 下载成功后安装\n     */\n    private fun installApk(file: File) {\n        if (Build.VERSION.SDK_INT >= 24) {//判读版本是否在7.0以上\n            val apkUri = FileProvider.getUriForFile(\n                this,\n                \"com.lingxiaosuse.picture.tudimension.fileprovider\",\n                file\n            )//在AndroidManifest中的android:authorities值\n            val install = Intent(Intent.ACTION_VIEW)\n            install.flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)\n            install.setDataAndType(apkUri, \"application/vnd.android.package-archive\")\n            startActivity(install)\n        } else {\n            val install = Intent(Intent.ACTION_VIEW)\n            install.setDataAndType(Uri.fromFile(file), \"application/vnd.android.package-archive\")\n            install.flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            startActivity(install)\n        }\n    }\n\n    /**\n     * 设置toolbar的返回键\n     */\n    fun setToolbarBack(toolbar: Toolbar) {\n        setSupportActionBar(toolbar)\n        val actionBar = supportActionBar\n        if (actionBar != null) {\n            actionBar.setDisplayHomeAsUpEnabled(true)\n            actionBar.setDisplayShowTitleEnabled(false)\n        }\n        //toolbar.title = \"\"\n    }\n\n    //跳转到网页\n    fun goToInternet(context: Context, marketUrl: String) {\n        val uri = Uri.parse(marketUrl)\n        val intent = Intent(Intent.ACTION_VIEW, uri)\n        context.startActivity(intent)\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)\n    }\n\n\n    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {\n\n    }\n\n    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {\n        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {\n            AppSettingsDialog.Builder(this).build().show()\n        }\n    }\n\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {\n            //拒绝授权后，从系统设置了授权后，返回APP进行相应的操作\n        }\n    }\n    override fun onBackPressed() {\n        // 得到当前Activity下的所有Fragment\n        @SuppressLint(\"RestrictedApi\")\n        val fragments = supportFragmentManager.fragments\n        // 判断是否为空\n        if (fragments.size > 0) {\n            for (fragment in fragments) {\n                // 判断是否为我们能够处理的Fragment类型\n                if (fragment is BaseFragment) {\n                    // 判断是否拦截了返回按钮\n                    if (fragment.onBackPressed()) {\n                        // 如果有直接Return\n                        return\n                    }\n                }\n            }\n        }\n        super.onBackPressed()\n    }\n\n    override fun onStart() {\n        super.onStart()\n        mListener?.onStart()\n        if (isRegisterEventBus()){\n            EventBus.getDefault().register(this)\n        }\n    }\n\n    override fun onRestart() {\n        super.onRestart()\n        mListener?.onRestart()\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n        mListener?.onResume()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        mListener?.onPause()\n    }\n\n    override fun onStop() {\n        super.onStop()\n        mListener?.onStop()\n        if (isRegisterEventBus()){\n            EventBus.getDefault().unregister(this)\n        }\n    }\n\n    /**\n     * 是否注册事件分发\n     *\n     * @return true绑定EventBus事件分发，默认不绑定，子类需要绑定的话复写此方法返回true.\n     */\n    protected open fun isRegisterEventBus() :Boolean{\n        return false\n    }\n    /**\n     * 当点击界面导航返回时，Finish当前界面\n     * @return\n     */\n    override fun onSupportNavigateUp(): Boolean {\n        finish()\n        return super.onSupportNavigateUp()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        cancleProgressDialog()\n        mListener?.onDestroy()\n        //移除view绑定\n        //unBinder?.unbind()\n        RxBus.getInstance().unSubscribe(this)\n        ActivityController.removeActivity(this)\n    }\n\n    protected fun setSwipeColor(swipeLayout: SwipeRefreshLayout) {\n        swipeLayout.setColorSchemeResources(\n            R.color.colorPrimary,\n            android.R.color.holo_blue_light,\n            android.R.color.holo_red_light,\n            android.R.color.holo_orange_light,\n            android.R.color.holo_green_light\n        )\n    }\n\n    /**\n     * 设置生命周期回调函数\n     *\n     * @param listener\n     */\n    fun setOnLifeCycleListener(listener: LifeCycleListener) {\n        mListener = listener\n    }\n\n    /**\n     * 显示进度条\n     */\n    fun showProgressDialog(msg: String) {\n        progressDialog = ProgressDialog(this)\n        progressDialog?.setMessage(msg)\n        progressDialog?.show()\n    }\n\n    fun cancleProgressDialog() {\n        progressDialog?.dismiss()\n    }\n\n    companion object {\n        init {\n            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)\n        }\n\n        /**\n         * @param packageName 目标应用的包名\n         */\n        fun goToMarket(context: Context, packageName: String) {\n            val uri = Uri.parse(\"market://details?id=$packageName\")\n            val goToMarket = Intent(Intent.ACTION_VIEW, uri)\n            try {\n                context.startActivity(goToMarket)\n            } catch (e: ActivityNotFoundException) {\n                e.printStackTrace()\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/BaseFragment.kt",
    "content": "package com.camera.lingxiao.common.app\n\nimport android.app.Activity\nimport android.app.ProgressDialog\nimport android.content.Context\nimport android.os.Bundle\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport androidx.recyclerview.widget.RecyclerView\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\n\n\nimport com.camera.lingxiao.common.R\nimport com.camera.lingxiao.common.listener.LifeCycleListener\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.trello.rxlifecycle2.components.support.RxFragment\n\nimport pub.devrel.easypermissions.EasyPermissions\n\nimport android.content.ContentValues.TAG\nimport org.greenrobot.eventbus.EventBus\nimport pub.devrel.easypermissions.AppSettingsDialog\n\n\nabstract class BaseFragment : RxFragment(), EasyPermissions.PermissionCallbacks {\n    protected var mRoot: View ? = null\n\n    //private var mRootUnbinder: Unbinder? = null\n    var mListener: LifeCycleListener? = null\n    private var progressDialog: ProgressDialog? = null\n    private var firstVisibility = true\n    protected var reuseView = true\n    protected abstract val contentLayoutId: Int\n\n    override fun onAttach(activity: Activity) {\n        super.onAttach(activity)\n        mListener?.onAttach(activity)\n        initArgs(arguments)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (mListener != null) {\n            mListener!!.onCreate(savedInstanceState)\n        }\n        firstVisibility = true\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        /*if (mRoot == null){\n            int layId = getContentLayoutId();\n            //初始化当前的跟布局，但是不在创建时就添加到container中\n            View root = inflater.inflate(layId,container,false);\n            initWidget(root);\n            mRoot = root;\n            LogUtils.i(\"BaseFragment是空：\");\n        }else {\n            if (mRoot.getParent() != null){\n                //把当前root从父控件中移除\n                ((ViewGroup) mRoot.getParent()).removeView(mRoot);\n                LogUtils.i(\"BaseFragment不是空,并且执行了移除\");\n            }\n            LogUtils.i(\"BaseFragment不是空：\");\n        }*/\n        // TODO: 18-6-29 上面的方式会报空指针 ,因为我在p层使用的弱引用\n        val layId = contentLayoutId\n        val root = inflater.inflate(layId, container, false)\n        initInject()\n        initWidget(root)\n        mRoot = root\n        return mRoot\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        if (mRoot == null){\n            mRoot = view\n        }\n        super.onViewCreated(if (reuseView) mRoot!! else view, savedInstanceState)\n        if (userVisibleHint){\n            if (firstVisibility){\n                onFirstVisiblity()\n                firstVisibility = false\n            }\n            onVisiblityChanged(true)\n        }\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        mListener?.onActivityCreated(savedInstanceState)\n        initData()\n    }\n\n\n    override fun setUserVisibleHint(isVisibleToUser: Boolean) {\n        super.setUserVisibleHint(isVisibleToUser)\n        //单个的fragment不会调用这个方法\n        if (mRoot == null){\n            return\n        }\n        if (firstVisibility){\n            if (isVisibleToUser){\n                onFirstVisiblity()\n                firstVisibility = false\n            }\n        }else{\n            onVisiblityChanged(isVisibleToUser)\n        }\n    }\n\n    override fun onStart() {\n        super.onStart()\n        mListener?.onStart()\n        if (isRegisterEventBus()){\n            EventBus.getDefault().register(this)\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        mListener?.onResume()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        mListener?.onPause()\n    }\n\n    override fun onStop() {\n        super.onStop()\n        mListener?.onStop()\n        if (isRegisterEventBus()){\n            EventBus.getDefault().unregister(this)\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        mListener?.onDestroyView()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        mListener?.onDestroy()\n        Log.e(TAG, \"onDestroy: fragment销毁了\")\n        //移除view绑定\n        //mRootUnbinder?.unbind()\n    }\n\n    override fun onDetach() {\n        super.onDetach()\n        mListener?.onDetach()\n    }\n\n    /**\n     * 初始化dagger注入\n     */\n    protected open fun initInject(){\n\n    }\n\n    /**\n     * 是否注册事件分发\n     *\n     * @return true绑定EventBus事件分发，默认不绑定，子类需要绑定的话复写此方法返回true.\n     */\n    protected open fun isRegisterEventBus() :Boolean{\n        return false\n    }\n\n    /**\n     * 初始化控件\n     */\n    protected open fun initWidget(root: View) {\n        //mRootUnbinder = ButterKnife.bind(this, root)\n    }\n\n    /**\n     * 初始化数据\n     */\n    protected open fun initData() {\n\n    }\n\n    /**\n     * 初始化相关参数\n     */\n    protected open fun initArgs(bundle: Bundle?) {}\n\n    /**\n     * 是否开启懒加载，如果只有一个fragment，则重写该方法\n     * @return\n     */\n    protected fun setLazyMode(): Boolean {\n        return false\n    }\n\n    /**\n     * fragment首次可见\n     */\n    protected open fun onFirstVisiblity(){\n        LogUtils.e(\"fragment对用户可见了\")\n    }\n\n    protected open fun onVisiblityChanged(visiblity:Boolean){\n\n    }\n\n    /**\n     * 返回按键出发\n     * @return true代表拦截\n     */\n    fun onBackPressed(): Boolean {\n        return false\n    }\n\n    protected fun setSwipeColor(swipeLayout: androidx.swiperefreshlayout.widget.SwipeRefreshLayout) {\n        swipeLayout.setColorSchemeResources(\n            R.color.colorPrimary,\n            android.R.color.holo_blue_light,\n            android.R.color.holo_red_light,\n            android.R.color.holo_orange_light,\n            android.R.color.holo_green_light\n        )\n    }\n\n    /**\n     * 滑动显示隐藏floatingactionbutton\n     * @param recyclerView\n     * @param fab\n     */\n    protected fun floatingBtnToogle(recyclerView: androidx.recyclerview.widget.RecyclerView, fab: FloatingActionButton) {\n        recyclerView.addOnScrollListener(object : androidx.recyclerview.widget.RecyclerView.OnScrollListener(){\n            override fun onScrollStateChanged(recyclerView: androidx.recyclerview.widget.RecyclerView, newState: Int) {\n                super.onScrollStateChanged(recyclerView, newState)\n            }\n\n            override fun onScrolled(recyclerView: androidx.recyclerview.widget.RecyclerView, dx: Int, dy: Int) {\n                super.onScrolled(recyclerView, dx, dy)\n                if (dy > 0) {\n                    fab.hide()\n                } else {\n                    fab.show()\n                }\n            }\n        })\n\n        fab.setOnClickListener { recyclerView.smoothScrollToPosition(0) }\n    }\n\n    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {\n\n    }\n\n    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {\n        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {\n            AppSettingsDialog.Builder(this).build().show()\n        }\n    }\n\n    /**\n     * 设置生命周期回调函数\n     *\n     * @param listener\n     */\n    fun setOnLifeCycleListener(listener: LifeCycleListener) {\n        mListener = listener\n    }\n\n    /**\n     * 显示进度条\n     */\n    fun showProgressDialog(msg: String, context: Context) {\n        progressDialog = ProgressDialog(context)\n        progressDialog?.setMessage(msg)\n        progressDialog?.show()\n    }\n\n    fun cancleProgressDialog() {\n        progressDialog?.dismiss()\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/BasePresenter.kt",
    "content": "package com.camera.lingxiao.common.app\n\nimport android.app.Activity\nimport androidx.lifecycle.Lifecycle\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\n\nimport com.camera.lingxiao.common.listener.LifeCycleListener\n\nimport java.lang.ref.Reference\nimport java.lang.ref.WeakReference\n\n/**\n * @author lingxiao\n * 使用java弱引用，管理View的引用，以及activity的引用，\n * 避免强引用导致资源无法释放而造成的内存溢出\n * @param <V>\n * @param <T>\n</T></V> */\nopen class BasePresenter<V, T>(view: V, activity: T) : LifeCycleListener {\n\n    protected var mViewRef: Reference<V>? = null\n    protected var mView: V ?= null;\n    protected var mActivityRef: Reference<T>? = null\n    protected var mActivity: T ?= null;\n\n    /**\n     * 获取view\n     * @return\n     */\n    val view: V?\n        get() = mViewRef?.get()\n\n    /**\n     * 获取activity\n     * @return\n     */\n    val activity: T?\n        get() = mActivityRef?.get()\n\n    /**\n     * view是否已经关联\n     * @return\n     */\n    val isViewAttached: Boolean\n        get() = mViewRef != null && mViewRef?.get() != null\n\n    /**\n     * activity是否已经关联\n     * @return\n     */\n    val isActivityAttached: Boolean\n        get() = mActivityRef != null && mActivityRef?.get() != null\n\n    init {\n        attachView(view)\n        attachActivity(activity)\n        setListener(activity)\n    }\n\n    /**\n     * 设置生命周期监听\n     * @param activity\n     */\n    private fun setListener(activity: T) {\n        if (activity != null) {\n            if (activity is BaseActivity) {\n                (activity as BaseActivity).setOnLifeCycleListener(this)\n            } else if (activity is BaseFragment) {\n                (activity as BaseFragment).setOnLifeCycleListener(this)\n            }\n        }\n    }\n\n    /**\n     * 关联act\n     * @param activity\n     */\n    private fun attachActivity(activity: T) {\n        mActivityRef = WeakReference(activity)\n        mActivity = mActivityRef?.get()\n    }\n\n    /**\n     * 关联view\n     * @param view\n     */\n    private fun attachView(view: V) {\n        mViewRef = WeakReference(view)\n        mView = mViewRef?.get()\n    }\n\n    /**\n     * 销毁view\n     */\n    private fun detachView() {\n        if (isViewAttached) {\n            mViewRef?.clear()\n            mViewRef = null\n        }\n    }\n\n    private fun detachActivity() {\n        if (isActivityAttached) {\n            mActivityRef?.clear()\n            mActivityRef = null\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n\n    }\n\n    override fun onStart() {\n\n    }\n\n    override fun onRestart() {\n\n    }\n\n    override fun onResume() {\n\n    }\n\n    override fun onPause() {\n\n    }\n\n    override fun onStop() {\n\n    }\n\n    override fun onDestroy() {\n        detachActivity()\n        detachView()\n    }\n\n    override fun onAttach(activity: Activity) {\n\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, viewGroup: ViewGroup, bundle: Bundle) {\n\n    }\n\n    override fun onActivityCreated(bundle: Bundle?) {\n\n    }\n\n    override fun onDestroyView() {\n\n    }\n\n    override fun onDetach() {\n\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/BaseTransation.kt",
    "content": "package com.camera.lingxiao.common.app\n\nimport com.camera.lingxiao.common.http.request.HttpRequest\nimport com.trello.rxlifecycle2.LifecycleProvider\n\nimport java.util.TreeMap\n\nopen class BaseTransation(protected var mLifecycle: LifecycleProvider<*>?) {\n    protected var mHttpRequest: HttpRequest? = null\n    protected var request: TreeMap<String, Any>\n\n    init {\n        mHttpRequest = HttpRequest()\n        request = TreeMap()\n    }\n\n    protected fun getRequest(): HttpRequest {\n        if (mHttpRequest == null) {\n            mHttpRequest = HttpRequest()\n        }\n        return mHttpRequest as HttpRequest\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/BaseView.kt",
    "content": "package com.camera.lingxiao.common.app\n\ninterface BaseView {\n    //显示进度框\n    fun showDialog()\n\n    //隐藏进度条\n    fun diamissDialog()\n\n    //打吐司\n    fun showToast(text: String?)\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/app/ContentValue.kt",
    "content": "package com.camera.lingxiao.common.app\n\nimport android.os.Environment\n\nimport com.camera.lingxiao.common.R\n\n/**\n * Created by lingxiao on 2017/9/1.\n */\n\nobject ContentValue {\n    val imgRule = \"?imageView2/3/h/230\"//图片规则，从服务器取230大小的图片\n    val bigImgRule = \"?imageView2/3/h/1080\"\n    val hor_720ImgRule = \"?imageView2/3/h/720\"\n\n    val vertical720_ImgRule = \"?imageView16/9/h/1080\"\n    val vertical1080_ImgRule = \"?imageView16/9/h/1080\"\n    //升级接口\n    val UPDATEURL = \"https://www.lingxiaosuse.cn/tudimension/update.json\"\n    val PERMESSION_REQUEST_CODE = 200\n    val KEY_USERNAME = \"key_username\"\n    val KEY_PSD = \"key_psd\"\n    /**\n     * 七牛桶\n     */\n    val BUCKET = \"smailchat\"\n    val QINIU_BASE_URL = \"http://chat.lingxiaosuse.cn/\"\n    //是否是第一次进入\n    var ISFIRST_KEY = \"isfirst_key\"\n    //服务器版本号\n    var VERSION_CODE = \"versino_code\"\n    //描述\n    var VERSION_DES = \"version_des\"\n    //下载地址\n    var DOWNLOAD_URL = \"download_url\"\n\n    //是否自动检测更新\n    var IS_CHECK = \"is_check\"\n    //是否开启日图\n    var IS_OPEN_DAILY = \"is_open_daily\"\n    //\n    //干货集中营api\n    val GANKURL = \"http://gank.io/api/data/%E7%A6%8F%E5%88%A9/\"\n\n    //baseurl\n    val BASE_URL = \"http://app.bilibili.com\"\n    /**\n     * 竖屏 最热\n     */\n    val VERTICAL_URLS = \"/v1/vertical/vertical\" + \"?limit=30?adult=false&first=1&order=hot\"\n    /**\n     * banner\n     */\n    val BANNER_URL = \"/v1/wallpaper/\"\n    /**\n     * 主页面\n     */\n    val HOMEPAGE_URL = \"/v3/homepage\"\n\n    /**\n     * 竖屏\n     */\n    val VERTICAL_URL = \"/v1/vertical/vertical\"\n\n    /**\n     * 专辑\n     */\n    val SPECIAL_URL = \"/v1/wallpaper/album\"\n    /**\n     * 分类\n     */\n    val CATEGORY_URL = \"/v1/wallpaper/category\"\n    /**\n     * 竖屏分类\n     */\n    val CATEGORY_VERTICAL_URL = \"/v1/vertical/category\"\n\n    /**\n     * 评论\n     */\n    val COMMENT_URL = \"/v2/wallpaper/wallpaper\"\n\n    /**\n     * 每次请求多少个数据\n     */\n    val limit = 30\n    /**\n     * 轮播图\n     */\n    val TYPE_ALBUM = \"album\"\n    /**\n     * 分类\n     */\n    val TYPE_CATEGORY = \"category\"\n\n    //安卓壁纸的搜索\n    val SEARCH_URL = \"http://so.picasso.adesk.com\"\n    //关键词\n    val SEARCH_KEY_URL = \"/v1/push/keyword?versionCode=181&channel=huawei&first=0&adult=false\"\n\n    //保存的图片路径\n    val PATH = Environment\n        .getExternalStorageDirectory()\n        .absolutePath + \"/tudimension\"\n\n    //百度识图\n    val BAIDU_URL = \"http://image.baidu.com/wiseshitu?guss=1&queryImageUrl=\"\n    //搜狗识图\n    val SOUGOU_URL = \"http://pic.sogou.com/\"\n    //google识图\n    val GOOGLE_URL = \"https://images.google.com/imghp?hl=zh-CN&gws_rd=ssl\"\n\n    //一言\n    val HITOKOTO_URL = \"http://api.hitokoto.cn/\"\n    //mzitu网址\n    val MZITU_URL = \"http://www.mzitu.com/\"\n\n    /**\n     * cosplay.la\n     */\n    val COSPLAY_LA_URL = \"http://api.cosplay.la/share/GetPhotoList\"\n\n    val COSPLAY_LA_DETAIL_URL = \"http://api.cosplay.la/share/GetById\"\n    /**\n     * cosplay requestcode\n     */\n    val COSPLAY_REQUEST_CODE = \"8A409431-D3EC-443F-A3B6-098F105B26B0\"\n\n    //浏览器标志\n    val USER_AGENT = \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0\"\n\n    //收藏的网址\n    val COLLECT_URL = \"collect_url\"\n\n    //搜丝吧\n    val SOUSIBA_URL = \"http://www.sousi88.cc\"\n\n    /**\n     * 当前皮肤的id\n     */\n    val SKIN_ID = \"skin_id\"\n    /**\n     * 记录侧滑模块\n     */\n    val DRAWER_MODEL = \"drawer_model\"\n    /**\n     * 设置轮播图时间\n     */\n    val BANNER_TIMER = 2000\n\n    /**\n     * 设置浏览图片的分辨率\n     */\n    val PIC_RESOLUTION = \"pic_resolution\"\n    /**\n     * 设置浏览图片的分辨率\n     */\n    val ANIMATOR_TYPE = \"animator_type\"\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/body/CosplayBody.kt",
    "content": "package com.camera.lingxiao.common.body\n\nclass CosplayBody {\n    var key: String? = null\n    var p: Int = 0\n    var psize: Int = 0\n    var order: Int = 0\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/example/HttpModle.kt",
    "content": "package com.camera.lingxiao.common.example\n\nclass HttpModle {\n\n    /*var news : ArrayList<NewsData>? = null\n    class NewsData{\n\n    }*/\n    var _id: String? = null\n    var createdAt: String? = null\n    var desc: String? = null\n    var publishedAt: String? = null\n    var source: String? = null\n    var type: String? = null\n    var url: String? = null\n    var isUsed: Boolean = false\n    var who: String? = null\n    var images: List<String>? = null\n    override fun toString(): String {\n        return \"HttpModle(_id=$_id, createdAt=$createdAt, desc=$desc, publishedAt=$publishedAt, source=$source, type=$type, url=$url, isUsed=$isUsed, who=$who, images=$images)\"\n    }\n\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/example/HttpPresenter.kt",
    "content": "package com.camera.lingxiao.common.example\n\nimport android.os.Parcel\nimport android.os.Parcelable\nimport android.util.Log\nimport com.camera.lingxiao.common.app.BasePresenter\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.trello.rxlifecycle2.LifecycleProvider\nimport java.util.*\n\nclass HttpPresenter(view: HttpView, activity: MainActivity): BasePresenter<HttpView,MainActivity>(view,activity){\n    var httpTrans: HttpTrans? = null;\n    companion object {\n        val TAG: String? = MainActivity::class.java.simpleName;\n    }\n    init {\n        httpTrans = HttpTrans(this.mActivity!!)\n    }\n\n    fun getResult(){\n        mView?.showDialog()\n        httpTrans?.getResult(object : HttpRxCallback<Any>(){\n            override fun onSuccess(res: Any?) {\n                var lists = res as Array<*>\n                var list: Array<HttpModle>? = lists[0] as Array<HttpModle>?\n                mView?.onGetResult(list)\n                mView?.diamissDialog()\n            }\n            override fun onError(code: Int, desc: String?) {\n                mView?.showToast(desc)\n                mView?.diamissDialog()\n                Log.e(TAG,\"请求失败\" + desc + \" 错误码： \" + code)\n            }\n            override fun onCancel() {\n\n            }\n        })\n    }\n}"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/example/HttpTrans.kt",
    "content": "package com.camera.lingxiao.common.example\n\nimport com.camera.lingxiao.common.app.BaseActivity\nimport com.camera.lingxiao.common.app.BaseTransation\nimport com.camera.lingxiao.common.http.ParseHelper\nimport com.camera.lingxiao.common.http.request.HttpRequest\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.google.gson.Gson\nimport com.google.gson.JsonElement\nimport com.trello.rxlifecycle2.LifecycleProvider\n\nclass HttpTrans(mLifecycle: LifecycleProvider<*>) : BaseTransation(mLifecycle) {\n    //http://gank.io/api/random/data/Android/20\n    fun getResult(callback : HttpRxCallback<Any>){\n        request.clear()\n        request.put(HttpRequest.API_URL,\"data/Android/20\")\n        callback.setParseHelper(object : ParseHelper{\n            override fun parse(element: JsonElement): Any? {\n                LogUtils.d(\"获取到的数据\" + element)\n                var modle = Gson().fromJson(element,Array<HttpModle>::class.java)\n                val obj = arrayOfNulls<Any>(1)\n                obj[0] = modle\n                return obj\n            }\n        })\n        getRequest().request(HttpRequest.Method.GET,request,callback)\n    }\n}"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/example/HttpView.kt",
    "content": "package com.camera.lingxiao.common.example\n\nimport com.camera.lingxiao.common.app.BaseView\n\ninterface HttpView: BaseView{\n    fun onGetResult(result: Array<HttpModle>?)\n}"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/example/MainActivity.kt",
    "content": "package com.camera.lingxiao.common.example\n\nimport android.util.Log\nimport com.camera.lingxiao.common.R\nimport com.camera.lingxiao.common.app.BaseActivity\nimport kotlinx.android.synthetic.main.activity_main.*\nimport java.util.*\n\nclass MainActivity : BaseActivity() , HttpView{\n    var httpPresenter: HttpPresenter? = null;\n    val TAG: String? = MainActivity::class.java.simpleName;\n    override val contentLayoutId: Int\n        get() = R.layout.activity_main\n\n    override fun initWidget() {\n        super.initWidget()\n        httpPresenter = HttpPresenter(this,this)\n        button_get.setOnClickListener{\n            httpPresenter?.getResult()\n        }\n    }\n\n    override fun showDialog() {\n\n        showProgressDialog(\"请求中...\")\n    }\n\n    override fun onGetResult(result: Array<HttpModle>?) {\n        Log.e(TAG,\"请求结果\" + result!![0].desc)\n        tv_msg.text = Arrays.toString(result)\n    }\n\n    override fun diamissDialog() {\n        cancleProgressDialog()\n    }\n\n    override fun showToast(text: String?) {\n\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/exception/ApiException.kt",
    "content": "package com.camera.lingxiao.common.exception\n\nclass ApiException : Exception {\n    var code: Int = 0//错误码\n    var msg: String? = null//错误信息\n\n    constructor(throwable: Throwable, code: Int) : super(throwable) {\n        this.code = code\n    }\n\n    constructor(code: Int, msg: String) {\n        this.code = code\n        this.msg = msg\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/exception/ExceptionEngine.kt",
    "content": "package com.camera.lingxiao.common.exception\n\nimport android.util.MalformedJsonException\n\nimport com.google.gson.JsonParseException\n\nimport org.json.JSONException\n\nimport java.net.ConnectException\nimport java.net.SocketTimeoutException\nimport java.text.ParseException\n\nimport retrofit2.HttpException\n\n/**\n * @author lingxiao 异常处理类\n */\nobject ExceptionEngine {\n    val UN_KNOWN_ERROR = 1000//未知错误\n    val ANALYTIC_SERVER_DATA_ERROR = 1001//解析(服务器)数据错误\n    val ANALYTIC_CLIENT_DATA_ERROR = 1002//解析(客户端)数据错误\n    val CONNECT_ERROR = 1003//网络连接错误\n    val TIME_OUT_ERROR = 1004//网络连接超时\n\n    fun handlerException(e: Throwable): ApiException {\n        val ex: ApiException\n        if (e is HttpException) {             //HTTP错误\n            ex = ApiException(e, e.code())\n            ex.msg = \"网络错误\"  //均视为网络错误\n            return ex\n        } else if (e is ServerException) {    //服务器返回的错误\n            ex = ApiException(e, e.code)\n            ex.msg = e.msg\n            return ex\n        } else if (e is JsonParseException\n            || e is JSONException\n            || e is ParseException || e is MalformedJsonException\n        ) {  //解析数据错误\n            ex = ApiException(e, ANALYTIC_SERVER_DATA_ERROR)\n            ex.msg = \"解析错误\"\n            return ex\n        } else if (e is ConnectException) {//连接网络错误\n            ex = ApiException(e, CONNECT_ERROR)\n            ex.msg = \"连接失败\"\n            return ex\n        } else if (e is SocketTimeoutException) {//网络超时\n            ex = ApiException(e, TIME_OUT_ERROR)\n            ex.msg = \"网络超时\"\n            return ex\n        } else {  //未知错误\n            ex = ApiException(e, UN_KNOWN_ERROR)\n            ex.msg = \"未知错误\"\n            return ex\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/exception/ServerException.kt",
    "content": "package com.camera.lingxiao.common.exception\n\n/**\n * @author lingxiao\n * 自定义的错误类型，一般我们开发中都会跟服务器约定一种接口请求返回的数据:\n * int code：表示接口请求状态，200表示成功，-101表示密码错误等等\n * String msg：表示接口请求返回的描述。success，”token过期”等等\n * Object result：成功是返回的数据\n */\nclass ServerException(val code: Int, val msg: String) : RuntimeException()\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/exception/crash/CrashActivity.kt",
    "content": "package com.camera.lingxiao.common.exception.crash\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.MenuItem\nimport com.camera.lingxiao.common.R\nimport com.camera.lingxiao.common.app.ActivityController\nimport com.camera.lingxiao.common.app.BaseActivity\nimport kotlinx.android.synthetic.main.activity_crash.*\n\nclass CrashActivity : BaseActivity() {\n    override val contentLayoutId: Int\n        get() = R.layout.activity_crash\n\n    override fun initWidget() {\n        super.initWidget()\n        val intent = intent\n        val errorMsg = intent.getStringExtra(\"msg\")\n        tv_errormsg.setText(errorMsg)\n        setToolbarBack(toolbar_title)\n        toolbar_title.setTitle(\"程序坏了\")\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == android.R.id.home) {\n            ActivityController.finishAll()\n            finish()\n            System.exit(0)\n        }\n        return true\n    }\n\n    override fun onBackPressed() {\n        super.onBackPressed()\n        ActivityController.finishAll()\n        finish()\n        System.exit(0)\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/HttpResultFunction.kt",
    "content": "package com.camera.lingxiao.common.http\n\nimport com.camera.lingxiao.common.exception.ExceptionEngine\nimport com.camera.lingxiao.common.utills.LogUtils\n\nimport io.reactivex.Observable\nimport io.reactivex.functions.Function\n\n/**\n * @author lingxiao\n * 使用onErrorResumeNext(new HttpResultFunction<>())操作符\n * 对Retrofit网络请求抛出的Exception进行处理\n * @param <T>\n</T> */\nclass HttpResultFunction<T> : Function<Throwable, Observable<T>> {\n\n    @Throws(Exception::class)\n    override fun apply(throwable: Throwable): Observable<T> {\n        //打印具体错误\n        LogUtils.e(\"HttpResultFunction:$throwable\")\n        return Observable.error(ExceptionEngine.handlerException(throwable))\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/OtherServerFunction.kt",
    "content": "package com.camera.lingxiao.common.http\n\n\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.google.gson.Gson\n\nimport io.reactivex.functions.Function\n\nclass OtherServerFunction<T> : Function<T, Any> {\n    override fun apply(t: T): Any {\n        //其他api..未规范\n        return Gson().toJson(t)\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/ParseHelper.kt",
    "content": "package com.camera.lingxiao.common.http\n\nimport com.google.gson.JsonElement\n\n/**\n * @author lingxiao\n * 数据解析\n */\ninterface ParseHelper {\n    fun parse(element: JsonElement): Any?\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/RxActionManager.kt",
    "content": "package com.camera.lingxiao.common.http\n\nimport io.reactivex.disposables.Disposable\n\n/**\n * RxAction管理接口\n * @param <T>\n</T> */\ninterface RxActionManager<T> {\n    /**\n     * 添加\n     *\n     * @param tag\n     * @param disposable\n     */\n    fun add(tag: T, disposable: Disposable)\n\n    /**\n     * 移除\n     *\n     * @param tag\n     */\n    fun remove(tag: T)\n\n    /**\n     * 取消\n     *\n     * @param tag\n     */\n    fun cancel(tag: T)\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/RxActionManagerImpl.kt",
    "content": "package com.camera.lingxiao.common.http\n\nimport android.util.ArrayMap\n\nimport io.reactivex.disposables.Disposable\n\n/**\n * @author lingxiao\n */\nclass RxActionManagerImpl<Any> : RxActionManager<Any> {\n    private val mMaps: ArrayMap<Any, Disposable> //处理请求列表\n\n    init {\n        mMaps = ArrayMap()\n    }\n\n    override fun add(tag: Any, disposable: Disposable) {\n        mMaps[tag] = disposable\n    }\n\n    override fun remove(tag: Any) {\n        if (!mMaps.isEmpty()) {\n            mMaps.remove(tag)\n        }\n    }\n\n    /**\n     * 取消订阅事件\n     * @param tag\n     */\n    override fun cancel(tag: Any) {\n        if (mMaps.isEmpty()) {\n            return\n        }\n        if (mMaps[tag] == null) {\n            return\n        }\n        //如果不是处于dispose的状态\n        //切断所有订阅事件，防止内存泄漏\n        if (!mMaps[tag]!!.isDisposed) {\n            mMaps[tag]!!.dispose()\n        }\n    }\n\n    /**\n     * 判断是否取消了请求\n     * @param tag\n     * @return\n     */\n    fun isDisposed(tag: Any): Boolean? {\n        return if (mMaps[tag] == null || mMaps.isEmpty()) {\n            true\n        } else mMaps[tag]?.isDisposed\n    }\n\n    companion object {\n\n        @Volatile\n        private var mInstance: RxActionManagerImpl<Any>? = null\n\n        val instance: RxActionManagerImpl<Any>?\n            get() {\n                if (mInstance == null) {\n                    synchronized(RxActionManagerImpl::class.java) {\n                        if (mInstance == null) {\n                            mInstance =\n                                    RxActionManagerImpl()\n                        }\n                    }\n                }\n                return mInstance\n            }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/ServerResultFunction.kt",
    "content": "package com.camera.lingxiao.common.http\n\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.camera.lingxiao.common.exception.ServerException\nimport com.camera.lingxiao.common.http.response.HttpResponse\nimport com.google.gson.Gson\n\nimport io.reactivex.functions.Function\n\n/**\n * @author lingxiao\n * 数据的处理（截取数据）、数据类型转换（由图片path转为Bitmap）等\n * 配合map操作符\n */\nclass ServerResultFunction : Function<HttpResponse, Any> {\n    override fun apply(httpResponse: HttpResponse): Any {\n        //打印服务器回传结果\n        LogUtils.e(\"ServerResultFunction: \" + httpResponse.toString())\n        if (!httpResponse.isSuccess) {\n            throw ServerException(httpResponse.code, httpResponse.msg!!)\n        }\n        return Gson().toJson(httpResponse.results)\n    }\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/request/HttpRequest.kt",
    "content": "package com.camera.lingxiao.common.http.request\n\nimport com.camera.lingxiao.common.api.MainApi\nimport com.camera.lingxiao.common.http.response.HttpResponse\nimport com.camera.lingxiao.common.observable.HttpRxObservable\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.camera.lingxiao.common.utills.RetrofitUtil\nimport com.trello.rxlifecycle2.LifecycleProvider\nimport com.trello.rxlifecycle2.android.ActivityEvent\nimport com.trello.rxlifecycle2.android.FragmentEvent\n\nimport java.util.TreeMap\n\nimport io.reactivex.Observable\n\n/**\n * http请求类\n */\nclass HttpRequest {\n\n    private val appKey = \"1889b37351288\"\n    private val k_key = \"key\"\n    /**\n     * 获取基础request参数\n     * @return\n     */\n    private//map.put(k_key,appKey);\n    val baseRequest: TreeMap<String, Any>\n        get() = TreeMap()\n\n    enum class Method {\n        GET,\n        POST\n    }\n\n    /**\n     * 发送请求 不管理生命周期\n     * @param method\n     * @param prams\n     * @param callback\n     */\n    fun request(method: Method, prams: TreeMap<String, Any>, callback: HttpRxCallback<Any>) {\n        val apiObservable = handleRequest(method, prams)\n\n        HttpRxObservable.getObservable(apiObservable, callback).subscribe(callback)\n    }\n\n    /**\n     * 发送请求\n     * 备注:自动管理生命周期\n     *\n     * @param method    请求方式\n     * @param lifecycle 实现RxActivity/RxFragment 参数为空不管理生命周期\n     * @param prams     参数集合\n     * @param callback  回调\n     */\n    fun request(\n        method: Method,\n        prams: TreeMap<String, Any>,\n        lifecycle: LifecycleProvider<Any>,\n        callback: HttpRxCallback<Any>\n    ) {\n        val apiObservable = handleRequest(method, prams)\n\n        HttpRxObservable.getObservable(apiObservable, lifecycle, callback).subscribe(callback)\n    }\n\n    /**\n     * 全路径请求\n     * 备注:自动管理生命周期\n     * @param lifecycle 实现RxActivity/RxFragment 参数为空不管理生命周期\n     * @param callback  回调\n     */\n    fun requestFullPath(\n        method: Method,\n        url: String, prams: TreeMap<String, Any>, lifecycle: LifecycleProvider<*>?, callback: HttpRxCallback<Any>) {\n        val apiObservable: Observable<HttpResponse>\n        when(method){\n            Method.GET ->{\n                apiObservable = RetrofitUtil\n                    .get()\n                    .retrofit()\n                    .create(MainApi::class.java)\n                    .fullPathGet(url,prams)\n            }\n            else->{\n                apiObservable = RetrofitUtil\n                    .get()\n                    .retrofit()\n                    .create(MainApi::class.java)\n                    .fullPathPost(url,prams)\n            }\n        }\n\n        HttpRxObservable.getObservable(apiObservable, lifecycle, callback).subscribe(callback)\n        //HttpRxObservable.getOtherObservable(apiObservable,lifecycle,callback).subscribe(callback)\n    }\n\n    /**\n     * 全路径请求\n     * 备注:自动管理生命周期\n     * @param lifecycle 实现RxActivity/RxFragment 参数为空不管理生命周期\n     * @param callback  回调\n     */\n    fun requestFullPathWithoutCheck(\n        method: Method,\n        url: String, prams: TreeMap<String, Any>, lifecycle: LifecycleProvider<*>?, callback: HttpRxCallback<Any>) {\n        val apiObservable: Observable<Any>\n        when(method){\n            Method.GET ->{\n                apiObservable = RetrofitUtil\n                    .get()\n                    .retrofit()\n                    .create(MainApi::class.java)\n                    .fullPathGetWithoutCheck(url,prams)\n            }\n            else->{\n                apiObservable = RetrofitUtil\n                    .get()\n                    .retrofit()\n                    .create(MainApi::class.java)\n                    .fullPathPostWithoutCheck(url,prams)\n            }\n        }\n        HttpRxObservable.getOtherObservable(apiObservable,lifecycle,callback).subscribe(callback)\n    }\n\n    /**\n     * 发送请求\n     * 备注:手动指定生命周期-Activity\n     *\n     * @param method    请求方式\n     * @param lifecycle 实现RxActivity\n     * @param event     指定生命周期\n     * @param prams     参数集合\n     * @param callback  回调\n     */\n    fun request(\n        method: Method,\n        prams: TreeMap<String, Any>,\n        lifecycle: LifecycleProvider<ActivityEvent>,\n        event: ActivityEvent,\n        callback: HttpRxCallback<Any>\n    ) {\n        val apiObservable = handleRequest(method, prams)\n\n        HttpRxObservable.getObservable(apiObservable, lifecycle, event, callback).subscribe(callback)\n    }\n\n    /**\n     * 发送请求\n     * 备注:手动指定生命周期-Fragment\n     *\n     * @param method    请求方式\n     * @param lifecycle 实现RxFragment\n     * @param event     指定生命周期\n     * @param prams     参数集合\n     * @param callback  回调\n     */\n    fun request(\n        method: Method,\n        prams: TreeMap<String, Any>,\n        lifecycle: LifecycleProvider<FragmentEvent>,\n        event: FragmentEvent,\n        callback: HttpRxCallback<Any>\n    ) {\n        val apiObservable = handleRequest(method, prams)\n\n        HttpRxObservable.getObservable(apiObservable, lifecycle, event, callback).subscribe(callback)\n    }\n\n    /**\n     * 发送请求 安卓壁纸\n     * 备注:手动指定生命周期-Fragment\n     *\n     * @param lifecycle 实现RxFragment\n     * @param prams     参数集合\n     * @param callback  回调\n     * @param strings 5 个参数\n     */\n    fun request(\n        prams: TreeMap<String, Any>,\n        lifecycle: LifecycleProvider<Any>,\n        callback: HttpRxCallback<Any>,\n        vararg strings: String\n    ) {\n        val apiObservable: Observable<HttpResponse>\n        val map = baseRequest\n        //添加业务参数\n        map.putAll(prams)\n        //var apiUrl = \"\"\n        if (map.containsKey(API_URL)) {\n            //apiUrl = map[API_URL].toString()\n            //移除apiurl参数  此参数不纳入业务参数\n            map.remove(API_URL)\n        }\n        apiObservable = RetrofitUtil\n            .get()\n            .retrofit()\n            .create(MainApi::class.java)\n            .desk(strings[0], strings[1], strings[2], strings[3], strings[4], map)\n\n        HttpRxObservable.getObservable(apiObservable, lifecycle, callback).subscribe(callback)\n    }\n\n    /**\n     * 预处理请求\n     * @param method 请求方法\n     * @param prams 参数集合\n     * @return\n     */\n    private fun handleRequest(method: Method, prams: TreeMap<String, Any>): Observable<HttpResponse> {\n        val map = baseRequest\n        //添加业务参数\n        map.putAll(prams)\n        var apiUrl = \"\"\n        if (map.containsKey(API_URL)) {\n            apiUrl = map[API_URL].toString()\n            //移除apiurl参数  此参数不纳入业务参数\n            map.remove(API_URL)\n        }\n        val apiObservable: Observable<HttpResponse>\n        when (method) {\n            Method.GET -> apiObservable =\n                    RetrofitUtil.get().retrofit().create(MainApi::class.java).get(apiUrl, map)\n            Method.POST -> apiObservable =\n                    RetrofitUtil.get().retrofit().create(MainApi::class.java).post(apiUrl, map)\n            //else -> apiObservable = RetrofitUtil.get().retrofit().create(MainApi::class.java).post(apiUrl, map)\n        }\n        return apiObservable\n    }\n\n    companion object {\n        val API_URL = \"API_URL\"\n    }\n\n}\n\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/request/HttpRequestListener.kt",
    "content": "package com.camera.lingxiao.common.http.request\n\n/**\n * @author lingxiao\n * 请求监听接口\n */\ninterface HttpRequestListener {\n    /**\n     * 取消请求\n     */\n    fun cancel()\n\n    /**\n     * 请求被取消\n     */\n    fun onCanceled()\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/http/response/HttpResponse.kt",
    "content": "package com.camera.lingxiao.common.http.response\n\nimport com.google.gson.Gson\nimport com.google.gson.annotations.SerializedName\n\n/**\n * @author lingxiao\n * http响应参数实体类\n * 通过Gson解析属性名称需要与服务器返回字段对应,或者使用注解@SerializedName\n * 备注:这里与服务器约定返回格式\n */\nclass HttpResponse {\n    /**\n     * 描述信息\n     */\n    @SerializedName(\"message\")\n    var msg: String? = null\n\n    /**\n     * 状态码\n     */\n    @SerializedName(\"code\")\n    var code: Int = 0\n\n    /**\n     * 数据对象[成功返回对象,失败返回错误说明]\n     */\n    @SerializedName(\"data\")\n    var results: Any? = null\n\n    /**\n     * 是否成功(这里约定200或者0)\n     *\n     * @return\n     */\n    val isSuccess: Boolean\n        get() = if (code == 200 || code == 0) {\n            true\n        } else false\n\n    /*val isSuccess: Boolean\n        get() = if (!error) {\n            true\n        } else false*/\n\n    override fun toString(): String {\n        return \"HttpResponse(msg=$msg, code=$code, results=$results)\"\n    }\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/listener/LifeCycleListener.kt",
    "content": "package com.camera.lingxiao.common.listener\n\nimport android.app.Activity\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\n\ninterface LifeCycleListener {\n    /**\n     * Activity相关生命周期回调\n     */\n    fun onCreate(savedInstanceState: Bundle?)\n\n    fun onStart()\n\n    fun onRestart()\n\n    fun onResume()\n\n    fun onPause()\n\n    fun onStop()\n\n    fun onDestroy()\n\n    /**\n     * Fragment(特有)相关生命周期回调\n     */\n\n    fun onAttach(activity: Activity)\n\n    fun onCreateView(inflater: LayoutInflater, viewGroup: ViewGroup, bundle: Bundle)\n\n    fun onActivityCreated(bundle: Bundle?)\n\n    fun onDestroyView()\n\n    fun onDetach()\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/observable/HttpRxObservable.kt",
    "content": "package com.camera.lingxiao.common.observable\n\nimport com.camera.lingxiao.common.http.HttpResultFunction\nimport com.camera.lingxiao.common.http.OtherServerFunction\nimport com.camera.lingxiao.common.http.ServerResultFunction\nimport com.camera.lingxiao.common.http.response.HttpResponse\nimport com.camera.lingxiao.common.observer.HttpRxCallback\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.google.gson.Gson\nimport com.trello.rxlifecycle2.LifecycleProvider\nimport com.trello.rxlifecycle2.android.ActivityEvent\nimport com.trello.rxlifecycle2.android.FragmentEvent\n\nimport io.reactivex.Observable\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.functions.Action\nimport io.reactivex.functions.Function\nimport io.reactivex.schedulers.Schedulers\n\n/**\n * @author lingxiao\n * 适用Retrofit网络请求Observable(被观察者)\n */\nobject HttpRxObservable {\n    /**\n     * 获取被观察者 网络请求Observable构建\n     * @param apiObservable\n     * @param provider LifecycleProvider自动管理生命周期,避免内存溢出\n     * @return\n     */\n    fun getObservable(apiObservable: Observable<HttpResponse>, provider: LifecycleProvider<*>): Observable<*> {\n        val observable: Observable<*>\n        observable = apiObservable\n            .map(ServerResultFunction()) //返回一个Observable(将上个Observable的发射的每个Emitter都经过指定函数变化)，并将变化后的事件发射。\n            .compose(provider.bindToLifecycle()) //需要在这个位置添加\n            .onErrorResumeNext(HttpResultFunction())\n            .subscribeOn(Schedulers.io()) //指定observable发送事件的线程\n            .observeOn(AndroidSchedulers.mainThread()) //指定Observer接收事件的线程\n        return observable\n    }\n\n    /**\n     * 获取被监听者\n     * 备注:网络请求Observable构建\n     * data:网络请求参数\n     * <h1>补充说明</h1>\n     * 无管理生命周期,容易导致内存溢出\n     */\n    fun getObservable(apiObservable: Observable<HttpResponse>, callback: HttpRxCallback<*>?): Observable<*> {\n        // showLog(request);\n        return apiObservable\n            .map(ServerResultFunction())\n            .onErrorResumeNext(HttpResultFunction())\n            .doOnDispose {\n                callback?.onCanceled()\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n\n    fun getOtherObservable(apiObservable: Observable<*>, callback: HttpRxCallback<*>?): Observable<*> {\n        // showLog(request);\n        return apiObservable\n            .map(OtherServerFunction())\n            .onErrorResumeNext(HttpResultFunction())\n            .doOnDispose {\n                callback?.onCanceled()\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    /**\n     * 获取被监听者\n     * 备注:网络请求Observable构建\n     * data:网络请求参数\n     * <h1>补充说明</h1>\n     * 传入LifecycleProvider自动管理生命周期,避免内存溢出\n     * 备注:需要继承RxActivity.../RxFragment...\n     *\n     */\n    fun getObservable(\n        apiObservable: Observable<HttpResponse>,\n        lifecycle: LifecycleProvider<*>?,\n        callback: HttpRxCallback<*>?\n    ): Observable<*> {\n        //showLog(request);\n        val observable: Observable<*>\n\n        if (lifecycle != null) {\n            //随生命周期自动管理.eg:onCreate(start)->onStop(end)\n            observable = apiObservable\n                .map(ServerResultFunction())\n                .compose(lifecycle.bindToLifecycle())//需要在这个位置添加\n                .onErrorResumeNext(HttpResultFunction())\n                .doOnDispose {\n                    callback?.onCanceled()\n                }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n        } else {\n            observable = getObservable(apiObservable, callback)\n        }\n        return observable\n    }\n\n    /**\n     * 供其他未规范化的api调用\n     * @param apiObservable\n     * @param lifecycle\n     * @param callback\n     * @return\n     */\n    fun getOtherObservable(\n        apiObservable: Observable<Any>,\n        lifecycle: LifecycleProvider<*>?,\n        callback: HttpRxCallback<Any>?\n    ): Observable<*> {\n        //showLog(request);\n        val observable: Observable<*>\n\n        if (lifecycle != null) {\n            //随生命周期自动管理.eg:onCreate(start)->onStop(end)\n            observable = apiObservable\n                .map(OtherServerFunction())\n                .compose(lifecycle.bindToLifecycle())//需要在这个位置添加\n                .onErrorResumeNext(HttpResultFunction())\n                .doOnDispose {\n                    callback?.onCanceled()\n                }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n        } else {\n            observable = getOtherObservable(apiObservable, callback)\n        }\n        return observable\n    }\n\n    /**\n     * 获取被监听者\n     * 备注:网络请求Observable构建\n     * data:网络请求参数\n     * <h1>补充说明</h1>\n     * 传入LifecycleProvider<ActivityEvent>手动管理生命周期,避免内存溢出\n     * 备注:需要继承RxActivity,RxAppCompatActivity,RxFragmentActivity\n     *\n    </ActivityEvent> */\n    fun getObservable(\n        apiObservable: Observable<HttpResponse>,\n        lifecycle: LifecycleProvider<ActivityEvent>?,\n        event: ActivityEvent,\n        callback: HttpRxCallback<*>?\n    ): Observable<*> {\n        // showLog(request);\n        val observable: Observable<*>\n        if (lifecycle != null) {\n            //手动管理移除监听生命周期.eg:ActivityEvent.STOP\n            observable = apiObservable\n                .map(ServerResultFunction())\n                .compose(lifecycle.bindUntilEvent(event))//需要在这个位置添加\n                .onErrorResumeNext(HttpResultFunction())\n                .doOnDispose {\n                    callback?.onCanceled()\n                }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n        } else {\n            observable = getObservable(apiObservable, callback)\n        }\n        return observable\n    }\n\n\n    /**\n     * 获取被监听者\n     * 备注:网络请求Observable构建\n     * data:网络请求参数\n     * <h1>补充说明</h1>\n     * 传入LifecycleProvider<FragmentEvent>手动管理生命周期,避免内存溢出\n     * 备注:需要继承RxFragment,RxDialogFragment\n     *\n    </FragmentEvent> */\n    fun getObservable(\n        apiObservable: Observable<HttpResponse>,\n        lifecycle: LifecycleProvider<FragmentEvent>?,\n        event: FragmentEvent,\n        callback: HttpRxCallback<*>?\n    ): Observable<*> {\n        //  showLog(request);\n        val observable: Observable<*>\n        if (lifecycle != null) {\n            //手动管理移除监听生命周期.eg:FragmentEvent.STOP\n            observable = apiObservable\n                .map(ServerResultFunction())\n                .compose(lifecycle.bindUntilEvent(event))//需要在这个位置添加\n                .onErrorResumeNext(HttpResultFunction())\n                .doOnDispose {\n                    callback?.onCanceled()\n                }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n        } else {\n            observable = getObservable(apiObservable, callback)\n        }\n        return observable\n    }\n\n\n    /**\n     * 打印log\n     *\n     * @author ZhongDaFeng\n     */\n    private fun showLog(request: Map<String, Any>?) {\n        if (request == null || request.size == 0) {\n            LogUtils.e(\"[http request]:\")\n        }\n        LogUtils.e(\"[http request]:\" + Gson().toJson(request))\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/observer/HttpRxCallback.kt",
    "content": "package com.camera.lingxiao.common.observer\n\nimport android.text.TextUtils\n\nimport com.camera.lingxiao.common.exception.ApiException\nimport com.camera.lingxiao.common.exception.ExceptionEngine\nimport com.camera.lingxiao.common.http.ParseHelper\nimport com.camera.lingxiao.common.http.request.HttpRequestListener\nimport com.camera.lingxiao.common.http.RxActionManagerImpl\nimport com.camera.lingxiao.common.utills.LogUtils\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonParser\nimport com.google.gson.JsonSyntaxException\n\nimport io.reactivex.Observer\nimport io.reactivex.annotations.NonNull\nimport io.reactivex.disposables.Disposable\n\nabstract class HttpRxCallback<T> : Observer<T>, HttpRequestListener {\n    private var mTag: String? = null//请求标识\n    private var parseHelper: ParseHelper? = null//数据解析\n\n    /**\n     * 是否已经处理\n     *\n     * @author ZhongDaFeng\n     */\n    val isDisposed: Boolean?\n        get() = if (TextUtils.isEmpty(mTag)) {\n            true\n        } else RxActionManagerImpl.instance?.isDisposed(this.mTag!!)\n\n    constructor() {\n        this.mTag = System.currentTimeMillis().toString()\n    }\n\n    constructor(tag: String) {\n        this.mTag = tag\n    }\n\n    /**\n     * 手动取消请求\n     */\n    override fun cancel() {\n        if (!TextUtils.isEmpty(mTag)) {\n            RxActionManagerImpl.instance?.cancel(this.mTag!!)\n        }\n    }\n\n    /**\n     * 请求被取消\n     */\n    override fun onCanceled() {\n        onCancel()\n    }\n\n    override fun onSubscribe(d: Disposable) {\n        if (!TextUtils.isEmpty(mTag)) {\n            RxActionManagerImpl.instance?.add(this.mTag!!, d)\n        }\n    }\n\n    override fun onNext(@NonNull t: T) {\n        if (!TextUtils.isEmpty(mTag)) {\n            RxActionManagerImpl.instance?.remove(this.mTag!!)\n        }\n        try {\n            val jsonElement = JsonParser().parse(t as String)\n            val res = parseHelper?.parse(jsonElement)\n            if (parseHelper != null){\n                onSuccess(res)\n            }else{\n                onSuccess(jsonElement)\n            }\n        } catch (jsonException: JsonSyntaxException) {\n            jsonException.printStackTrace()\n            LogUtils.e(\"JsonSyntaxException:\" + jsonException.message)\n            onError(ExceptionEngine.ANALYTIC_SERVER_DATA_ERROR, \"解析错误\")\n        }\n\n    }\n\n\n\n\n    override fun onError(e: Throwable) {\n        RxActionManagerImpl.instance?.remove(this.mTag!!)\n        if (e is ApiException) {\n            val code = e.code\n            val msg = e.msg\n            if (code == 1001) { //系统公告(示例)\n                //此处在UI主线程\n            } else if (code == 1002) {//token失效\n                //处理对应的逻辑\n            } else {//其他错误回调\n                onError(code, msg)\n            }\n        } else {\n            onError(ExceptionEngine.UN_KNOWN_ERROR, \"未知错误\")\n        }\n    }\n\n    override fun onComplete() {\n\n    }\n\n    /**\n     * 设置解析回调\n     * @param parseHelper\n     */\n    fun setParseHelper(parseHelper: ParseHelper) {\n        this.parseHelper = parseHelper\n    }\n\n    /**\n     * 成功回调\n     *\n     * @param object\n     */\n    abstract fun onSuccess(res: Any?)\n    /**\n     * 失败回调\n     *\n     * @param code\n     * @param desc\n     */\n    abstract fun onError(code: Int, desc: String?)\n\n    /**\n     * 取消回调\n     */\n    abstract fun onCancel()\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/observer/HttpRxObserver.kt",
    "content": "package com.camera.lingxiao.common.observer\n\n\nimport android.text.TextUtils\n\nimport com.camera.lingxiao.common.exception.ApiException\nimport com.camera.lingxiao.common.exception.ExceptionEngine\nimport com.camera.lingxiao.common.http.request.HttpRequestListener\nimport com.camera.lingxiao.common.http.RxActionManagerImpl\n\nimport io.reactivex.Observer\nimport io.reactivex.disposables.Disposable\n\nabstract class HttpRxObserver<T>(\n    private val mTag: String//请求标识\n) : Observer<T>, HttpRequestListener {\n\n    val isDisposed: Boolean?\n        get() = if (TextUtils.isEmpty(mTag)) {\n            true\n        } else RxActionManagerImpl.instance?.isDisposed(mTag)\n\n    override fun cancel() {\n        if (!TextUtils.isEmpty(mTag)) {\n            RxActionManagerImpl.instance?.cancel(mTag)\n        }\n    }\n\n    override fun onCanceled() {\n\n    }\n\n    /**\n     * 添加请求标识\n     * @param d\n     */\n    override fun onSubscribe(d: Disposable) {\n        if (!TextUtils.isEmpty(mTag)) {\n            RxActionManagerImpl.instance?.add(mTag, d)\n        }\n        onStart(d)\n    }\n\n    /**\n     * 移除请求\n     * @param t\n     */\n    override fun onNext(t: T) {\n        if (!TextUtils.isEmpty(mTag)) {\n            RxActionManagerImpl.instance?.remove(mTag)\n        }\n        onSuccess(t)\n    }\n\n    /**\n     * 封装错误/异常处理 移除请求\n     * @param e\n     */\n    override fun onError(e: Throwable) {\n        RxActionManagerImpl.instance?.remove(mTag)\n        if (e is ApiException) {\n            onError(e)\n        } else {\n            onError(ApiException(e, ExceptionEngine.UN_KNOWN_ERROR))\n        }\n    }\n\n    override fun onComplete() {\n\n    }\n\n    protected abstract fun onStart(d: Disposable)\n\n    /**\n     * 错误/异常回调\n     */\n    protected abstract fun onError(e: ApiException)\n\n    /**\n     * 成功回调\n     */\n    protected abstract fun onSuccess(response: T)\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/Auth.java",
    "content": "package com.camera.lingxiao.common.oss;\n\nimport com.qiniu.android.http.Client;\n\nimport java.net.URI;\nimport java.security.GeneralSecurityException;\n\nimport javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic final class Auth {\n\n    /**\n     * 上传策略\n     * 参考文档：<a href=\"https://developer.qiniu.com/kodo/manual/put-policy\">上传策略</a>\n     */\n    private static final String[] policyFields = new String[]{\n            \"callbackUrl\",\n            \"callbackBody\",\n            \"callbackHost\",\n            \"callbackBodyType\",\n            \"callbackFetchKey\",\n\n            \"returnUrl\",\n            \"returnBody\",\n\n            \"endUser\",\n            \"saveKey\",\n            \"insertOnly\",\n            \"isPrefixalScope\",\n\n            \"detectMime\",\n            \"mimeLimit\",\n            \"fsizeLimit\",\n            \"fsizeMin\",\n\n            \"persistentOps\",\n            \"persistentNotifyUrl\",\n            \"persistentPipeline\",\n\n            \"deleteAfterDays\",\n            \"fileType\",\n    };\n    private static final String[] deprecatedPolicyFields = new String[]{\n            \"asyncOps\",\n    };\n    public final String accessKey;\n    private final SecretKeySpec secretKey;\n\n    private Auth(String accessKey, SecretKeySpec secretKeySpec) {\n        this.accessKey = accessKey;\n        this.secretKey = secretKeySpec;\n    }\n\n    public static Auth create(String accessKey, String secretKey) {\n        if (StringUtils.isNullOrEmpty(accessKey) || StringUtils.isNullOrEmpty(secretKey)) {\n            throw new IllegalArgumentException(\"empty key\");\n        }\n        byte[] sk = StringUtils.utf8Bytes(secretKey);\n        SecretKeySpec secretKeySpec = new SecretKeySpec(sk, \"HmacSHA1\");\n        return new Auth(accessKey, secretKeySpec);\n    }\n\n    private static void copyPolicy(final StringMap policy, StringMap originPolicy, final boolean strict) {\n        if (originPolicy == null) {\n            return;\n        }\n        originPolicy.forEach(new StringMap.Consumer() {\n            @Override\n            public void accept(String key, Object value) {\n                if (StringUtils.inStringArray(key, deprecatedPolicyFields)) {\n                    throw new IllegalArgumentException(key + \" is deprecated!\");\n                }\n                if (!strict || StringUtils.inStringArray(key, policyFields)) {\n                    policy.put(key, value);\n                }\n            }\n        });\n    }\n\n    private Mac createMac() {\n        Mac mac;\n        try {\n            mac = Mac.getInstance(\"HmacSHA1\");\n            mac.init(secretKey);\n        } catch (GeneralSecurityException e) {\n            e.printStackTrace();\n            throw new IllegalArgumentException(e);\n        }\n        return mac;\n    }\n\n    public String sign(byte[] data) {\n        Mac mac = createMac();\n        String encodedSign = UrlSafeBase64.encodeToString(mac.doFinal(data));\n        return this.accessKey + \":\" + encodedSign;\n    }\n\n    public String sign(String data) {\n        return sign(StringUtils.utf8Bytes(data));\n    }\n\n    public String signWithData(byte[] data) {\n        String s = UrlSafeBase64.encodeToString(data);\n        return sign(StringUtils.utf8Bytes(s)) + \":\" + s;\n    }\n\n    public String signWithData(String data) {\n        return signWithData(StringUtils.utf8Bytes(data));\n    }\n\n    /**\n     * 生成HTTP请求签名字符串\n     *\n     * @param urlString\n     * @param body\n     * @param contentType\n     * @return\n     */\n    public String signRequest(String urlString, byte[] body, String contentType) {\n        URI uri = URI.create(urlString);\n        String path = uri.getRawPath();\n        String query = uri.getRawQuery();\n\n        Mac mac = createMac();\n\n        mac.update(StringUtils.utf8Bytes(path));\n\n        if (query != null && query.length() != 0) {\n            mac.update((byte) ('?'));\n            mac.update(StringUtils.utf8Bytes(query));\n        }\n        mac.update((byte) '\\n');\n        if (body != null && Client.FormMime.equalsIgnoreCase(contentType)) {\n            mac.update(body);\n        }\n\n        String digest = UrlSafeBase64.encodeToString(mac.doFinal());\n\n        return this.accessKey + \":\" + digest;\n    }\n\n    /**\n     * 验证回调签名是否正确\n     *\n     * @param originAuthorization 待验证签名字符串，以 \"QBox \"作为起始字符\n     * @param url                 回调地址\n     * @param body                回调请求体。原始请求体，不要解析后再封装成新的请求体--可能导致签名不一致。\n     * @param contentType         回调ContentType\n     * @return\n     */\n    public boolean isValidCallback(String originAuthorization, String url, byte[] body, String contentType) {\n        String authorization = \"QBox \" + signRequest(url, body, contentType);\n        return authorization.equals(originAuthorization);\n    }\n\n    /**\n     * 下载签名\n     *\n     * @param baseUrl 待签名文件url，如 http://img.domain.com/u/3.jpg 、\n     *                http://img.domain.com/u/3.jpg?imageView2/1/w/120\n     * @return\n     */\n    public String privateDownloadUrl(String baseUrl) {\n        return privateDownloadUrl(baseUrl, 3600);\n    }\n\n    /**\n     * 下载签名\n     *\n     * @param baseUrl 待签名文件url，如 http://img.domain.com/u/3.jpg 、\n     *                http://img.domain.com/u/3.jpg?imageView2/1/w/120\n     * @param expires 有效时长，单位秒。默认3600s\n     * @return\n     */\n    public String privateDownloadUrl(String baseUrl, long expires) {\n        long deadline = System.currentTimeMillis() / 1000 + expires;\n        return privateDownloadUrlWithDeadline(baseUrl, deadline);\n    }\n\n    String privateDownloadUrlWithDeadline(String baseUrl, long deadline) {\n        StringBuilder b = new StringBuilder();\n        b.append(baseUrl);\n        int pos = baseUrl.indexOf(\"?\");\n        if (pos > 0) {\n            b.append(\"&e=\");\n        } else {\n            b.append(\"?e=\");\n        }\n        b.append(deadline);\n        String token = sign(StringUtils.utf8Bytes(b.toString()));\n        b.append(\"&token=\");\n        b.append(token);\n        return b.toString();\n    }\n\n    /**\n     * scope = bucket\n     * 一般情况下可通过此方法获取token\n     *\n     * @param bucket 空间名\n     * @return 生成的上传token\n     */\n    public String uploadToken(String bucket) {\n        return uploadToken(bucket, null, 3600, null, true);\n    }\n\n    /**\n     * scope = bucket:key\n     * 同名文件覆盖操作、只能上传指定key的文件可以可通过此方法获取token\n     *\n     * @param bucket 空间名\n     * @param key    key，可为 null\n     * @return 生成的上传token\n     */\n    public String uploadToken(String bucket, String key) {\n        return uploadToken(bucket, key, 3600, null, true);\n    }\n\n    /**\n     * 生成上传token\n     *\n     * @param bucket  空间名\n     * @param key     key，可为 null\n     * @param expires 有效时长，单位秒\n     * @param policy  上传策略的其它参数，如 new StringMap().put(\"endUser\", \"uid\").putNotEmpty(\"returnBody\", \"\")。\n     *                scope通过 bucket、key间接设置，deadline 通过 expires 间接设置\n     * @return 生成的上传token\n     */\n    public String uploadToken(String bucket, String key, long expires, StringMap policy) {\n        return uploadToken(bucket, key, expires, policy, true);\n    }\n\n    /**\n     * 生成上传token\n     *\n     * @param bucket  空间名\n     * @param key     key，可为 null\n     * @param expires 有效时长，单位秒。默认3600s\n     * @param policy  上传策略的其它参数，如 new StringMap().put(\"endUser\", \"uid\").putNotEmpty(\"returnBody\", \"\")。\n     *                scope通过 bucket、key间接设置，deadline 通过 expires 间接设置\n     * @param strict  是否去除非限定的策略字段，默认true\n     * @return 生成的上传token\n     */\n    public String uploadToken(String bucket, String key, long expires, StringMap policy, boolean strict) {\n        long deadline = System.currentTimeMillis() / 1000 + expires;\n        return uploadTokenWithDeadline(bucket, key, deadline, policy, strict);\n    }\n\n    public String uploadTokenWithDeadline(String bucket, String key, long deadline, StringMap policy, boolean strict) {\n        // TODO   UpHosts Global\n        String scope = bucket;\n        if (key != null) {\n            scope = bucket + \":\" + key;\n        }\n        StringMap x = new StringMap();\n        copyPolicy(x, policy, strict);\n        x.put(\"scope\", scope);\n        x.put(\"deadline\", deadline);\n\n        String s = Json.encode(x);\n        return signWithData(StringUtils.utf8Bytes(s));\n    }\n\n    public String uploadTokenWithPolicy(Object obj) {\n        String s = Json.encode(obj);\n        return signWithData(StringUtils.utf8Bytes(s));\n    }\n\n    public StringMap authorization(String url, byte[] body, String contentType) {\n        String authorization = \"QBox \" + signRequest(url, body, contentType);\n        return new StringMap().put(\"Authorization\", authorization);\n    }\n\n    public StringMap authorization(String url) {\n        return authorization(url, null, null);\n    }\n\n    /**\n     * 生成HTTP请求签名字符串\n     *\n     * @param urlString\n     * @param body\n     * @param contentType\n     * @return\n     */\n    public String signRequestV2(String urlString, String method, byte[] body, String contentType) {\n        URI uri = URI.create(urlString);\n\n        Mac mac = createMac();\n        StringBuilder sb = new StringBuilder();\n\n        sb.append(String.format(\"%s %s\", method, uri.getPath()));\n        if (uri.getQuery() != null) {\n            sb.append(String.format(\"?%s\", uri.getQuery()));\n        }\n\n        sb.append(String.format(\"\\nHost: %s\", uri.getHost()));\n        if (uri.getPort() > 0) {\n            sb.append(String.format(\":%d\", uri.getPort()));\n        }\n\n        if (contentType != null) {\n            sb.append(String.format(\"\\nContent-Type: %s\", contentType));\n        }\n\n        // body\n        sb.append(\"\\n\\n\");\n        if (body != null && body.length > 0 && !StringUtils.isNullOrEmpty(contentType)) {\n            if (contentType.equals(Client.FormMime)\n                    || contentType.equals(Client.JsonMime)) {\n                sb.append(new String(body));\n            }\n        }\n\n        System.out.println(sb.toString());\n        mac.update(StringUtils.utf8Bytes(sb.toString()));\n\n        String digest = UrlSafeBase64.encodeToString(mac.doFinal());\n\n        return this.accessKey + \":\" + digest;\n    }\n\n    public StringMap authorizationV2(String url, String method, byte[] body, String contentType) {\n        String authorization = \"Qiniu \" + signRequestV2(url, method, body, contentType);\n        return new StringMap().put(\"Authorization\", authorization);\n    }\n\n    public StringMap authorizationV2(String url) {\n        return authorizationV2(url, \"GET\", null, null);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/Base64.java",
    "content": "// CHECKSTYLE:OFF\n/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.camera.lingxiao.common.oss;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * Utilities for encoding and decoding the Base64 representation of\n * binary data.  See RFCs <a\n * href=\"http://www.ietf.org/rfc/rfc2045.txt\">2045</a> and <a\n * href=\"http://www.ietf.org/rfc/rfc3548.txt\">3548</a>.\n */\npublic final class Base64 {\n    /**\n     * Default values for encoder/decoder flags.\n     */\n    public static final int DEFAULT = 0;\n\n    /**\n     * Encoder flag bit to omit the padding '=' characters at the end\n     * of the output (if any).\n     */\n    public static final int NO_PADDING = 1;\n\n    /**\n     * Encoder flag bit to omit all line terminators (i.e., the output\n     * will be on one long line).\n     */\n    public static final int NO_WRAP = 2;\n\n    /**\n     * Encoder flag bit to indicate lines should be terminated with a\n     * CRLF pair instead of just an LF.  Has no effect if {@code\n     * NO_WRAP} is specified as well.\n     */\n    public static final int CRLF = 4;\n\n    /**\n     * Encoder/decoder flag bit to indicate using the \"URL and\n     * filename safe\" variant of Base64 (see RFC 3548 section 4) where\n     * {@code -} and {@code _} are used in place of {@code +} and\n     * {@code /}.\n     */\n    public static final int URL_SAFE = 8;\n\n    /**\n     * Flag to pass to indicate that it\n     * should not close the output stream it is wrapping when it\n     * itself is closed.\n     */\n    public static final int NO_CLOSE = 16;\n\n    //  --------------------------------------------------------\n    //  shared code\n    //  --------------------------------------------------------\n\n    private Base64() {\n    }   // don't instantiate\n\n    //  --------------------------------------------------------\n    //  decoding\n    //  --------------------------------------------------------\n\n    /**\n     * Decode the Base64-encoded data in input and return the data in\n     * a new byte array.\n     * <p/>\n     * <p>The padding '=' characters at the end are considered optional, but\n     * if any are present, there must be the correct number of them.\n     *\n     * @param str   the input String to decode, which is converted to\n     *              bytes using the default charset\n     * @param flags controls certain features of the decoded output.\n     *              Pass {@code DEFAULT} to decode standard Base64.\n     * @throws IllegalArgumentException if the input contains\n     *                                  incorrect padding\n     */\n    public static byte[] decode(String str, int flags) {\n        return decode(str.getBytes(), flags);\n    }\n\n    /**\n     * Decode the Base64-encoded data in input and return the data in\n     * a new byte array.\n     * <p/>\n     * <p>The padding '=' characters at the end are considered optional, but\n     * if any are present, there must be the correct number of them.\n     *\n     * @param input the input array to decode\n     * @param flags controls certain features of the decoded output.\n     *              Pass {@code DEFAULT} to decode standard Base64.\n     * @throws IllegalArgumentException if the input contains\n     *                                  incorrect padding\n     */\n    public static byte[] decode(byte[] input, int flags) {\n        return decode(input, 0, input.length, flags);\n    }\n\n    /**\n     * Decode the Base64-encoded data in input and return the data in\n     * a new byte array.\n     * <p/>\n     * <p>The padding '=' characters at the end are considered optional, but\n     * if any are present, there must be the correct number of them.\n     *\n     * @param input  the data to decode\n     * @param offset the position within the input array at which to start\n     * @param len    the number of bytes of input to decode\n     * @param flags  controls certain features of the decoded output.\n     *               Pass {@code DEFAULT} to decode standard Base64.\n     * @throws IllegalArgumentException if the input contains\n     *                                  incorrect padding\n     */\n    public static byte[] decode(byte[] input, int offset, int len, int flags) {\n        // Allocate space for the most data the input could represent.\n        // (It could contain less if it contains whitespace, etc.)\n        Decoder decoder = new Decoder(flags, new byte[len * 3 / 4]);\n\n        if (!decoder.process(input, offset, len, true)) {\n            throw new IllegalArgumentException(\"bad base-64\");\n        }\n\n        // Maybe we got lucky and allocated exactly enough output space.\n        if (decoder.op == decoder.output.length) {\n            return decoder.output;\n        }\n\n        // Need to shorten the array, so allocate a new one of the\n        // right size and copy.\n        byte[] temp = new byte[decoder.op];\n        System.arraycopy(decoder.output, 0, temp, 0, decoder.op);\n        return temp;\n    }\n\n    /**\n     * Base64-encode the given data and return a newly allocated\n     * String with the result.\n     *\n     * @param input the data to encode\n     * @param flags controls certain features of the encoded output.\n     *              Passing {@code DEFAULT} results in output that\n     *              adheres to RFC 2045.\n     */\n    public static String encodeToString(byte[] input, int flags) {\n        try {\n            return new String(encode(input, flags), \"US-ASCII\");\n        } catch (UnsupportedEncodingException e) {\n            // US-ASCII is guaranteed to be available.\n            throw new AssertionError(e);\n        }\n    }\n\n    //  --------------------------------------------------------\n    //  encoding\n    //  --------------------------------------------------------\n\n    /**\n     * Base64-encode the given data and return a newly allocated\n     * String with the result.\n     *\n     * @param input  the data to encode\n     * @param offset the position within the input array at which to\n     *               start\n     * @param len    the number of bytes of input to encode\n     * @param flags  controls certain features of the encoded output.\n     *               Passing {@code DEFAULT} results in output that\n     *               adheres to RFC 2045.\n     */\n    public static String encodeToString(byte[] input, int offset, int len, int flags) {\n        try {\n            return new String(encode(input, offset, len, flags), \"US-ASCII\");\n        } catch (UnsupportedEncodingException e) {\n            // US-ASCII is guaranteed to be available.\n            throw new AssertionError(e);\n        }\n    }\n\n    /**\n     * Base64-encode the given data and return a newly allocated\n     * byte[] with the result.\n     *\n     * @param input the data to encode\n     * @param flags controls certain features of the encoded output.\n     *              Passing {@code DEFAULT} results in output that\n     *              adheres to RFC 2045.\n     */\n    public static byte[] encode(byte[] input, int flags) {\n        return encode(input, 0, input.length, flags);\n    }\n\n    /**\n     * Base64-encode the given data and return a newly allocated\n     * byte[] with the result.\n     *\n     * @param input  the data to encode\n     * @param offset the position within the input array at which to\n     *               start\n     * @param len    the number of bytes of input to encode\n     * @param flags  controls certain features of the encoded output.\n     *               Passing {@code DEFAULT} results in output that\n     *               adheres to RFC 2045.\n     */\n    public static byte[] encode(byte[] input, int offset, int len, int flags) {\n        Encoder encoder = new Encoder(flags, null);\n\n        // Compute the exact length of the array we will produce.\n        int output_len = len / 3 * 4;\n\n        // Account for the tail of the data and the padding bytes, if any.\n        if (encoder.do_padding) {\n            if (len % 3 > 0) {\n                output_len += 4;\n            }\n        } else {\n            switch (len % 3) {\n                case 0:\n                    break;\n                case 1:\n                    output_len += 2;\n                    break;\n                case 2:\n                    output_len += 3;\n                    break;\n            }\n        }\n\n        // Account for the newlines, if any.\n        if (encoder.do_newline && len > 0) {\n            output_len += (((len - 1) / (3 * Encoder.LINE_GROUPS)) + 1) *\n                    (encoder.do_cr ? 2 : 1);\n        }\n\n        encoder.output = new byte[output_len];\n        encoder.process(input, offset, len, true);\n\n        assert encoder.op == output_len;\n\n        return encoder.output;\n    }\n\n    /* package */ static abstract class Coder {\n        public byte[] output;\n        public int op;\n\n        /**\n         * Encode/decode another block of input data.  this.output is\n         * provided by the caller, and must be big enough to hold all\n         * the coded data.  On exit, this.opwill be set to the length\n         * of the coded data.\n         *\n         * @param finish true if this is the final call to process for\n         *               this object.  Will finalize the coder state and\n         *               include any final bytes in the output.\n         * @return true if the input so far is good; false if some\n         * error has been detected in the input stream..\n         */\n        public abstract boolean process(byte[] input, int offset, int len, boolean finish);\n\n        /**\n         * @return the maximum number of bytes a call to process()\n         * could produce for the given number of input bytes.  This may\n         * be an overestimate.\n         */\n        public abstract int maxOutputSize(int len);\n    }\n\n    /* package */ static class Decoder extends Coder {\n        /**\n         * Lookup table for turning bytes into their position in the\n         * Base64 alphabet.\n         */\n        private static final int DECODE[] = {\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,\n                52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1,\n                -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n                15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,\n                -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n                41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n        };\n\n        /**\n         * Decode lookup table for the \"web safe\" variant (RFC 3548\n         * sec. 4) where - and _ replace + and /.\n         */\n        private static final int DECODE_WEBSAFE[] = {\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1,\n                52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1,\n                -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n                15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,\n                -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n                41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n        };\n\n        /**\n         * Non-data values in the DECODE arrays.\n         */\n        private static final int SKIP = -1;\n        private static final int EQUALS = -2;\n        final private int[] alphabet;\n        /**\n         * States 0-3 are reading through the next input tuple.\n         * State 4 is having read one '=' and expecting exactly\n         * one more.\n         * State 5 is expecting no more data or padding characters\n         * in the input.\n         * State 6 is the error state; an error has been detected\n         * in the input and no future input can \"fix\" it.\n         */\n        private int state;   // state number (0 to 6)\n        private int value;\n\n        public Decoder(int flags, byte[] output) {\n            this.output = output;\n\n            alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE;\n            state = 0;\n            value = 0;\n        }\n\n        /**\n         * @return an overestimate for the number of bytes {@code\n         * len} bytes could decode to.\n         */\n        public int maxOutputSize(int len) {\n            return len * 3 / 4 + 10;\n        }\n\n        /**\n         * Decode another block of input data.\n         *\n         * @return true if the state machine is still healthy.  false if\n         * bad base-64 data has been detected in the input stream.\n         */\n        public boolean process(byte[] input, int offset, int len, boolean finish) {\n            if (this.state == 6) return false;\n\n            int p = offset;\n            len += offset;\n\n            // Using local variables makes the decoder about 12%\n            // faster than if we manipulate the member variables in\n            // the loop.  (Even alphabet makes a measurable\n            // difference, which is somewhat surprising to me since\n            // the member variable is final.)\n            int state = this.state;\n            int value = this.value;\n            int op = 0;\n            final byte[] output = this.output;\n            final int[] alphabet = this.alphabet;\n\n            while (p < len) {\n                // Try the fast path:  we're starting a new tuple and the\n                // next four bytes of the input stream are all data\n                // bytes.  This corresponds to going through states\n                // 0-1-2-3-0.  We expect to use this method for most of\n                // the data.\n                //\n                // If any of the next four bytes of input are non-data\n                // (whitespace, etc.), value will end up negative.  (All\n                // the non-data values in decode are small negative\n                // numbers, so shifting any of them up and or'ing them\n                // together will result in a value with its top bit set.)\n                //\n                // You can remove this whole block and the output should\n                // be the same, just slower.\n                if (state == 0) {\n                    while (p + 4 <= len &&\n                            (value = ((alphabet[input[p] & 0xff] << 18) |\n                                    (alphabet[input[p + 1] & 0xff] << 12) |\n                                    (alphabet[input[p + 2] & 0xff] << 6) |\n                                    (alphabet[input[p + 3] & 0xff]))) >= 0) {\n                        output[op + 2] = (byte) value;\n                        output[op + 1] = (byte) (value >> 8);\n                        output[op] = (byte) (value >> 16);\n                        op += 3;\n                        p += 4;\n                    }\n                    if (p >= len) break;\n                }\n\n                // The fast path isn't available -- either we've read a\n                // partial tuple, or the next four input bytes aren't all\n                // data, or whatever.  Fall back to the slower state\n                // machine implementation.\n\n                int d = alphabet[input[p++] & 0xff];\n\n                switch (state) {\n                    case 0:\n                        if (d >= 0) {\n                            value = d;\n                            ++state;\n                        } else if (d != SKIP) {\n                            this.state = 6;\n                            return false;\n                        }\n                        break;\n\n                    case 1:\n                        if (d >= 0) {\n                            value = (value << 6) | d;\n                            ++state;\n                        } else if (d != SKIP) {\n                            this.state = 6;\n                            return false;\n                        }\n                        break;\n\n                    case 2:\n                        if (d >= 0) {\n                            value = (value << 6) | d;\n                            ++state;\n                        } else if (d == EQUALS) {\n                            // Emit the last (partial) output tuple;\n                            // expect exactly one more padding character.\n                            output[op++] = (byte) (value >> 4);\n                            state = 4;\n                        } else if (d != SKIP) {\n                            this.state = 6;\n                            return false;\n                        }\n                        break;\n\n                    case 3:\n                        if (d >= 0) {\n                            // Emit the output triple and return to state 0.\n                            value = (value << 6) | d;\n                            output[op + 2] = (byte) value;\n                            output[op + 1] = (byte) (value >> 8);\n                            output[op] = (byte) (value >> 16);\n                            op += 3;\n                            state = 0;\n                        } else if (d == EQUALS) {\n                            // Emit the last (partial) output tuple;\n                            // expect no further data or padding characters.\n                            output[op + 1] = (byte) (value >> 2);\n                            output[op] = (byte) (value >> 10);\n                            op += 2;\n                            state = 5;\n                        } else if (d != SKIP) {\n                            this.state = 6;\n                            return false;\n                        }\n                        break;\n\n                    case 4:\n                        if (d == EQUALS) {\n                            ++state;\n                        } else if (d != SKIP) {\n                            this.state = 6;\n                            return false;\n                        }\n                        break;\n\n                    case 5:\n                        if (d != SKIP) {\n                            this.state = 6;\n                            return false;\n                        }\n                        break;\n                }\n            }\n\n            if (!finish) {\n                // We're out of input, but a future call could provide\n                // more.\n                this.state = state;\n                this.value = value;\n                this.op = op;\n                return true;\n            }\n\n            // Done reading input.  Now figure out where we are left in\n            // the state machine and finish up.\n\n            switch (state) {\n                case 0:\n                    // Output length is a multiple of three.  Fine.\n                    break;\n                case 1:\n                    // Read one extra input byte, which isn't enough to\n                    // make another output byte.  Illegal.\n                    this.state = 6;\n                    return false;\n                case 2:\n                    // Read two extra input bytes, enough to emit 1 more\n                    // output byte.  Fine.\n                    output[op++] = (byte) (value >> 4);\n                    break;\n                case 3:\n                    // Read three extra input bytes, enough to emit 2 more\n                    // output bytes.  Fine.\n                    output[op++] = (byte) (value >> 10);\n                    output[op++] = (byte) (value >> 2);\n                    break;\n                case 4:\n                    // Read one padding '=' when we expected 2.  Illegal.\n                    this.state = 6;\n                    return false;\n                case 5:\n                    // Read all the padding '='s we expected and no more.\n                    // Fine.\n                    break;\n            }\n\n            this.state = state;\n            this.op = op;\n            return true;\n        }\n    }\n\n    /* package */ static class Encoder extends Coder {\n        /**\n         * Emit a new line every this many output tuples.  Corresponds to\n         * a 76-character line length (the maximum allowable according to\n         * <a href=\"http://www.ietf.org/rfc/rfc2045.txt\">RFC 2045</a>).\n         */\n        public static final int LINE_GROUPS = 19;\n\n        /**\n         * Lookup table for turning Base64 alphabet positions (6 bits)\n         * into output bytes.\n         */\n        private static final byte ENCODE[] = {\n                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',\n                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',\n                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n                'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',\n        };\n\n        /**\n         * Lookup table for turning Base64 alphabet positions (6 bits)\n         * into output bytes.\n         */\n        private static final byte ENCODE_WEBSAFE[] = {\n                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',\n                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',\n                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n                'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_',\n        };\n        final public boolean do_padding;\n        final public boolean do_newline;\n        final public boolean do_cr;\n        final private byte[] tail;\n        final private byte[] alphabet;\n        /* package */ int tailLen;\n        private int count;\n\n        public Encoder(int flags, byte[] output) {\n            this.output = output;\n\n            do_padding = (flags & NO_PADDING) == 0;\n            do_newline = (flags & NO_WRAP) == 0;\n            do_cr = (flags & CRLF) != 0;\n            alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE;\n\n            tail = new byte[2];\n            tailLen = 0;\n\n            count = do_newline ? LINE_GROUPS : -1;\n        }\n\n        /**\n         * @return an overestimate for the number of bytes {@code\n         * len} bytes could encode to.\n         */\n        public int maxOutputSize(int len) {\n            return len * 8 / 5 + 10;\n        }\n\n        public boolean process(byte[] input, int offset, int len, boolean finish) {\n            // Using local variables makes the encoder about 9% faster.\n            final byte[] alphabet = this.alphabet;\n            final byte[] output = this.output;\n            int op = 0;\n            int count = this.count;\n\n            int p = offset;\n            len += offset;\n            int v = -1;\n\n            // First we need to concatenate the tail of the previous call\n            // with any input bytes available now and see if we can empty\n            // the tail.\n\n            switch (tailLen) {\n                case 0:\n                    // There was no tail.\n                    break;\n\n                case 1:\n                    if (p + 2 <= len) {\n                        // A 1-byte tail with at least 2 bytes of\n                        // input available now.\n                        v = ((tail[0] & 0xff) << 16) |\n                                ((input[p++] & 0xff) << 8) |\n                                (input[p++] & 0xff);\n                        tailLen = 0;\n                    }\n                    ;\n                    break;\n\n                case 2:\n                    if (p + 1 <= len) {\n                        // A 2-byte tail with at least 1 byte of input.\n                        v = ((tail[0] & 0xff) << 16) |\n                                ((tail[1] & 0xff) << 8) |\n                                (input[p++] & 0xff);\n                        tailLen = 0;\n                    }\n                    break;\n            }\n\n            if (v != -1) {\n                output[op++] = alphabet[(v >> 18) & 0x3f];\n                output[op++] = alphabet[(v >> 12) & 0x3f];\n                output[op++] = alphabet[(v >> 6) & 0x3f];\n                output[op++] = alphabet[v & 0x3f];\n                if (--count == 0) {\n                    if (do_cr) output[op++] = '\\r';\n                    output[op++] = '\\n';\n                    count = LINE_GROUPS;\n                }\n            }\n\n            // At this point either there is no tail, or there are fewer\n            // than 3 bytes of input available.\n\n            // The main loop, turning 3 input bytes into 4 output bytes on\n            // each iteration.\n            while (p + 3 <= len) {\n                v = ((input[p] & 0xff) << 16) |\n                        ((input[p + 1] & 0xff) << 8) |\n                        (input[p + 2] & 0xff);\n                output[op] = alphabet[(v >> 18) & 0x3f];\n                output[op + 1] = alphabet[(v >> 12) & 0x3f];\n                output[op + 2] = alphabet[(v >> 6) & 0x3f];\n                output[op + 3] = alphabet[v & 0x3f];\n                p += 3;\n                op += 4;\n                if (--count == 0) {\n                    if (do_cr) output[op++] = '\\r';\n                    output[op++] = '\\n';\n                    count = LINE_GROUPS;\n                }\n            }\n\n            if (finish) {\n                // Finish up the tail of the input.  Note that we need to\n                // consume any bytes in tail before any bytes\n                // remaining in input; there should be at most two bytes\n                // total.\n\n                if (p - tailLen == len - 1) {\n                    int t = 0;\n                    v = ((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 4;\n                    tailLen -= t;\n                    output[op++] = alphabet[(v >> 6) & 0x3f];\n                    output[op++] = alphabet[v & 0x3f];\n                    if (do_padding) {\n                        output[op++] = '=';\n                        output[op++] = '=';\n                    }\n                    if (do_newline) {\n                        if (do_cr) output[op++] = '\\r';\n                        output[op++] = '\\n';\n                    }\n                } else if (p - tailLen == len - 2) {\n                    int t = 0;\n                    v = (((tailLen > 1 ? tail[t++] : input[p++]) & 0xff) << 10) |\n                            (((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 2);\n                    tailLen -= t;\n                    output[op++] = alphabet[(v >> 12) & 0x3f];\n                    output[op++] = alphabet[(v >> 6) & 0x3f];\n                    output[op++] = alphabet[v & 0x3f];\n                    if (do_padding) {\n                        output[op++] = '=';\n                    }\n                    if (do_newline) {\n                        if (do_cr) output[op++] = '\\r';\n                        output[op++] = '\\n';\n                    }\n                } else if (do_newline && op > 0 && count != LINE_GROUPS) {\n                    if (do_cr) output[op++] = '\\r';\n                    output[op++] = '\\n';\n                }\n\n                assert tailLen == 0;\n                assert p == len;\n            } else {\n                // Save the leftovers in tail to be consumed on the next\n                // call to encodeInternal.\n\n                if (p == len - 1) {\n                    tail[tailLen++] = input[p];\n                } else if (p == len - 2) {\n                    tail[tailLen++] = input[p];\n                    tail[tailLen++] = input[p + 1];\n                }\n            }\n\n            this.op = op;\n            this.count = count;\n\n            return true;\n        }\n    }\n}\n// CHECKSTYLE:ON\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/Constants.java",
    "content": "package com.camera.lingxiao.common.oss;\n\nimport java.nio.charset.Charset;\n\n/**\n * SDK相关配置常量\n */\npublic final class Constants {\n    /**\n     * 版本号\n     */\n    public static final String VERSION = \"7.2.7\";\n    /**\n     * 块大小，不能改变\n     */\n    public static final int BLOCK_SIZE = 4 * 1024 * 1024;\n    /**\n     * 所有都是UTF-8编码\n     */\n    public static final Charset UTF_8 = Charset.forName(\"UTF-8\");\n    /**\n     * 连接超时时间 单位秒(默认10s)\n     */\n    public static final int CONNECT_TIMEOUT = 10;\n    /**\n     * 写超时时间 单位秒(默认 0 , 不超时)\n     */\n    public static final int WRITE_TIMEOUT = 0;\n    /**\n     * 回复超时时间 单位秒(默认30s)\n     */\n    public static final int READ_TIMEOUT = 30;\n    /**\n     * 底层HTTP库所有的并发执行的请求数量\n     */\n    public static final int DISPATCHER_MAX_REQUESTS = 64;\n    /**\n     * 底层HTTP库对每个独立的Host进行并发请求的数量\n     */\n    public static final int DISPATCHER_MAX_REQUESTS_PER_HOST = 16;\n    /**\n     * 底层HTTP库中复用连接对象的最大空闲数量\n     */\n    public static final int CONNECTION_POOL_MAX_IDLE_COUNT = 32;\n    /**\n     * 底层HTTP库中复用连接对象的回收周期（单位分钟）\n     */\n    public static final int CONNECTION_POOL_MAX_IDLE_MINUTES = 5;\n\n    private Constants() {\n    }\n}\n\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/Etag.java",
    "content": "package com.camera.lingxiao.common.oss;\n\n\nimport java.io.ByteArrayInputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\n/**\n * 计算文件内容或者二进制数据的etag, etag算法是七牛用来标志数据唯一性的算法。\n * 文档：<a href=\"https://github.com/qiniu/qetag\">etag算法</a>\n */\npublic final class Etag {\n\n    private Etag() {\n    }\n\n    /**\n     * 计算二进制数据的etag\n     *\n     * @param data   二进制数据\n     * @param offset 起始字节索引\n     * @param length 需要计算的字节长度\n     * @return 二进制数据的etag\n     */\n    public static String data(byte[] data, int offset, int length) {\n        try {\n            return stream(new ByteArrayInputStream(data, offset, length), length);\n        } catch (IOException e) {\n            throw new AssertionError(e);\n        }\n    }\n\n    /**\n     * 计算二进制数据的etag\n     *\n     * @param data 二进制数据\n     * @return 二进制数据的etag\n     */\n    public static String data(byte[] data) {\n        return data(data, 0, data.length);\n    }\n\n    /**\n     * 计算文件内容的etag\n     *\n     * @param file 文件对象\n     * @return 文件内容的etag\n     * @throws IOException 文件读取异常\n     */\n    public static String file(File file) throws IOException {\n        FileInputStream fi = null;\n        try {\n            fi = new FileInputStream(file);\n            return stream(fi, file.length());\n        } finally {\n            if (fi != null) {\n                try {\n                    fi.close();\n                } catch (Throwable t) {\n                }\n            }\n        }\n\n    }\n\n    /**\n     * 计算文件内容的etag\n     *\n     * @param filePath 文件路径\n     * @return 文件内容的etag\n     * @throws IOException 文件读取异常\n     */\n    public static String file(String filePath) throws IOException {\n        File f = new File(filePath);\n        return file(f);\n    }\n\n    /**\n     * 计算输入流的etag，如果计算完毕不需要这个InputStream对象，请自行关闭流\n     *\n     * @param in  数据输入流\n     * @param len 数据流长度\n     * @return 数据流的etag值\n     * @throws IOException 文件读取异常\n     */\n    public static String stream(InputStream in, long len) throws IOException {\n        if (len == 0) {\n            return \"Fto5o-5ea0sNMlW_75VgGJCv2AcJ\";\n        }\n        byte[] buffer = new byte[64 * 1024];\n\n        byte[][] blocks = new byte[(int) ((len + Constants.BLOCK_SIZE - 1) / Constants.BLOCK_SIZE)][];\n        for (int i = 0; i < blocks.length; i++) {\n            long left = len - (long) Constants.BLOCK_SIZE * i;\n            long read = left > Constants.BLOCK_SIZE ? Constants.BLOCK_SIZE : left;\n            blocks[i] = oneBlock(buffer, in, (int) read);\n        }\n        return resultEncode(blocks);\n    }\n\n    /**\n     * 单块计算hash\n     *\n     * @param buffer 数据缓冲区\n     * @param in     输入数据\n     * @param len    输入数据长度\n     * @return 计算结果\n     * @throws IOException 读取出错\n     */\n    private static byte[] oneBlock(byte[] buffer, InputStream in, int len) throws IOException {\n        MessageDigest sha1;\n        try {\n            sha1 = MessageDigest.getInstance(\"sha-1\");\n        } catch (NoSuchAlgorithmException e) {\n            throw new AssertionError(e);\n        }\n        int buffSize = buffer.length;\n        while (len != 0) {\n            int next = buffSize > len ? len : buffSize;\n            //noinspection ResultOfMethodCallIgnored\n            in.read(buffer, 0, next);\n            sha1.update(buffer, 0, next);\n            len -= next;\n        }\n\n        return sha1.digest();\n    }\n\n    /**\n     * 合并结果\n     *\n     * @param sha1s 每块计算结果的列表\n     * @return 最终的结果\n     */\n    private static String resultEncode(byte[][] sha1s) {\n        byte head = 0x16;\n        byte[] finalHash = sha1s[0];\n        int len = finalHash.length;\n        byte[] ret = new byte[len + 1];\n        if (sha1s.length != 1) {\n            head = (byte) 0x96;\n            MessageDigest sha1;\n            try {\n                sha1 = MessageDigest.getInstance(\"sha-1\");\n            } catch (NoSuchAlgorithmException e) {\n                throw new AssertionError(e);\n            }\n            for (byte[] s : sha1s) {\n                sha1.update(s);\n            }\n            finalHash = sha1.digest();\n        }\n        ret[0] = head;\n        System.arraycopy(finalHash, 0, ret, 1, len);\n        return UrlSafeBase64.encodeToString(ret);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/Json.java",
    "content": "package com.camera.lingxiao.common.oss;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.google.gson.reflect.TypeToken;\n\nimport java.lang.reflect.Type;\nimport java.util.Map;\n\n\npublic final class Json {\n    private Json() {\n    }\n\n    public static String encode(StringMap map) {\n        return new Gson().toJson(map.map());\n    }\n\n    public static String encode(Object obj) {\n        return new GsonBuilder().serializeNulls().create().toJson(obj);\n    }\n\n    public static <T> T decode(String json, Class<T> classOfT) {\n        return new Gson().fromJson(json, classOfT);\n    }\n\n    public static StringMap decode(String json) {\n        // CHECKSTYLE:OFF\n        Type t = new TypeToken<Map<String, Object>>() {\n        }.getType();\n        // CHECKSTYLE:ON\n        Map<String, Object> x = new Gson().fromJson(json, t);\n        return new StringMap(x);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/QiNiuSdkHelper.java",
    "content": "package com.camera.lingxiao.common.oss;\n\nimport android.content.Context;\n\nimport com.camera.lingxiao.common.R;\nimport com.camera.lingxiao.common.app.ContentValue;\nimport com.camera.lingxiao.common.utills.LogUtils;\nimport com.qiniu.android.common.FixedZone;\nimport com.qiniu.android.http.ResponseInfo;\nimport com.qiniu.android.storage.Configuration;\nimport com.qiniu.android.storage.UpCompletionHandler;\nimport com.qiniu.android.storage.UploadManager;\n\nimport org.json.JSONObject;\n\npublic class QiNiuSdkHelper {\n\n    private static UploadManager uploadManager;\n    private static QiNiuSdkHelper helper;\n    public static QiNiuSdkHelper getInstance(){\n        if (helper == null){\n            helper = new QiNiuSdkHelper();\n        }\n        return helper;\n    }\n\n    private QiNiuSdkHelper(){\n        init();\n    }\n    private static void init(){\n        Configuration config = new Configuration.Builder()\n                .chunkSize(512 * 1024)        // 分片上传时，每片的大小。 默认256K\n                .putThreshhold(1024 * 1024)   // 启用分片上传阀值。默认512K\n                .connectTimeout(10)           // 链接超时。默认10秒\n                .useHttps(true)               // 是否使用https上传域名\n                .responseTimeout(60)          // 服务器响应超时。默认60秒\n                //.recorder(recorder)           // recorder分片上传时，已上传片记录器。默认null\n                //.recorder(recorder, keyGen)   // keyGen 分片上传时，生成标识符，用于片记录器区分是那个文件的上传记录\n                .zone(FixedZone.zone0)        // 设置区域，指定不同区域的上传域名、备用域名、备用IP。\n                .build();\n        // 重用uploadManager。一般地，只需要创建一个uploadManager对象\n        uploadManager = new UploadManager(config);\n    }\n\n    /**\n     * @param token  //从服务端sdk获取\n     * @param picName //指定图片名字\n     */\n    public QiNiuSdkHelper upload(String path, final String picName, String token, final Context context){\n\n        uploadManager.put(path, picName, token,\n                new UpCompletionHandler() {\n                    @Override\n                    public void complete(String key, ResponseInfo info, JSONObject res) {\n                        //res包含hash、key等信息，具体字段取决于上传策略的设置\n                        if(info.isOK()) {\n                            if (listener != null){\n                                listener.onSuccess(ContentValue.INSTANCE.getQINIU_BASE_URL() +key);\n                            }\n                            //上传成功后将key值上传到自己的服务器\n                            Auth.create(context\n                                    .getResources()\n                                    .getString(R.string.AccessKey), context\n                                    .getResources()\n                                    .getString(R.string.SecretKey))\n                                    .uploadToken(key);\n                            LogUtils.i(\"Upload Success\"+\"picName: \"+picName+\"  key：\"+key);\n                        } else {\n                            if (listener != null){\n                                listener.onFaild(\"图片上传失败\");\n                            }\n                            LogUtils.i(\"Upload Fail\");\n                            //如果失败，这里可以把info信息上报自己的服务器，便于后面分析上传错误原因\n                        }\n                        LogUtils.i( key + \",\\r\\n \" + info + \",\\r\\n \" + res);\n                    }\n                }, null);\n\n        return helper;\n        //上传进度\n        /*uploadManager.put(data, key, token,handler,\n                new UploadOptions(null, null, false,\n                        new UpProgressHandler(){\n                            public void progress(String key, double percent){\n                                Log.i(\"qiniu\", key + \": \" + percent);\n                            }\n                        }, null));*/\n\n    }\n\n    private uploadListener listener;\n    public void setUploadListener(uploadListener listener){\n        this.listener = listener;\n    }\n    public interface uploadListener{\n        void onSuccess(String url);\n        void onFaild(String msg);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/StringMap.java",
    "content": "package com.camera.lingxiao.common.oss;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic final class StringMap {\n    private Map<String, Object> map;\n\n    public StringMap() {\n        this(new HashMap<String, Object>());\n    }\n\n    public StringMap(Map<String, Object> map) {\n        this.map = map;\n    }\n\n    public StringMap put(String key, Object value) {\n        map.put(key, value);\n        return this;\n    }\n\n    public StringMap putNotEmpty(String key, String value) {\n        if (!StringUtils.isNullOrEmpty(value)) {\n            map.put(key, value);\n        }\n        return this;\n    }\n\n    public StringMap putNotNull(String key, Object value) {\n        if (value != null) {\n            map.put(key, value);\n        }\n        return this;\n    }\n\n\n    public StringMap putWhen(String key, Object val, boolean when) {\n        if (when) {\n            map.put(key, val);\n        }\n        return this;\n    }\n\n    public StringMap putAll(Map<String, Object> map) {\n        this.map.putAll(map);\n        return this;\n    }\n\n    public StringMap putAll(StringMap map) {\n        this.map.putAll(map.map);\n        return this;\n    }\n\n    public void forEach(Consumer imp) {\n        for (Map.Entry<String, Object> i : map.entrySet()) {\n            imp.accept(i.getKey(), i.getValue());\n        }\n    }\n\n    public int size() {\n        return map.size();\n    }\n\n    public Map<String, Object> map() {\n        return this.map;\n    }\n\n    public Object get(String key) {\n        return map.get(key);\n    }\n\n    public String formString() {\n        final StringBuilder b = new StringBuilder();\n        forEach(new Consumer() {\n            private boolean notStart = false;\n\n            @Override\n            public void accept(String key, Object value) {\n                if (notStart) {\n                    b.append(\"&\");\n                }\n                try {\n                    b.append(URLEncoder.encode(key, \"UTF-8\")).append('=')\n                            .append(URLEncoder.encode(value.toString(), \"UTF-8\"));\n                } catch (UnsupportedEncodingException e) {\n                    throw new AssertionError(e);\n                }\n                notStart = true;\n            }\n        });\n        return b.toString();\n    }\n\n    public interface Consumer {\n        void accept(String key, Object value);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/StringUtils.java",
    "content": "package com.camera.lingxiao.common.oss;\n\nimport com.qiniu.android.dns.util.Hex;\n\nimport java.nio.charset.Charset;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.Collection;\n\n\n\n/**\n * 字符串连接工具类\n */\npublic final class StringUtils {\n\n    private StringUtils() {\n    }\n    /**\n     * @see #join(Object[] array, String sep, String prefix)\n     */\n    public static String join(Object[] array, String sep) {\n        return join(array, sep, null);\n    }\n\n    /**\n     * @see #join(Object[] array, String sep, String prefix)\n     */\n    public static String join(Collection list, String sep) {\n        return join(list, sep, null);\n    }\n\n    /**\n     * @see #join(Object[] array, String sep, String prefix)\n     */\n    public static String join(Collection list, String sep, String prefix) {\n        Object[] array = list == null ? null : list.toArray();\n        return join(array, sep, prefix);\n    }\n\n    /**\n     * 以指定的分隔符来进行字符串元素连接\n     * <p>\n     * 例如有字符串数组array和连接符为逗号(,)\n     * <code>\n     * String[] array = new String[] { \"hello\", \"world\", \"qiniu\", \"cloud\",\"storage\" };\n     * </code>\n     * 那么得到的结果是:\n     * <code>\n     * hello,world,qiniu,cloud,storage\n     * </code>\n     * </p>\n     *\n     * @param array  需要连接的对象数组\n     * @param sep    元素连接之间的分隔符\n     * @param prefix 前缀字符串\n     * @return 连接好的新字符串\n     */\n    public static String join(Object[] array, String sep, String prefix) {\n        if (array == null) {\n            return \"\";\n        }\n\n        int arraySize = array.length;\n\n        if (arraySize == 0) {\n            return \"\";\n        }\n\n        if (sep == null) {\n            sep = \"\";\n        }\n\n        if (prefix == null) {\n            prefix = \"\";\n        }\n\n        StringBuilder buf = new StringBuilder(prefix);\n        for (int i = 0; i < arraySize; i++) {\n            if (i > 0) {\n                buf.append(sep);\n            }\n            buf.append(array[i] == null ? \"\" : array[i]);\n        }\n        return buf.toString();\n    }\n\n    /**\n     * 以json元素的方式连接字符串中元素\n     * <p>\n     * 例如有字符串数组array\n     * <code>\n     * String[] array = new String[] { \"hello\", \"world\", \"qiniu\", \"cloud\",\"storage\" };\n     * </code>\n     * 那么得到的结果是:\n     * <code>\n     * \"hello\",\"world\",\"qiniu\",\"cloud\",\"storage\"\n     * </code>\n     * </p>\n     *\n     * @param array 需要连接的字符串数组\n     * @return 以json元素方式连接好的新字符串\n     */\n    public static String jsonJoin(String[] array) {\n        int arraySize = array.length;\n        int bufSize = arraySize * (array[0].length() + 3);\n        StringBuilder buf = new StringBuilder(bufSize);\n        for (int i = 0; i < arraySize; i++) {\n            if (i > 0) {\n                buf.append(',');\n            }\n\n            buf.append('\"');\n            buf.append(array[i]);\n            buf.append('\"');\n        }\n        return buf.toString();\n    }\n\n    public static boolean isNullOrEmpty(String s) {\n        return s == null || \"\".equals(s);\n    }\n\n    public static boolean inStringArray(String s, String[] array) {\n        for (String x : array) {\n            if (x.equals(s)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    public static byte[] utf8Bytes(String data) {\n        return data.getBytes(Constants.UTF_8);\n    }\n\n    public static String utf8String(byte[] data) {\n        return new String(data, Constants.UTF_8);\n    }\n\n    public static String md5Lower(String src) throws NoSuchAlgorithmException {\n        MessageDigest digest = MessageDigest.getInstance(\"MD5\");\n        digest.update(src.getBytes(Charset.forName(\"UTF-8\")));\n        byte[] md5Bytes = digest.digest();\n        return Hex.encodeHexString(md5Bytes);\n    }\n    public static boolean isNotEmpty(String str) {\n        return ((str != null) && (str.trim().length() > 0));\n    }\n    public static boolean isEmpty(String str) {\n        return ((str == null) || (str.trim().length() == 0));\n    }\n\n    public static boolean isBlank(String str) {\n        int strLen;\n        if (str == null || (strLen = str.length()) == 0) {\n            return true;\n        }\n        for (int i = 0; i < strLen; i++) {\n            if (!Character.isWhitespace(str.charAt(i))) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/oss/UrlSafeBase64.java",
    "content": "package com.camera.lingxiao.common.oss;\n\n/**\n * URL安全的Base64编码和解码\n */\n\npublic final class UrlSafeBase64 {\n\n    private UrlSafeBase64() {\n    }   // don't instantiate\n\n    /**\n     * 编码字符串\n     *\n     * @param data 待编码字符串\n     * @return 结果字符串\n     */\n    public static String encodeToString(String data) {\n\n        return encodeToString(data.getBytes(Constants.UTF_8));\n    }\n\n    /**\n     * 编码数据\n     *\n     * @param data 字节数组\n     * @return 结果字符串\n     */\n    public static String encodeToString(byte[] data) {\n        return Base64.encodeToString(data, Base64.URL_SAFE | Base64.NO_WRAP);\n    }\n\n    /**\n     * 解码数据\n     *\n     * @param data 编码过的字符串\n     * @return 原始数据\n     */\n    public static byte[] decode(String data) {\n        return Base64.decode(data, Base64.URL_SAFE | Base64.NO_WRAP);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/rxbus/RxBus.java",
    "content": "package com.camera.lingxiao.common.rxbus;\n\nimport java.util.HashMap;\nimport java.util.List;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.annotations.NonNull;\nimport io.reactivex.disposables.CompositeDisposable;\nimport io.reactivex.disposables.Disposable;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.schedulers.Schedulers;\nimport io.reactivex.subjects.PublishSubject;\nimport io.reactivex.subjects.Subject;\n\npublic class RxBus {\n    private final Subject<Object> mBus;\n    private static  volatile RxBus instance;\n    /**\n     * 默认私有化构造函数\n     * 当前这个地方没有进行背压\n     * 背压：http://flyou.ren/2017/04/05/%E5%85%B3%E4%BA%8ERxJava%E8%83%8C%E5%8E%8B/?utm_source=tuicool&utm_medium=referral\n     */\n    private RxBus() {\n        mBus = PublishSubject.create().toSerialized();\n    }\n\n    /**\n     * 单例模式\n     */\n    public static RxBus getInstance() {\n        if (instance == null) {\n            synchronized (RxBus.class) {\n                if (instance == null) {\n                    instance = new RxBus();\n                }\n            }\n        }\n        return instance;\n    }\n\n    /**\n     * 将数据添加到订阅\n     * 这个地方是再添加订阅的地方。最好创建一个新的类用于数据的传递\n     */\n    public void post(@NonNull Object obj) {\n        if (mBus.hasObservers()) {//判断当前是否已经添加订阅\n            mBus.onNext(obj);\n        }\n    }\n    /**这个是传递集合如果有需要的话你也可以进行更改*/\n    public void post(@NonNull List<Object> obj) {\n        if (mBus.hasObservers()) {//判断当前是否已经添加订阅\n            mBus.onNext(obj);\n        }\n    }\n    /**\n     * 注册，传递tClass的时候最好创建一个封装的类。这对数据的传递作用\n     * 新更改仅仅抛出生成类和解析\n     */\n    public <T> Disposable register(Class<T> tClass, Consumer<T> consumer) {\n        return mBus.ofType(tClass)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(consumer);\n    }\n\n\n\n    /**\n     * 确定接收消息的类型\n     * @param aClass\n     * @param <T>\n     * @return\n     * 下面为背压使用方式\n     */\n/*    public <T> Flowable<T> toFlowable(Class<T> aClass) {\n        return mBus.ofType(aClass);\n    }*/\n\n    /**\n     * 保存订阅后的disposable\n     * @param o\n     * @param disposable\n     */\n    private HashMap<String, CompositeDisposable> mSubscriptionMap;\n    public void addSubscription(Object o, Disposable disposable) {\n        if (mSubscriptionMap == null) {\n            mSubscriptionMap = new HashMap<>();\n        }\n        String key = o.getClass().getName();\n        if (mSubscriptionMap.get(key) != null) {\n            mSubscriptionMap.get(key).add(disposable);\n        } else {\n            //一次性容器,可以持有多个并提供 添加和移除。\n            CompositeDisposable disposables = new CompositeDisposable();\n            disposables.add(disposable);\n            mSubscriptionMap.put(key, disposables);\n        }\n    }\n\n    /**\n     * 取消订阅\n     * @param o 这个是你添加到订阅的的对象\n     */\n    public void unSubscribe(Object o) {\n        if (mSubscriptionMap == null) {\n            return;\n        }\n\n        String key = o.getClass().getName();\n        if (!mSubscriptionMap.containsKey(key)){\n            return;\n        }\n        if (mSubscriptionMap.get(key) != null) {\n            mSubscriptionMap.get(key).dispose();\n        }\n\n        mSubscriptionMap.remove(key);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/rxbus/SkinChangedEvent.kt",
    "content": "package com.camera.lingxiao.common.rxbus\n\nclass SkinChangedEvent(var color: Int)\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/BitmapUtil.kt",
    "content": "package com.camera.lingxiao.common.utills\n\nimport android.content.ContentResolver\nimport android.content.Context\nimport android.content.res.Resources\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.graphics.Matrix\nimport android.graphics.Rect\nimport android.media.ExifInterface\nimport android.net.Uri\nimport android.renderscript.Allocation\nimport android.renderscript.Element\nimport android.renderscript.RenderScript\nimport android.renderscript.ScriptIntrinsicBlur\nimport java.io.BufferedOutputStream\nimport java.io.ByteArrayInputStream\nimport java.io.ByteArrayOutputStream\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.io.IOException\n\n/**\n * Created by lingxiao on 2017/9/18.\n */\n\nclass BitmapUtil {\n\n    /**\n     * 获取本地图片\n     */\n    private fun getLocationImgFile(path: String): Bitmap {\n        //图片长宽缩小1/2倍\n        //Bitmap bitmap = BitmapFactory.decodeFile(mFilePath, getBitmapOption(2));\n        return BitmapFactory.decodeFile(path)\n    }\n\n    private fun getBitmapOption(inSampleSize: Int): BitmapFactory.Options {\n        System.gc()\n        val options = BitmapFactory.Options()\n        options.inPurgeable = true\n        options.inSampleSize = inSampleSize\n        return options\n    }\n\n    companion object {\n        /**\n         * @description 计算图片的压缩比率\n         *\n         * @param options 参数\n         * @param reqWidth 目标的宽度\n         * @param reqHeight 目标的高度\n         * @return\n         */\n        private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {\n            // 源图片的高度和宽度\n            val height = options.outHeight\n            val width = options.outWidth\n            var inSampleSize = 1\n            if (height > reqHeight || width > reqWidth) {\n                val halfHeight = height / 2\n                val halfWidth = width / 2\n                // Calculate the largest inSampleSize value that is a power of 2 and keeps both\n                // height and width larger than the requested height and width.\n                while (halfHeight / inSampleSize > reqHeight && halfWidth / inSampleSize > reqWidth) {\n                    inSampleSize *= 2\n                }\n            }\n            return inSampleSize\n        }\n\n        /**\n         * @description 通过传入的bitmap，进行压缩，得到符合标准的bitmap\n         *\n         * @param src\n         * @param dstWidth\n         * @param dstHeight\n         * @return\n         */\n        private fun createScaleBitmap(src: Bitmap?, dstWidth: Int, dstHeight: Int, inSampleSize: Int): Bitmap? {\n            if (null == src) {\n                return null\n            }\n            if (dstWidth < 0 || dstHeight < 0) {\n                return null\n            }\n            // 如果是放大图片，filter决定是否平滑，如果是缩小图片，filter无影响，我们这里是缩小图片，所以直接设置为false\n            val dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false)\n            if (src != dst) { // 如果没有缩放，那么不回收\n                src.recycle() // 释放Bitmap的native像素数组\n            }\n            return dst\n        }\n\n        /**\n         * @description 从Resources中加载图片\n         *\n         * @param res\n         * @param resId\n         * @param reqWidth\n         * @param reqHeight\n         * @return\n         */\n        fun decodeSampledBitmapFromResource(res: Resources, resId: Int, reqWidth: Int, reqHeight: Int): Bitmap? {\n            val options = BitmapFactory.Options()\n            options.inJustDecodeBounds = true // 设置成了true,不占用内存，只获取bitmap宽高\n            BitmapFactory.decodeResource(res, resId, options) // 读取图片长宽，目的是得到图片的宽高\n            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight) // 调用上面定义的方法计算inSampleSize值\n            // 使用获取到的inSampleSize值再次解析图片\n            options.inJustDecodeBounds = false\n            val src = BitmapFactory.decodeResource(res, resId, options) // 载入一个稍大的缩略图\n            return createScaleBitmap(src, reqWidth, reqHeight, options.inSampleSize) // 通过得到的bitmap，进一步得到目标大小的缩略图\n        }\n\n        /**\n         * @description 从SD卡上加载图片\n         *\n         * @param pathName\n         * @param reqWidth\n         * @param reqHeight\n         * @return\n         */\n        fun decodeSampledBitmapFromFile(pathName: String, reqWidth: Int, reqHeight: Int): Bitmap? {\n            val options = BitmapFactory.Options()\n            options.inJustDecodeBounds = true\n            BitmapFactory.decodeFile(pathName, options)\n            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)\n            options.inJustDecodeBounds = false\n            val src = BitmapFactory.decodeFile(pathName, options)\n            return createScaleBitmap(src, reqWidth, reqHeight, options.inSampleSize)\n        }\n\n        /**\n         * 旋转图片\n         *\n         * @param angle  被旋转角度\n         * @param bitmap 图片对象\n         * @return 旋转后的图片\n         */\n        fun rotaingBitmap(angle: Int, bitmap: Bitmap?): Bitmap {\n            var bitmap = bitmap\n            //bitmap = small(bitmap);   不缩放\n            var returnBm: Bitmap? = null\n            // 根据旋转角度，生成旋转矩阵\n            val matrix = Matrix()\n            matrix.postRotate(angle.toFloat())\n            // 将原始图片按照旋转矩阵进行旋转，并得到新的图片\n            returnBm = Bitmap.createBitmap(\n                bitmap!!, 0, 0,\n                bitmap.width,\n                bitmap.height, matrix, true\n            )\n            if (returnBm == null) {\n                returnBm = bitmap\n            }\n            if (bitmap != returnBm && !bitmap.isRecycled) {\n                bitmap.recycle()\n                bitmap = null\n            }\n            return returnBm\n        }\n\n\n        /**\n         * 将Bitmap转换成文件\n         * 保存文件\n         *\n         * @param bm\n         * @param filename\n         * @throws IOException\n         */\n        @Throws(IOException::class)\n        fun saveFile(bm: Bitmap, filename: String, filepath: String): File {\n            val file = File(filepath + filename)\n            if (file.exists()) {\n                file.delete()\n            }\n            val bos = BufferedOutputStream(FileOutputStream(file))\n            bm.compress(Bitmap.CompressFormat.JPEG, 100, bos)\n            bos.flush()\n            bos.close()\n            return file\n        }\n\n        /**\n         * 图片是横屏还是竖屏\n         * @param path\n         * @return\n         */\n        fun isLandscape(path: String): Boolean {\n            val options = BitmapFactory.Options()\n            options.inJustDecodeBounds = true // 设置成了true,不占用内存，只获取bitmap宽高\n            BitmapFactory.decodeFile(path, options) // 读取图片长宽，目的是得到图片的宽高\n            return if (options.outWidth > options.outHeight) {\n                true\n            } else false\n        }\n\n        /**\n         * 将调用系统相册的图片进行压缩\n         *\n         * @param contentResolver\n         * @param uri\n         * @return\n         */\n        fun getBitmapFormUri(contentResolver: ContentResolver, uri: Uri, width: Float, height: Float): Bitmap? {\n            try {\n                var input = contentResolver.openInputStream(uri)\n                val onlyBoundsOptions = BitmapFactory.Options()\n                onlyBoundsOptions.inJustDecodeBounds = true\n                onlyBoundsOptions.inDither = true//optional\n                onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888//optional\n                BitmapFactory.decodeStream(input, null, onlyBoundsOptions)\n                input!!.close()\n                val originalWidth = onlyBoundsOptions.outWidth\n                val originalHeight = onlyBoundsOptions.outHeight\n                if (originalWidth == -1 || originalHeight == -1)\n                    return null\n                //图片分辨率以480x800为标准\n                //float hh = 800f;//这里设置高度为800f\n                //float ww = 480f;//这里设置宽度为480f\n                //缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可\n                var be = 1//be=1表示不缩放\n                if (originalWidth > originalHeight && originalWidth > width) {//如果宽度大的话根据宽度固定大小缩放\n                    be = (originalWidth / width).toInt()\n                } else if (originalWidth < originalHeight && originalHeight > height) {//如果高度高的话根据宽度固定大小缩放\n                    be = (originalHeight / height).toInt()\n                }\n                if (be <= 0)\n                    be = 1\n                //比例压缩\n                val bitmapOptions = BitmapFactory.Options()\n                bitmapOptions.inSampleSize = be//设置缩放比例\n                bitmapOptions.inDither = true//optional\n                bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888//optional\n                input = contentResolver.openInputStream(uri)\n                val bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions)\n                input!!.close()\n\n                return compressImageByQuality(bitmap!!, 1024)//再进行质量压缩\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n\n            return null\n        }\n\n        /**\n         * 通过分辨率压缩bitmap\n         * @param bitmap\n         * @param width 需要压缩的尺寸\n         * @param height\n         * @return\n         */\n        fun compressImageByResolution(bitmap: Bitmap?, width: Float, height: Float): Bitmap? {\n            var bitmap = bitmap\n            try {\n                val onlyBoundsOptions = BitmapFactory.Options()\n                onlyBoundsOptions.inJustDecodeBounds = true\n                onlyBoundsOptions.inDither = true\n                onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888\n\n                val originalWidth = onlyBoundsOptions.outWidth\n                val originalHeight = onlyBoundsOptions.outHeight\n                if (originalWidth == -1 || originalHeight == -1)\n                    return null\n                //图片分辨率以480x800为标准\n                //float hh = 800f;//这里设置高度为800f\n                //float ww = 480f;//这里设置宽度为480f\n                //缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可\n                var be = 1f//be=1表示不缩放\n                if (originalWidth > originalHeight && originalWidth > width) {//如果宽度大的话根据宽度固定大小缩放\n                    be = originalWidth / width\n                } else if (originalWidth < originalHeight && originalHeight > height) {//如果高度高的话根据宽度固定大小缩放\n                    be = originalHeight / height\n                }\n                if (be <= 0)\n                    be = 1f\n\n                //比例压缩\n                val bitmapOptions = BitmapFactory.Options()\n                bitmapOptions.inSampleSize = be.toInt()//设置缩放比例\n                bitmapOptions.inDither = true\n                bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888\n\n                val baos = ByteArrayOutputStream()\n                //质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中\n                bitmap!!.compress(Bitmap.CompressFormat.JPEG, 100, baos)\n                val input = ByteArrayInputStream(baos.toByteArray())\n\n                bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions)\n\n                return bitmap//再进行质量压缩\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n\n            return null\n        }\n\n        /**\n         * 通过质量压缩bitmap\n         * @param image\n         * @return\n         */\n        fun compressImageByQuality(image: Bitmap?, size: Int): Bitmap? {\n            var image = image\n            val baos = ByteArrayOutputStream()\n            //质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中\n            image?.compress(Bitmap.CompressFormat.JPEG, 100, baos)\n            var options = 100\n            //循环判断如果压缩后图片是否大于1000kb,大于继续压缩\n            while (baos.toByteArray().size / 1024 > size) {\n                baos.reset()//重置baos即清空baos\n                //第一个参数 ：图片格式 ，第二个参数： 图片质量，100为最高，0为最差  ，第三个参数：保存压缩后的数据的流\n                image?.compress(Bitmap.CompressFormat.JPEG, options, baos)//这里压缩options%，把压缩后的数据存放到baos中\n                options -= 10//每次都减少10\n            }\n            //把压缩后的数据baos存放到ByteArrayInputStream中\n            val isBm = ByteArrayInputStream(baos.toByteArray())\n            //把ByteArrayInputStream数据生成图片\n            val bitmap = BitmapFactory.decodeStream(isBm, null, null)\n\n            if (image != null && !image.isRecycled) {\n                image.recycle()\n                image = null\n            }\n            try {\n                baos.close()\n                isBm.close()\n            } catch (e: IOException) {\n                e.printStackTrace()\n            }\n\n            return bitmap\n        }\n\n        fun zoomImage(bigmage: Bitmap): Bitmap {\n            // 获取这个图片的宽和高\n            val width = bigmage.width.toFloat()\n            val height = bigmage.height.toFloat()\n            val maxSize = Math.max(width, height)\n            val scale: Float\n            var newWidth = 1920.0\n            var newHeight = 1080.0\n            if (maxSize > 1920) {\n                if (width > height) {\n                    scale = width / height\n                    if (scale > 1.5f) {\n                        newWidth = 1920.0\n                        newHeight = 1080.0\n                    } else if (scale > 1.0f) {\n                        newWidth = 1440.0\n                        newHeight = 1080.0\n                    }\n                } else {\n                    scale = height / width\n                    if (scale > 1.5f) {\n                        newWidth = 1080.0\n                        newHeight = 1920.0\n                    } else if (scale > 1.0f) {\n                        newWidth = 1080.0\n                        newHeight = 1440.0\n                    }\n                }\n            } else {\n                return bigmage\n            }\n            // 创建操作图片用的matrix对象\n            val matrix = Matrix()\n            // 计算宽高缩放率\n            val scaleWidth = newWidth.toFloat() / width\n            val scaleHeight = newHeight.toFloat() / height\n            // 缩放图片动作\n            matrix.postScale(scaleWidth, scaleHeight)\n            return Bitmap.createBitmap(\n                bigmage, 0, 0, width.toInt(),\n                height.toInt(), matrix, true\n            )\n        }\n\n        /**\n         * 获取照片旋转角度\n         * @param filepath\n         * @return\n         */\n        fun getExifOrientation(filepath: String): Int {\n            var degree = 0\n            var exif: ExifInterface? = null\n            try {\n                exif = ExifInterface(filepath)\n            } catch (ex: IOException) {\n                LogUtils.d(\"cannot read exif$ex\")\n            }\n\n            if (exif != null) {\n                val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1)\n                if (orientation != -1) {\n                    when (orientation) {\n                        ExifInterface.ORIENTATION_ROTATE_90 -> degree = 90\n                        ExifInterface.ORIENTATION_ROTATE_180 -> degree = 180\n                        ExifInterface.ORIENTATION_ROTATE_270 -> degree = 270\n                    }\n                }\n            }\n            return degree\n        }\n\n        /**\n         * 按正方形裁切图片\n         */\n        fun ImageCrop(bitmap: Bitmap?, rect: Rect): Bitmap? {\n            if (bitmap == null) {\n                return null\n            }\n            val top = rect.top\n            val left = rect.left  //取左上角\n            val bottom = rect.bottom\n            val right = rect.right\n            val scaleW = right - left\n            val scaleH = bottom - top\n\n            return Bitmap.createBitmap(\n                bitmap, left, top, scaleW, scaleH, null,\n                false\n            )\n\n        }\n\n\n        /**\n         * 模糊图像\n         * @param bitmap\n         * @param radius 模糊程度 0<radius></radius><=25\n         * @param context\n         * @return\n         */\n        fun blurBitmap(bitmap: Bitmap, radius: Float, context: Context): Bitmap {\n            val rs = RenderScript.create(context)\n            //Create allocation from Bitmap bitmap中的数据装填\n            val allocation = Allocation.createFromBitmap(rs, bitmap)\n            val t = allocation.type\n            //Create allocation with the same type 与第一个allocation的大小和type都相同多2D数组\n            val blurredAllocation = Allocation.createTyped(rs, t)\n            //Create script\n            val blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))\n\n            //Set blur radius (maximum 25.0)\n            blurScript.setRadius(radius)\n            //Set input for script\n            blurScript.setInput(allocation)\n            //Call script for output allocation\n            blurScript.forEach(blurredAllocation)\n            //Copy script result into bitmap\n            blurredAllocation.copyTo(bitmap)\n            //Destroy everything to free memory\n            allocation.destroy()\n            blurredAllocation.destroy()\n            blurScript.destroy()\n            rs.destroy()\n            return bitmap\n        }\n    }\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/LogUtils.java",
    "content": "package com.camera.lingxiao.common.utills;\nimport android.util.Log;\n\n\npublic class LogUtils {\n\t/** 日志输出级别NONE */\n\tpublic static final int LEVEL_NONE = 0;\n\t/** 日志输出级别E */\n\tpublic static final int LEVEL_ERROR =1;\n\t/** 日志输出级别W */\n\tpublic static final int LEVEL_WARN = 2;\n\t/** 日志输出级别I */\n\tpublic static final int LEVEL_INFO = 3;\n\t/** 日志输出级别D */\n\tpublic static final int LEVEL_DEBUG = 4;\n\t/** 日志输出级别V */\n\tpublic static final int LEVEL_VERBOSE = 5;\n\n\t/** 日志输出时的TAG */\n\tprivate static String mTag = \"LogUtils\";\n\t/** 是否允许输出log */\n\tprivate static int mDebuggable = LEVEL_VERBOSE;\n\n\t/** 以级别为 d 的形式输出LOG */\n\tpublic static void v(String msg) {\n\t\tif (mDebuggable >= LEVEL_VERBOSE) {\n\t\t\tLog.v(mTag, msg);\n\t\t}\n\t}\n\n\t/** 以级别为 d 的形式输出LOG */\n\tpublic static void d(String msg) {\n\t\tif (mDebuggable >= LEVEL_DEBUG) {\n\t\t\tLog.d(mTag, msg);\n\t\t}\n\t}\n\n\t/** 以级别为 i 的形式输出LOG */\n\tpublic static void i(String msg) {\n\t\tif (mDebuggable >= LEVEL_INFO) {\n\t\t\tLog.i(mTag, msg);\n\t\t}\n\t}\n\n\t/** 以级别为 w 的形式输出LOG */\n\tpublic static void w(String msg) {\n\t\tif (mDebuggable >= LEVEL_WARN) {\n\t\t\tLog.w(mTag, msg);\n\t\t}\n\t}\n\n\t/** 以级别为 w 的形式输出Throwable */\n\tpublic static void w(Throwable tr) {\n\t\tif (mDebuggable >= LEVEL_WARN) {\n\t\t\tLog.w(mTag, \"\", tr);\n\t\t}\n\t}\n\n\t/** 以级别为 w 的形式输出LOG信息和Throwable */\n\tpublic static void w(String msg, Throwable tr) {\n\t\tif (mDebuggable >= LEVEL_WARN && null != msg) {\n\t\t\tLog.w(mTag, msg, tr);\n\t\t}\n\t}\n\n\t/** 以级别为 e 的形式输出LOG */\n\tpublic static void e(String msg) {\n\t\tif (mDebuggable >= LEVEL_ERROR) {\n\t\t\tLog.e(mTag, msg);\n\t\t}\n\t}\n\n\t/** 以级别为 e 的形式输出Throwable */\n\tpublic static void e(Throwable tr) {\n\t\tif (mDebuggable >= LEVEL_ERROR) {\n\t\t\tLog.e(mTag, \"\", tr);\n\t\t}\n\t}\n\n\t/** 以级别为 e 的形式输出LOG信息和Throwable */\n\tpublic static void e(String msg, Throwable tr) {\n\t\tif (mDebuggable >= LEVEL_ERROR && null != msg) {\n\t\t\tLog.e(mTag, msg, tr);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/MD5Util.java",
    "content": "package com.camera.lingxiao.common.utills;\n\nimport java.io.UnsupportedEncodingException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.SecureRandom;\nimport java.util.Arrays;\n\npublic class MD5Util {\n\n    private static final String HEX_NUMS_STR=\"0123456789ABCDEF\";\n    private static final Integer SALT_LENGTH = 12;\n\n    /**\n     * 将16进制字符串转换成字节数组\n     * @param hex\n     * @return\n     */\n    public static byte[] hexStringToByte(String hex) {\n        int len = (hex.length() / 2);\n        byte[] result = new byte[len];\n        char[] hexChars = hex.toCharArray();\n        for (int i = 0; i < len; i++) {\n            int pos = i * 2;\n            result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4\n                    | HEX_NUMS_STR.indexOf(hexChars[pos + 1]));\n        }\n        return result;\n    }\n\n\n    /**\n     * 将指定byte数组转换成16进制字符串\n     * @param b\n     * @return\n     */\n    public static String byteToHexString(byte[] b) {\n        StringBuffer hexString = new StringBuffer();\n        for (int i = 0; i < b.length; i++) {\n            String hex = Integer.toHexString(b[i] & 0xFF);\n            if (hex.length() == 1) {\n                hex = '0' + hex;\n            }\n            hexString.append(hex.toUpperCase());\n        }\n        return hexString.toString();\n    }\n\n    /**\n     * 验证口令是否合法\n     * @param password\n     * @param passwordInDb\n     * @return\n     * @throws NoSuchAlgorithmException\n     * @throws UnsupportedEncodingException\n     */\n    public static boolean validPassword(String password, String passwordInDb)\n            throws NoSuchAlgorithmException, UnsupportedEncodingException {\n        //将16进制字符串格式口令转换成字节数组\n        byte[] pwdInDb = hexStringToByte(passwordInDb);\n        //声明盐变量\n        byte[] salt = new byte[SALT_LENGTH];\n        //将盐从数据库中保存的口令字节数组中提取出来\n        System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);\n        //创建消息摘要对象\n        MessageDigest md = MessageDigest.getInstance(\"MD5\");\n        //将盐数据传入消息摘要对象\n        md.update(salt);\n        //将口令的数据传给消息摘要对象\n        md.update(password.getBytes(\"UTF-8\"));\n        //生成输入口令的消息摘要\n        byte[] digest = md.digest();\n        //声明一个保存数据库中口令消息摘要的变量\n        byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];\n        //取得数据库中口令的消息摘要\n        System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);\n        //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同\n        if (Arrays.equals(digest, digestInDb)) {\n            //口令正确返回口令匹配消息\n            return true;\n        } else {\n            //口令不正确返回口令不匹配消息\n            return false;\n        }\n    }\n\n\n    /**\n     * 获得加密后的16进制形式口令\n     * @param password\n     * @return\n     * @throws NoSuchAlgorithmException\n     * @throws UnsupportedEncodingException\n     */\n    public static String getEncryptedPwd(String password)\n            throws NoSuchAlgorithmException, UnsupportedEncodingException {\n        //声明加密后的口令数组变量\n        byte[] pwd = null;\n        //随机数生成器\n        //SecureRandom random = new SecureRandom();\n        //声明盐数组变量\n        byte[] salt = new byte[SALT_LENGTH];\n        //salt = new byte[118, 11, -15, -55, 89, -24, 118, 125, -107, 86, 59, 44];\n        //将随机数放入盐变量中\n        //random.nextBytes(salt);\n        LogUtils.i(\"byte  \"+Arrays.toString(salt));\n        //声明消息摘要对象\n        MessageDigest md = null;\n        //创建消息摘要\n        md = MessageDigest.getInstance(\"MD5\");\n        //将盐数据传入消息摘要对象\n        md.update(salt);\n        //将口令的数据传给消息摘要对象\n        md.update(password.getBytes(\"UTF-8\"));\n        //获得消息摘要的字节数组\n        byte[] digest = md.digest();\n\n        //因为要在口令的字节数组中存放盐，所以加上盐的字节长度\n        pwd = new byte[digest.length + SALT_LENGTH];\n        //将盐的字节拷贝到生成的加密口令字节数组的前12个字节，以便在验证口令时取出盐\n        System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);\n        //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节\n        System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);\n        //将字节数组格式加密后的口令转化为16进制字符串格式的口令\n        return byteToHexString(pwd);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/PopwindowUtil.kt",
    "content": "package com.camera.lingxiao.common.utills\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ValueAnimator\nimport android.app.Activity\nimport android.content.Context\nimport android.content.ContextWrapper\nimport android.graphics.Color\nimport android.graphics.drawable.BitmapDrawable\nimport android.graphics.drawable.ColorDrawable\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport androidx.fragment.app.Fragment\nimport android.util.Log\nimport android.util.SparseArray\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.WindowManager\nimport android.widget.PopupWindow\nimport android.widget.TextView\n\nclass PopwindowUtil private constructor(private val mContext: Context) {\n    var mWidth = 0f\n    var mHeight = 0f\n    private var mIsFocusable = true\n    private var mIsOutside = true\n    private var mResLayoutId = -1\n    var mContentView: View? = null\n    private var mPopupWindow: PopupWindow? = null\n    private var mAnimationStyle = -1\n    private var mElevation :Float = 0f\n\n    private var mClippEnable = true//default is true\n    private var mIgnoreCheekPress = false\n    private var mInputMode = -1\n    private var mOnDismissListener: PopupWindow.OnDismissListener? = null\n    private var mSoftInputMode = -1\n    private var mTouchable = true//default is ture\n    private var mOnTouchListener: View.OnTouchListener? = null\n    private var mBackgroundDrawable: Drawable? = null\n\n    private val sparseArray = SparseArray<View>()\n\n    /**\n     * 相对于某个控件的位置 带偏移量\n     * @param anchor 指定位于哪个控件的相对位置\n     * @param x\n     * @param y\n     * @return\n     */\n    fun showAsDropDown(anchor: View, x: Int, y: Int): PopwindowUtil {\n        mPopupWindow?.showAsDropDown(anchor, x, y)\n        return this\n    }\n\n    fun showAsDropDown(anchor: View): PopwindowUtil {\n        mPopupWindow?.showAsDropDown(anchor)\n        return this\n    }\n\n    @RequiresApi(api = Build.VERSION_CODES.KITKAT)\n    fun showAsDropDown(anchor: View, xOff: Int, yOff: Int, gravity: Int): PopwindowUtil {\n        mPopupWindow?.showAsDropDown(anchor, xOff, yOff, gravity)\n        return this\n    }\n\n    /**\n     * 相对于父控件的位置\n     * @param parent\n     * @param gravity\n     * @param x\n     * @param y\n     * @return\n     */\n    fun showAtLocation(parent: View, x: Int, y: Int ,gravity: Int): PopwindowUtil {\n        mPopupWindow?.showAtLocation(parent, gravity, x, y)\n        return this\n    }\n\n    /**\n     * 设置有阴影背景\n     */\n    fun showAtLocation(parent: View, x: Int, y: Int ,gravity: Int,bgAlpha: Float): PopwindowUtil {\n        backgroundAlpha(bgAlpha,true)\n        mPopupWindow?.let {\n            it.showAtLocation(parent, gravity, x, y)\n            it.setOnDismissListener {\n                backgroundAlpha(bgAlpha,false)\n            }\n        }\n        return this\n    }\n\n    fun showAtLocation(root: View): PopwindowUtil {\n        val windowPos = calculatePopWindowPos(root, mContentView!!)\n        val xOff = 10// 可以自己调整偏移\n        windowPos[0] -= xOff\n        mPopupWindow?.showAtLocation(\n            root, Gravity.TOP or Gravity.START,\n            windowPos[0], windowPos[1]\n        )\n        return this\n    }\n\n    /**\n     * 添加属性\n     * @param popupWindow\n     */\n    private fun apply(popupWindow: PopupWindow) {\n        popupWindow.isClippingEnabled = mClippEnable\n        if (mIgnoreCheekPress) {\n            popupWindow.setIgnoreCheekPress()\n        }\n        if (mInputMode != -1) {\n            popupWindow.inputMethodMode = mInputMode\n        }\n        if (mSoftInputMode != -1) {\n            popupWindow.softInputMode = mSoftInputMode\n        }\n        if (mOnDismissListener != null) {\n            popupWindow.setOnDismissListener(mOnDismissListener)\n        }\n        if (mOnTouchListener != null) {\n            popupWindow.setTouchInterceptor(mOnTouchListener)\n        }\n        popupWindow.isTouchable = mTouchable\n    }\n\n    private fun build(): PopupWindow {\n\n        if (mContentView == null) {\n            mContentView = LayoutInflater.from(mContext).inflate(mResLayoutId, null)\n        }\n\n        if (mWidth != 0f && mHeight != 0f) {\n            mPopupWindow = PopupWindow(mContentView, mWidth.toInt(), mHeight.toInt())\n        } else {\n            mPopupWindow =\n                PopupWindow(mContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)\n        }\n        if (mAnimationStyle != -1) {\n            mPopupWindow!!.animationStyle = mAnimationStyle\n        }\n        if (mElevation != 0f){\n            mPopupWindow!!.elevation = mElevation;\n        }\n\n        apply(mPopupWindow!!)//设置一些属性\n\n        mPopupWindow!!.isFocusable = mIsFocusable\n        if (null != mBackgroundDrawable) {\n            mPopupWindow!!.setBackgroundDrawable(mBackgroundDrawable)\n        }\n        mPopupWindow!!.isOutsideTouchable = mIsOutside\n\n        if (mWidth == 0f || mHeight == 0f) {\n            mPopupWindow!!.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)\n            //如果外面没有设置宽高的情况下，计算宽高并赋值\n            mWidth = mPopupWindow!!.contentView.measuredWidth.toFloat()\n            mHeight = mPopupWindow!!.contentView.measuredHeight.toFloat()\n        }\n\n        mPopupWindow!!.update()\n\n        return mPopupWindow!!\n    }\n\n    fun <T : View> getView(resId: Int): T? {\n        var view: View? = sparseArray.get(resId)\n        if (mContentView == null) {\n            Log.i(\"PopwindowUtil\", \"mContentView is null!\")\n            return null\n        }\n        if (view == null) {\n            view = mContentView!!.findViewById(resId)\n            sparseArray.put(resId, view)\n        }\n        return view as T?\n    }\n\n    fun setText(resId: Int, text: String) {\n        val textView = getView<TextView>(resId)\n        textView!!.text = text\n    }\n\n    fun dissmiss() {\n        if (mPopupWindow != null) {\n            mPopupWindow!!.dismiss()\n        }\n    }\n\n    class PopupWindowBuilder(context: Context) {\n        private val mCustomPopWindow: PopwindowUtil\n\n        init {\n            mCustomPopWindow = PopwindowUtil(context)\n        }\n\n        fun size(width: Float, height: Float): PopupWindowBuilder {\n            mCustomPopWindow.mWidth = width\n            mCustomPopWindow.mHeight = height\n            return this\n        }\n\n\n        fun setFocusable(focusable: Boolean): PopupWindowBuilder {\n            mCustomPopWindow.mIsFocusable = focusable\n            return this\n        }\n\n\n        fun setView(resLayoutId: Int): PopupWindowBuilder {\n            mCustomPopWindow.mResLayoutId = resLayoutId\n            mCustomPopWindow.mContentView = null\n            return this\n        }\n\n        fun setView(view: View): PopupWindowBuilder {\n            mCustomPopWindow.mContentView = view\n            mCustomPopWindow.mResLayoutId = -1\n            return this\n        }\n\n        fun setElevation(elevation :Float): PopupWindowBuilder {\n            mCustomPopWindow.mElevation = elevation\n            return this\n        }\n\n        fun setOutsideTouchable(outsideTouchable: Boolean): PopupWindowBuilder {\n            mCustomPopWindow.mIsOutside = outsideTouchable\n            return this\n        }\n\n        /**\n         * 设置弹窗动画\n         * @param animationStyle\n         * @return\n         */\n        fun setAnimationStyle(animationStyle: Int): PopupWindowBuilder {\n            mCustomPopWindow.mAnimationStyle = animationStyle\n            return this\n        }\n\n\n        fun setClippingEnable(enable: Boolean): PopupWindowBuilder {\n            mCustomPopWindow.mClippEnable = enable\n            return this\n        }\n\n\n        fun setIgnoreCheekPress(ignoreCheekPress: Boolean): PopupWindowBuilder {\n            mCustomPopWindow.mIgnoreCheekPress = ignoreCheekPress\n            return this\n        }\n\n        fun setInputMethodMode(mode: Int): PopupWindowBuilder {\n            mCustomPopWindow.mInputMode = mode\n            return this\n        }\n\n        fun setOnDissmissListener(onDissmissListener: PopupWindow.OnDismissListener): PopupWindowBuilder {\n            mCustomPopWindow.mOnDismissListener = onDissmissListener\n            return this\n        }\n\n\n        fun setSoftInputMode(softInputMode: Int): PopupWindowBuilder {\n            mCustomPopWindow.mSoftInputMode = softInputMode\n            return this\n        }\n\n\n        fun setTouchable(touchable: Boolean): PopupWindowBuilder {\n            mCustomPopWindow.mTouchable = touchable\n            return this\n        }\n\n        fun setTouchIntercepter(touchIntercepter: View.OnTouchListener): PopupWindowBuilder {\n            mCustomPopWindow.mOnTouchListener = touchIntercepter\n            return this\n        }\n\n        fun setBackgroundDrawable(drawable: Drawable): PopupWindowBuilder {\n            mCustomPopWindow.mBackgroundDrawable = drawable\n            return this\n        }\n\n        fun create(): PopwindowUtil {\n            //构建PopWindow\n            mCustomPopWindow.build()\n            return mCustomPopWindow\n        }\n\n    }\n\n    companion object {\n\n\n        /**\n         * 计算出来的位置，y方向就在anchorView的上面和下面对齐显示，x方向就是与屏幕右边对齐显示\n         * 如果anchorView的位置有变化，就可以适当自己额外加入偏移来修正\n         * @param anchorView  呼出window的view\n         * @param contentView   window的内容布局\n         * @return window显示的左上角的xOff,yOff坐标\n         */\n        private fun calculatePopWindowPos(anchorView: View, contentView: View): IntArray {\n            val windowPos = IntArray(2)\n            val anchorLoc = IntArray(2)\n            // 获取锚点View在屏幕上的左上角坐标位置\n            anchorView.getLocationOnScreen(anchorLoc)\n            val anchorHeight = anchorView.height\n            // 获取屏幕的高宽\n            val screenHeight = getScreenHeight(anchorView.context)\n            val screenWidth = getScreenWidth(anchorView.context)\n            contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)\n            // 计算contentView的高宽\n            val windowHeight = contentView.measuredHeight\n            val windowWidth = contentView.measuredWidth\n            // 判断需要向上弹出还是向下弹出显示\n            val isNeedShowUp = screenHeight - anchorLoc[1] - anchorHeight < windowHeight\n            if (isNeedShowUp) {\n                windowPos[0] = screenWidth - windowWidth\n                windowPos[1] = anchorLoc[1] - windowHeight\n            } else {\n                windowPos[0] = screenWidth - windowWidth\n                windowPos[1] = anchorLoc[1] + anchorHeight\n            }\n            return windowPos\n        }\n\n        /**\n         * 获取屏幕高度(px)\n         */\n        fun getScreenHeight(context: Context): Int {\n            return context.resources.displayMetrics.heightPixels\n        }\n\n        /**\n         * 获取屏幕宽度(px)\n         */\n        fun getScreenWidth(context: Context): Int {\n            return context.resources.displayMetrics.widthPixels\n        }\n    }\n\n    var isStarted = false\n    fun backgroundAlpha(bgAlpha:Float,show:Boolean) {\n        if (isStarted){\n            return\n        }\n        isStarted = true\n        var animator:ValueAnimator\n        if (show)\n            animator = ValueAnimator.ofFloat(1f, bgAlpha).setDuration(500)\n        else\n            animator = ValueAnimator.ofFloat(bgAlpha, 1f).setDuration(500)\n        getActivityFromContext(mContext)?.let {\n            var updateListener = ValueAnimator.AnimatorUpdateListener { animation ->\n                var mCurrentAlpha = (animation.animatedValue as Float)\n                val lp = it.getWindow().getAttributes()\n                LogUtils.d(\"阴影动画修改值${mCurrentAlpha}, 是否是显示的${show}\")\n                lp.alpha = mCurrentAlpha\n                it.getWindow().setAttributes(lp)\n            }\n            var animatorListener = object : AnimatorListenerAdapter() {\n                override fun onAnimationEnd(animation: Animator) {\n                    super.onAnimationEnd(animation)\n                    //动画播放完毕\n                    isStarted = false\n                }\n            }\n            animator.addUpdateListener(updateListener)\n            animator.addListener(animatorListener)\n            animator.start()\n        }\n    }\n    private fun getActivityFromContext(context: Context?): Activity? {\n        var context = context\n        if (null != context) {\n            while (context is ContextWrapper) {\n                if (context is Activity) {\n                    return context\n                }else if (context is androidx.fragment.app.Fragment){\n                    return context.activity\n                }\n                context = context.baseContext\n            }\n        }\n        return null\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/RetrofitUtil.kt",
    "content": "package com.camera.lingxiao.common.utills\n\nimport android.util.Log\nimport com.camera.lingxiao.common.app.ContentValue\n\nimport java.io.IOException\nimport java.util.concurrent.TimeUnit\n\nimport okhttp3.*\nimport retrofit2.Retrofit\nimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory\nimport retrofit2.converter.gson.GsonConverterFactory\nimport java.security.NoSuchAlgorithmException\n\nclass RetrofitUtil private constructor() {\n\n    /**\n     * 获取retrofit\n     * @return\n     */\n    fun retrofit(): Retrofit {\n        return Retrofit.Builder()\n            .client(okHttpClient())\n            .baseUrl(ContentValue.BASE_URL)\n            .addConverterFactory(GsonConverterFactory.create())  //指定Gson作为解析Json数据的Converter\n            .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //指定使用RxJava 作为CallAdapter\n            .build()\n    }\n\n    companion object {\n        val CONNECT_TIME_OUT = 30//连接超时时长x秒\n        val READ_TIME_OUT = 30//读数据超时时长x秒\n        val WRITE_TIME_OUT = 30//写数据接超时时长x秒\n        private var mInstance: RetrofitUtil? = null\n        var TAG = RetrofitUtil::class.java.simpleName\n        fun get(): RetrofitUtil {\n            if (mInstance == null) {\n                synchronized(RetrofitUtil::class.java) {\n                    if (mInstance == null) {\n                        mInstance = RetrofitUtil()\n                    }\n                }\n            }\n            return mInstance!!\n        }\n\n        /**\n         * 设置okhttp参数\n         * @return\n         */\n        private fun okHttpClient(): OkHttpClient {\n            //开启log\n            return OkHttpClient.Builder()\n                .connectTimeout(CONNECT_TIME_OUT.toLong(), TimeUnit.SECONDS)\n                .writeTimeout(WRITE_TIME_OUT.toLong(), TimeUnit.SECONDS)\n                .readTimeout(READ_TIME_OUT.toLong(), TimeUnit.SECONDS)\n                /*.addInterceptor(object :Interceptor {\n                    override fun intercept(chain: Interceptor.Chain): Response {\n                        var oldRequest = chain.request();\n                        var sign = getSign(oldRequest.url());\n                        //添加sign参数\n                        var newBuilder = oldRequest.url()\n                            .newBuilder()\n                            .scheme(oldRequest.url().scheme())\n                            .host(oldRequest.url().host())\n                            .addQueryParameter(ApiHelper.PARAM_SIGN, sign)\n                        var newRequest = oldRequest.newBuilder()\n                            .method(oldRequest.method(), oldRequest.body())\n                            .url(newBuilder.build())\n                            .build()\n                        return chain.proceed(newRequest);\n                    }\n\n                })*/\n                .build()\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/RxJavaHelp.java",
    "content": "package com.camera.lingxiao.common.utills;\n\nimport com.camera.lingxiao.common.http.HttpResultFunction;\nimport com.camera.lingxiao.common.observer.HttpRxObserver;\nimport com.trello.rxlifecycle2.LifecycleProvider;\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableEmitter;\nimport io.reactivex.ObservableOnSubscribe;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Action;\nimport io.reactivex.schedulers.Schedulers;\n\npublic class RxJavaHelp {\n    /**\n     * 获取被监听者\n     * 备注:网络请求Observable构建\n     * data:网络请求参数\n     * <h1>补充说明</h1>\n     * 无管理生命周期,容易导致内存溢出\n     */\n    public static Observable getObservable(Observable<Object> apiObservable, final HttpRxObserver callback) {\n        // showLog(request);\n        Observable observable = apiObservable\n                .doOnDispose(new Action() {\n                    @Override\n                    public void run() throws Exception {\n                        if (callback != null){\n                            callback.onCanceled();\n                        }\n                    }\n                })\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread());\n        return observable;\n    }\n    /**\n     * 获取被监听者\n     * 备注:网络请求Observable构建\n     * data:网络请求参数\n     * <h1>补充说明</h1>\n     * 传入LifecycleProvider<FragmentEvent>手动管理生命周期,避免内存溢出\n     * 备注:需要继承RxFragment,RxDialogFragment\n     *\n     */\n    public static Observable getObservable(Observable<Object> apiObservable, LifecycleProvider lifecycle, final HttpRxObserver callback) {\n        //  showLog(request);\n        Observable observable;\n        if (lifecycle != null) {\n            //手动管理移除监听生命周期.eg:FragmentEvent.STOP\n            observable = apiObservable\n                    .compose(lifecycle.bindToLifecycle())//需要在这个位置添加\n                    .onErrorResumeNext(new HttpResultFunction<>())\n                    .doOnDispose(new Action() {\n                        @Override\n                        public void run() throws Exception {\n                            if (callback != null)\n                                callback.onCanceled();\n                        }\n                    })\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread());\n        } else {\n            observable = getObservable(apiObservable, callback);\n        }\n\n        return observable;\n    }\n\n\n\n    public static void work(ObservableOnSubscribe ob, HttpRxObserver callback){\n        Observable observable = Observable.create(ob);\n        getObservable(observable, callback).subscribe(callback);\n    }\n\n    public static void workWithLifecycle(LifecycleProvider lifecycle, ObservableOnSubscribe ob,HttpRxObserver callback){\n        Observable observable = Observable.create(ob);\n        getObservable(observable,lifecycle,callback).subscribe(callback);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/com/camera/lingxiao/common/utills/SpUtils.java",
    "content": "package com.camera.lingxiao.common.utills;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\n/**\n * Created by lingxiao on 2017/7/26.\n */\n\npublic class SpUtils {\n    public static SharedPreferences sp;\n    public static void putBoolean(Context context , String key, boolean value){\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);//context里面都是一些定义好了的静态常量\n        }\n        sp.edit().putBoolean(key, value).commit();\n    }\n    public static boolean getBoolean(Context context , String key, boolean defValue){\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);\n        }\n        return sp.getBoolean(key, defValue);\n    }\n\n    public static void putString(Context context , String key, String value){\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);\n        }\n        sp.edit().putString(key, value).commit();\n    }\n    public static String getString(Context context , String key, String defValue){\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);\n        }\n        return sp.getString(key, defValue);\n    }\n    public static void remove(Context context, String simNum) {\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);\n        }\n        sp.edit().remove(simNum).commit();\n    }\n\n    public static void putInt(Context context , String key, int value){\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);\n        }\n        sp.edit().putInt(key, value).commit();\n    }\n    public static int getInt(Context context , String key, int defValue){\n        if (sp == null) {\n            sp = context.getSharedPreferences(\"config\", context.MODE_PRIVATE);\n        }\n        return sp.getInt(key, defValue);\n    }\n}\n"
  },
  {
    "path": "common/src/main/module/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.camera.lingxiao.common\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <application\n            android:allowBackup=\"true\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:label=\"@string/app_name\"\n            android:roundIcon=\"@mipmap/ic_launcher_round\"\n            android:supportsRtl=\"true\"\n            android:theme=\"@style/AppTheme\">\n        <activity android:name=\".app.BaseActivity\"/>\n        <activity android:name=\".example.MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "common/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n    android:height=\"108dp\"\n    android:width=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#26A69A\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "common/src/main/res/layout/activity_crash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n              android:fitsSystemWindows=\"true\"\n              >\n    <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/colorPrimary\"\n            android:minHeight=\"?attr/actionBarSize\"\n            app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n            app:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\" >\n    </androidx.appcompat.widget.Toolbar>\n    />\n    <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\">\n            <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"快看，这瓜皮开发者又写出了一个bug：\"\n                    android:textSize=\"18sp\"/>\n            <TextView\n                    android:id=\"@+id/tv_errormsg\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\" />\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>"
  },
  {
    "path": "common/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".example.MainActivity\">\n\n    <TextView\n            android:text=\"获取到请求的内容\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"200dp\"\n            android:id=\"@+id/tv_msg\"\n            android:layout_marginTop=\"8dp\"\n            app:layout_constraintTop_toTopOf=\"parent\" app:layout_constraintEnd_toEndOf=\"parent\"\n            android:layout_marginEnd=\"8dp\" app:layout_constraintStart_toStartOf=\"parent\"\n            android:layout_marginStart=\"8dp\" android:layout_marginBottom=\"8dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\" app:layout_constraintVertical_bias=\"0.0\"\n            app:layout_constraintHorizontal_bias=\"0.0\"/>\n    <Button\n            android:text=\"网络请求\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/button_get\" android:layout_marginTop=\"8dp\"\n            app:layout_constraintTop_toBottomOf=\"@+id/tv_msg\" android:layout_marginBottom=\"7dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\" app:layout_constraintEnd_toEndOf=\"parent\"\n            android:layout_marginEnd=\"8dp\" app:layout_constraintStart_toStartOf=\"parent\"\n            android:layout_marginStart=\"8dp\" app:layout_constraintHorizontal_bias=\"0.0\"\n            app:layout_constraintVertical_bias=\"0.035\"/>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "common/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "common/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "common/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!--3F51B5  FF4081-->\n    <color name=\"colorPrimary\">#66bb6a</color>\n    <color name=\"colorPrimaryDark\">#4CAF50</color>\n    <color name=\"colorAccent\">#388E3C</color>\n\n    <color name=\"colorWhite\">#11111111</color>\n    <color name=\"colorTrans\">#00000000</color>\n    <!--涟漪效果颜色-->\n    <color name=\"grey\">#000000</color>\n    <color name=\"white\">#FFFFFF</color>\n    <color name=\"trans\">#00000000</color>\n    <color name=\"colorGray\">#e5e3e4</color>\n    <!--splash background color start-->\n    <color name=\"lightblue1\">#03A9F4</color>\n    <color name=\"lightblue2\">#29B6F6</color>\n    <color name=\"lightblue3\">#4FC3F7</color>\n    <color name=\"lightblue4\">#81D4FA</color>\n    <color name=\"lightbluelast\">#0277BD</color>\n    <!--splash background color end-->\n\n    <color name=\"red400\">#EF5350</color>\n    <color name=\"pink400\">#EC407A</color>\n\n\n\n\n    <color name=\"red_50\">#FFEBEE</color>\n    <color name=\"red_100\">#FFCDD2</color>\n    <color name=\"red_200\">#EF9A9A</color>\n    <color name=\"red_300\">#E57373</color>\n    <color name=\"red_400\">#EF5350</color>\n    <color name=\"red_500\">#F44336</color>\n    <color name=\"red_600\">#E53935</color>\n    <color name=\"red_700\">#D32F2F</color>\n\n    <color name=\"pink_50\">#FCE4EC</color>\n    <color name=\"pink_100\">#F8BBD0</color>\n    <color name=\"pink_200\">#F48FB1</color>\n    <color name=\"pink_300\">#F06292</color>\n    <color name=\"pink_400\">#EC407A</color>\n    <color name=\"pink_500\">#E91E63</color>\n    <color name=\"pink_600\">#D81B60</color>\n    <color name=\"pink_700\">#C2185B</color>\n\n    <color name=\"purple50\">#F3E5F5</color>\n    <color name=\"purple100\">#E1BEE7</color>\n    <color name=\"purple200\">#CE93D8</color>\n    <color name=\"purple300\">#BA68C8</color>\n    <color name=\"purple400\">#AB47BC</color>\n    <color name=\"purple500\">#9C27B0</color>\n    <color name=\"purple600\">#8E24AA</color>\n    <color name=\"purple700\">#7B1FA2</color>\n\n    <color name=\"deepPurple50\">#EDE7F6</color>\n    <color name=\"deepPurple100\">#D1C4E9</color>\n    <color name=\"deepPurple200\">#B39DDB</color>\n    <color name=\"deepPurple300\">#9575CD</color>\n    <color name=\"deepPurple400\">#7E57C2</color>\n    <color name=\"deepPurple500\">#673AB7</color>\n    <color name=\"deepPurple600\">#5E35B1</color>\n    <color name=\"deepPurple700\">#512DA8</color>\n\n    <color name=\"indigo50\">#E8EAF6</color>\n    <color name=\"indigo100\">#C5CAE9</color>\n    <color name=\"indigo200\">#9FA8DA</color>\n    <color name=\"indigo300\">#7986CB</color>\n    <color name=\"indigo400\">#5C6BC0</color>\n    <color name=\"indigo500\">#3F51B5</color>\n    <color name=\"indigo600\">#3949AB</color>\n    <color name=\"indigo700\">#303F9F</color>\n\n\n    <color name=\"blue50\">#E3F2FD</color>\n    <color name=\"blue100\">#BBDEFB</color>\n    <color name=\"blue200\">#90CAF9</color>\n    <color name=\"blue300\">#64B5F6</color>\n    <color name=\"blue400\">#42A5F5</color>\n    <color name=\"blue500\">#2196F3</color>\n    <color name=\"blue600\">#1E88E5</color>\n    <color name=\"blue700\">#1976D2</color>\n\n    <color name=\"amber_100\">#ffecb3</color>\n    <color name=\"amber_200\">#ffe082</color>\n    <color name=\"amber_300\">#ffd54f</color>\n    <color name=\"amber_400\">#ffca28</color>\n    <color name=\"amber_50\">#fff8e1</color>\n    <color name=\"amber_500\">#ffc107</color>\n    <color name=\"amber_600\">#ffb300</color>\n    <color name=\"amber_700\">#ffa000</color>\n    <color name=\"amber_800\">#ff8f00</color>\n    <color name=\"amber_900\">#ff6f00</color>\n    <color name=\"amber_a100\">#ffe57f</color>\n    <color name=\"amber_a200\">#ffd740</color>\n    <color name=\"amber_a400\">#ffc400</color>\n    <color name=\"amber_a700\">#ffab00</color>\n    <color name=\"black\">#000000</color>\n    <color name=\"black_alpha_112\">#70000000</color>\n    <color name=\"black_alpha_128\">#80000000</color>\n    <color name=\"black_alpha_144\">#90000000</color>\n    <color name=\"black_alpha_16\">#10000000</color>\n    <color name=\"black_alpha_160\">#a0000000</color>\n    <color name=\"black_alpha_176\">#b0000000</color>\n    <color name=\"black_alpha_192\">#c0000000</color>\n    <color name=\"black_alpha_208\">#d0000000</color>\n    <color name=\"black_alpha_224\">#e0000000</color>\n    <color name=\"black_alpha_240\">#f0000000</color>\n    <color name=\"black_alpha_32\">#20000000</color>\n    <color name=\"black_alpha_48\">#30000000</color>\n    <color name=\"black_alpha_64\">#40000000</color>\n    <color name=\"black_alpha_80\">#50000000</color>\n    <color name=\"black_alpha_96\">#60000000</color>\n    <color name=\"blue_100\">#d0d9ff</color>\n    <color name=\"blue_200\">#afbfff</color>\n    <color name=\"blue_300\">#91a7ff</color>\n    <color name=\"blue_400\">#738ffe</color>\n    <color name=\"blue_50\">#e7e9fd</color>\n    <color name=\"blue_500\">#5677fc</color>\n    <color name=\"blue_600\">#4e6cef</color>\n    <color name=\"blue_700\">#455ede</color>\n    <color name=\"blue_800\">#3b50ce</color>\n    <color name=\"blue_900\">#2a36b1</color>\n    <color name=\"blue_a100\">#a6baff</color>\n    <color name=\"blue_a200\">#6889ff</color>\n    <color name=\"blue_a400\">#4d73ff</color>\n    <color name=\"blue_a700\">#4d69ff</color>\n    <color name=\"blue_grey_100\">#cfd8dc</color>\n    <color name=\"blue_grey_200\">#b0bec5</color>\n    <color name=\"blue_grey_300\">#90a4ae</color>\n    <color name=\"blue_grey_400\">#78909c</color>\n    <color name=\"blue_grey_50\">#eceff1</color>\n    <color name=\"blue_grey_500\">#607d8b</color>\n    <color name=\"blue_grey_600\">#546e7a</color>\n    <color name=\"blue_grey_700\">#455a64</color>\n    <color name=\"blue_grey_800\">#37474f</color>\n    <color name=\"blue_grey_900\">#263238</color>\n    <color name=\"brown_100\">#d7ccc8</color>\n    <color name=\"brown_200\">#bcaaa4</color>\n    <color name=\"brown_300\">#a1887f</color>\n    <color name=\"brown_400\">#8d6e63</color>\n    <color name=\"brown_50\">#efebe9</color>\n    <color name=\"brown_500\">#795548</color>\n    <color name=\"brown_600\">#6d4c41</color>\n    <color name=\"brown_700\">#5d4037</color>\n    <color name=\"brown_800\">#4e342e</color>\n    <color name=\"brown_900\">#3e2723</color>\n    <color name=\"cyan_100\">#b2ebf2</color>\n    <color name=\"cyan_200\">#80deea</color>\n    <color name=\"cyan_300\">#4dd0e1</color>\n    <color name=\"cyan_400\">#26c6da</color>\n    <color name=\"cyan_50\">#e0f7fa</color>\n    <color name=\"cyan_500\">#00bcd4</color>\n    <color name=\"cyan_600\">#00acc1</color>\n    <color name=\"cyan_700\">#0097a7</color>\n    <color name=\"cyan_800\">#00838f</color>\n    <color name=\"cyan_900\">#006064</color>\n    <color name=\"cyan_a100\">#84ffff</color>\n    <color name=\"cyan_a200\">#18ffff</color>\n    <color name=\"cyan_a400\">#00e5ff</color>\n    <color name=\"cyan_a700\">#00b8d4</color>\n    <color name=\"deep_orange_100\">#ffccbc</color>\n    <color name=\"deep_orange_200\">#ffab91</color>\n    <color name=\"deep_orange_300\">#ff8a65</color>\n    <color name=\"deep_orange_400\">#ff7043</color>\n    <color name=\"deep_orange_50\">#fbe9e7</color>\n    <color name=\"deep_orange_500\">#ff5722</color>\n    <color name=\"deep_orange_600\">#f4511e</color>\n    <color name=\"deep_orange_700\">#e64a19</color>\n    <color name=\"deep_orange_800\">#d84315</color>\n    <color name=\"deep_orange_900\">#bf360c</color>\n    <color name=\"deep_orange_a100\">#ff9e80</color>\n    <color name=\"deep_orange_a200\">#ff6e40</color>\n    <color name=\"deep_orange_a400\">#ff3d00</color>\n    <color name=\"deep_orange_a700\">#dd2c00</color>\n    <color name=\"deep_purple_100\">#d1c4e9</color>\n    <color name=\"deep_purple_200\">#b39ddb</color>\n    <color name=\"deep_purple_300\">#9575cd</color>\n    <color name=\"deep_purple_400\">#7e57c2</color>\n    <color name=\"deep_purple_50\">#ede7f6</color>\n    <color name=\"deep_purple_500\">#673ab7</color>\n    <color name=\"deep_purple_600\">#5e35b1</color>\n    <color name=\"deep_purple_700\">#512da8</color>\n    <color name=\"deep_purple_800\">#4527a0</color>\n    <color name=\"deep_purple_900\">#311b92</color>\n    <color name=\"deep_purple_a100\">#b388ff</color>\n    <color name=\"deep_purple_a200\">#7c4dff</color>\n    <color name=\"deep_purple_a400\">#651fff</color>\n    <color name=\"deep_purple_a700\">#6200ea</color>\n    <color name=\"green_100\">#a3e9a4</color>\n    <color name=\"green_200\">#72d572</color>\n    <color name=\"green_300\">#42bd41</color>\n    <color name=\"green_400\">#2baf2b</color>\n    <color name=\"green_50\">#d0f8ce</color>\n    <color name=\"green_500\">#259b24</color>\n    <color name=\"green_600\">#0a8f08</color>\n    <color name=\"green_700\">#0a7e07</color>\n    <color name=\"green_800\">#056f00</color>\n    <color name=\"green_900\">#0d5302</color>\n    <color name=\"green_a100\">#a2f78d</color>\n    <color name=\"green_a200\">#5af158</color>\n    <color name=\"green_a400\">#14e715</color>\n    <color name=\"green_a700\">#12c700</color>\n    <color name=\"grey_100\">#f5f5f5</color>\n    <color name=\"grey_200\">#eeeeee</color>\n    <color name=\"grey_300\">#e0e0e0</color>\n    <color name=\"grey_400\">#bdbdbd</color>\n    <color name=\"grey_50\">#fafafa</color>\n    <color name=\"grey_500\">#9e9e9e</color>\n    <color name=\"grey_600\">#757575</color>\n    <color name=\"grey_700\">#616161</color>\n    <color name=\"grey_800\">#424242</color>\n    <color name=\"grey_900\">#212121</color>\n    <color name=\"indigo_100\">#c5cae9</color>\n    <color name=\"indigo_200\">#9fa8da</color>\n    <color name=\"indigo_300\">#7986cb</color>\n    <color name=\"indigo_400\">#5c6bc0</color>\n    <color name=\"indigo_50\">#e8eaf6</color>\n    <color name=\"indigo_500\">#3f51b5</color>\n    <color name=\"indigo_600\">#3949ab</color>\n    <color name=\"indigo_700\">#303f9f</color>\n    <color name=\"indigo_800\">#283593</color>\n    <color name=\"indigo_900\">#1a237e</color>\n    <color name=\"indigo_a100\">#8c9eff</color>\n    <color name=\"indigo_a200\">#536dfe</color>\n    <color name=\"indigo_a400\">#3d5afe</color>\n    <color name=\"indigo_a700\">#304ffe</color>\n    <color name=\"light_blue_100\">#b3e5fc</color>\n    <color name=\"light_blue_200\">#81d4fa</color>\n    <color name=\"light_blue_300\">#4fc3f7</color>\n    <color name=\"light_blue_400\">#29b6f6</color>\n    <color name=\"light_blue_50\">#e1f5fe</color>\n    <color name=\"light_blue_500\">#03a9f4</color>\n    <color name=\"light_blue_600\">#039be5</color>\n    <color name=\"light_blue_700\">#0288d1</color>\n    <color name=\"light_blue_800\">#0277bd</color>\n    <color name=\"light_blue_900\">#01579b</color>\n    <color name=\"light_blue_a100\">#80d8ff</color>\n    <color name=\"light_blue_a200\">#40c4ff</color>\n    <color name=\"light_blue_a400\">#00b0ff</color>\n    <color name=\"light_blue_a700\">#0091ea</color>\n    <color name=\"light_green_100\">#dcedc8</color>\n    <color name=\"light_green_200\">#c5e1a5</color>\n    <color name=\"light_green_300\">#aed581</color>\n    <color name=\"light_green_400\">#9ccc65</color>\n    <color name=\"light_green_50\">#f1f8e9</color>\n    <color name=\"light_green_500\">#8bc34a</color>\n    <color name=\"light_green_600\">#7cb342</color>\n    <color name=\"light_green_700\">#689f38</color>\n    <color name=\"light_green_800\">#558b2f</color>\n    <color name=\"light_green_900\">#33691e</color>\n    <color name=\"light_green_a100\">#ccff90</color>\n    <color name=\"light_green_a200\">#b2ff59</color>\n    <color name=\"light_green_a400\">#76ff03</color>\n    <color name=\"light_green_a700\">#64dd17</color>\n    <color name=\"lime_100\">#f0f4c3</color>\n    <color name=\"lime_200\">#e6ee9c</color>\n    <color name=\"lime_300\">#dce775</color>\n    <color name=\"lime_400\">#d4e157</color>\n    <color name=\"lime_50\">#f9fbe7</color>\n    <color name=\"lime_500\">#cddc39</color>\n    <color name=\"lime_600\">#c0ca33</color>\n    <color name=\"lime_700\">#afb42b</color>\n    <color name=\"lime_800\">#9e9d24</color>\n    <color name=\"lime_900\">#827717</color>\n    <color name=\"lime_a100\">#f4ff81</color>\n    <color name=\"lime_a200\">#eeff41</color>\n    <color name=\"lime_a400\">#c6ff00</color>\n    <color name=\"lime_a700\">#aeea00</color>\n    <color name=\"orange_100\">#ffe0b2</color>\n    <color name=\"orange_200\">#ffcc80</color>\n    <color name=\"orange_300\">#ffb74d</color>\n    <color name=\"orange_400\">#ffa726</color>\n    <color name=\"orange_50\">#fff3e0</color>\n    <color name=\"orange_500\">#ff9800</color>\n    <color name=\"orange_600\">#fb8c00</color>\n    <color name=\"orange_700\">#f57c00</color>\n    <color name=\"orange_800\">#ef6c00</color>\n    <color name=\"orange_900\">#e65100</color>\n    <color name=\"orange_a100\">#ffd180</color>\n    <color name=\"orange_a200\">#ffab40</color>\n    <color name=\"orange_a400\">#ff9100</color>\n    <color name=\"orange_a700\">#ff6d00</color>\n    <color name=\"pink_800\">#ad1457</color>\n    <color name=\"pink_900\">#880e4f</color>\n    <color name=\"pink_a100\">#ff80ab</color>\n    <color name=\"pink_a200\">#ff4081</color>\n    <color name=\"pink_a400\">#f50057</color>\n    <color name=\"pink_a700\">#c51162</color>\n    <color name=\"purple_100\">#e1bee7</color>\n    <color name=\"purple_200\">#ce93d8</color>\n    <color name=\"purple_300\">#ba68c8</color>\n    <color name=\"purple_400\">#ab47bc</color>\n    <color name=\"purple_50\">#f3e5f5</color>\n    <color name=\"purple_500\">#9c27b0</color>\n    <color name=\"purple_600\">#8e24aa</color>\n    <color name=\"purple_700\">#7b1fa2</color>\n    <color name=\"purple_800\">#6a1b9a</color>\n    <color name=\"purple_900\">#4a148c</color>\n    <color name=\"purple_a100\">#ea80fc</color>\n    <color name=\"purple_a200\">#e040fb</color>\n    <color name=\"purple_a400\">#d500f9</color>\n    <color name=\"purple_a700\">#aa00ff</color>\n\n    <color name=\"red_800\">#c41411</color>\n    <color name=\"red_900\">#b0120a</color>\n    <color name=\"red_a100\">#ff7997</color>\n    <color name=\"red_a200\">#ff5177</color>\n    <color name=\"red_a400\">#ff2d6f</color>\n    <color name=\"red_a700\">#e00032</color>\n    <color name=\"teal_100\">#b2dfdb</color>\n    <color name=\"teal_200\">#80cbc4</color>\n    <color name=\"teal_300\">#4db6ac</color>\n    <color name=\"teal_400\">#26a69a</color>\n    <color name=\"teal_50\">#e0f2f1</color>\n    <color name=\"teal_500\">#009688</color>\n    <color name=\"teal_600\">#00897b</color>\n    <color name=\"teal_700\">#00796b</color>\n    <color name=\"teal_800\">#00695c</color>\n    <color name=\"teal_900\">#004d40</color>\n    <color name=\"teal_a100\">#a7ffeb</color>\n    <color name=\"teal_a200\">#64ffda</color>\n    <color name=\"teal_a400\">#1de9b6</color>\n    <color name=\"teal_a700\">#00bfa5</color>\n    <!--<color name=\"trans\">#00000000</color>-->\n    <!--<color name=\"white\">#ffffff</color>-->\n    <color name=\"white_alpha_112\">#70ffffff</color>\n    <color name=\"white_alpha_128\">#80ffffff</color>\n    <color name=\"white_alpha_144\">#90ffffff</color>\n    <color name=\"white_alpha_16\">#10ffffff</color>\n    <color name=\"white_alpha_160\">#a0ffffff</color>\n    <color name=\"white_alpha_176\">#b0ffffff</color>\n    <color name=\"white_alpha_192\">#c0ffffff</color>\n    <color name=\"white_alpha_208\">#d0ffffff</color>\n    <color name=\"white_alpha_224\">#e0ffffff</color>\n    <color name=\"white_alpha_240\">#f0ffffff</color>\n    <color name=\"white_alpha_32\">#20ffffff</color>\n    <color name=\"white_alpha_48\">#30ffffff</color>\n    <color name=\"white_alpha_64\">#40ffffff</color>\n    <color name=\"white_alpha_80\">#50ffffff</color>\n    <color name=\"white_alpha_96\">#60ffffff</color>\n    <color name=\"yellow_100\">#fff9c4</color>\n    <color name=\"yellow_200\">#fff59d</color>\n    <color name=\"yellow_300\">#fff176</color>\n    <color name=\"yellow_400\">#ffee58</color>\n    <color name=\"yellow_50\">#fffde7</color>\n    <color name=\"yellow_500\">#ffeb3b</color>\n    <color name=\"yellow_600\">#fdd835</color>\n    <color name=\"yellow_700\">#fbc02d</color>\n    <color name=\"yellow_800\">#f9a825</color>\n    <color name=\"yellow_900\">#f57f17</color>\n    <color name=\"yellow_a100\">#ffff8d</color>\n    <color name=\"yellow_a200\">#ffff00</color>\n    <color name=\"yellow_a400\">#ffea00</color>\n    <color name=\"yellow_a700\">#ffd600</color>\n    <dimen name=\"font_10\">10sp</dimen>\n    <dimen name=\"font_112\">112sp</dimen>\n    <dimen name=\"font_12\">12sp</dimen>\n    <dimen name=\"font_14\">14sp</dimen>\n    <dimen name=\"font_16\">16sp</dimen>\n    <dimen name=\"font_18\">18sp</dimen>\n    <dimen name=\"font_20\">20sp</dimen>\n    <dimen name=\"font_22\">22sp</dimen>\n    <dimen name=\"font_24\">24sp</dimen>\n    <dimen name=\"font_28\">28sp</dimen>\n    <dimen name=\"font_32\">32sp</dimen>\n    <dimen name=\"font_34\">34sp</dimen>\n    <dimen name=\"font_38\">38sp</dimen>\n    <dimen name=\"font_4\">4sp</dimen>\n    <dimen name=\"font_44\">44sp</dimen>\n    <dimen name=\"font_56\">56sp</dimen>\n    <dimen name=\"font_6\">6sp</dimen>\n    <dimen name=\"font_8\">8sp</dimen>\n    <dimen name=\"len_10\">10dp</dimen>\n    <dimen name=\"len_100\">100dp</dimen>\n    <dimen name=\"len_116\">116dp</dimen>\n    <dimen name=\"len_12\">12dp</dimen>\n    <dimen name=\"len_128\">128dp</dimen>\n    <dimen name=\"len_14\">14dp</dimen>\n    <dimen name=\"len_156\">156dp</dimen>\n    <dimen name=\"len_16\">16dp</dimen>\n    <dimen name=\"len_172\">172dp</dimen>\n    <dimen name=\"len_2\">2dp</dimen>\n    <dimen name=\"len_20\">20dp</dimen>\n    <dimen name=\"len_224\">224dp</dimen>\n    <dimen name=\"len_24\">24dp</dimen>\n    <dimen name=\"len_256\">256dp</dimen>\n    <dimen name=\"len_28\">28dp</dimen>\n    <dimen name=\"len_32\">32dp</dimen>\n    <dimen name=\"len_36\">36dp</dimen>\n    <dimen name=\"len_4\">4dp</dimen>\n    <dimen name=\"len_40\">40dp</dimen>\n    <dimen name=\"len_44\">44dp</dimen>\n    <dimen name=\"len_48\">48dp</dimen>\n    <dimen name=\"len_52\">52dp</dimen>\n    <dimen name=\"len_56\">56dp</dimen>\n    <dimen name=\"len_6\">6dp</dimen>\n    <dimen name=\"len_60\">60dp</dimen>\n    <dimen name=\"len_64\">64dp</dimen>\n    <dimen name=\"len_68\">68dp</dimen>\n    <dimen name=\"len_72\">72dp</dimen>\n    <dimen name=\"len_76\">76dp</dimen>\n    <dimen name=\"len_8\">8dp</dimen>\n    <dimen name=\"len_80\">80dp</dimen>\n    <dimen name=\"len_84\">84dp</dimen>\n    <dimen name=\"len_88\">88dp</dimen>\n    <dimen name=\"len_92\">92dp</dimen>\n    <dimen name=\"len_96\">96dp</dimen>\n\n\n\n\n\n\n\n\n\n\n</resources>\n"
  },
  {
    "path": "common/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!--Toolbar的默认id名-->\n    <item name=\"toolbar\" type=\"id\" />\n    <!--recycler封装的tag属性-->\n    <item name=\"tag_recycler_holder\" type=\"id\" />\n    <!--默认头像的drawable名字-->\n    <item name=\"default_portrait\" type=\"drawable\" />\n</resources>"
  },
  {
    "path": "common/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Common</string>\n    <string name=\"permession_title\">为了更好地使用本应用，需要授予权限</string>\n    <string name=\"AccessKey\">V_ZleIlYzHPjekmAuRvDkkXLdV_MDkk69VZWM12f</string>\n    <string name=\"SecretKey\">U8SndxcceqMZGIKvhfPL3gEPkYRN_NhrP75cJlOH</string>\n</resources>\n"
  },
  {
    "path": "common/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "common/src/test/java/com/camera/lingxiao/common/ExampleUnitTest.java",
    "content": "package com.camera.lingxiao.common;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.6-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# android.useAndroidX=true\n# android.enableJetifier=true\n\n# Ƿģʽ\nisModule=false\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n# android.useAndroidX=true\n# android.enableJetifier=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "ijkplayer/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "ijkplayer/build.gradle",
    "content": "if (isModule.toBoolean()) {\n    apply plugin: 'com.android.application'\n} else {\n    apply plugin: 'com.android.library'\n}\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\nandroid {\n    compileSdkVersion 28\n\n\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode rootProject.ext.versionCode\n        versionName rootProject.ext.versionName\n        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'\n//        ndk {\n//            // 设置支持的SO库架构\n//            abiFilters 'armeabi-v7a' , 'x86', 'x86_64'//, 'armeabi', 'arm64-v8a'\n//        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    sourceSets {\n        main {\n            if (isModule.toBoolean()) {\n                manifest.srcFile 'src/main/module/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/AndroidManifest.xml'\n            }\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.2.0'\n    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'\n    // required, enough for most devices.\n    implementation \"tv.danmaku.ijk.media:ijkplayer-java:$rootProject.ext.ijkplayerVersion\"\n    //implementation \"tv.danmaku.ijk.media:ijkplayer-armv7a:$rootProject.ext.ijkplayerVersion\"\n    //# ExoPlayer as IMediaPlayer: optional, experimental\n    implementation \"tv.danmaku.ijk.media:ijkplayer-exo:$rootProject.ext.ijkplayerVersion\"\n    //implementation 'com.tencent.bugly:crashreport:latest.release'\n    //implementation 'com.tencent.bugly:nativecrashreport:latest.release'\n    implementation \"pub.devrel:easypermissions:$rootProject.ext.easypermissionsVersion\"\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.2'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'\n    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'\n    implementation \"com.github.CymChad:BaseRecyclerViewAdapterHelper:$rootProject.ext.baseRecyclerAdapterVersion\"\n    implementation 'androidx.recyclerview:recyclerview:1.1.0'\n    implementation 'androidx.cardview:cardview:1.0.0'\n    implementation 'com.squareup.okhttp3:okhttp:3.14.0'\n    //烈焰弹幕\n    implementation \"com.github.ctiao:DanmakuFlameMaster:$rootProject.ext.danmakuVersion\"\n    implementation \"com.github.ctiao:ndkbitmap-armv7a:$rootProject.ext.danmakuNdk\"\n    // Other ABIs: optional\n    implementation \"com.github.ctiao:ndkbitmap-armv5:$rootProject.ext.danmakuNdk\"\n    implementation \"com.github.ctiao:ndkbitmap-x86:$rootProject.ext.danmakuNdk\"\n    implementation project(':common')\n}\n"
  },
  {
    "path": "ijkplayer/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n-dontwarn com.tencent.bugly.**\n-keep public class com.tencent.bugly.**{*;}"
  },
  {
    "path": "ijkplayer/src/androidTest/java/com/bilibili/lingxiao/ijkplayer/ExampleInstrumentedTest.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer\n\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.ext.junit.runners.AndroidJUnit4\n\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\nimport org.junit.Assert.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getTargetContext()\n        assertEquals(\"com.bilibili.lingxiao.ijkplayer\", appContext.packageName)\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.bilibili.lingxiao.ijkplayer\">\n\n</manifest>"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/MainActivity.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer\n\nimport android.Manifest\nimport android.app.AlertDialog\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport kotlinx.android.synthetic.main.activity_main.*\nimport pub.devrel.easypermissions.EasyPermissions\nimport android.Manifest.permission\nimport android.Manifest.permission.READ_EXTERNAL_STORAGE\nimport android.Manifest.permission.WRITE_EXTERNAL_STORAGE\nimport pub.devrel.easypermissions.AppSettingsDialog\n\n\nclass MainActivity : AppCompatActivity() ,EasyPermissions.PermissionCallbacks{\n    private val mPermessions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)\n    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {\n        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {\n            AppSettingsDialog.Builder(this).build().show()\n        }\n    }\n\n    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {\n\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)\n    }\n\n    var urls = arrayOf(\"http://videotest-1252348761.cos.ap-chengdu.myqcloud.com/background.mp4\",\n            \"rtsp://192.168.0.216:554/h264/ch1/main/av_stream\",\n        \"http://221.228.226.23/11/t/j/v/b/tjvbwspwhqdmgouolposcsfafpedmb/sh.yinyuetai.com/691201536EE4912BF7E4F1E2C67B8119.mp4\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        bt_url.setOnClickListener{\n            showSelect()\n        }\n        //权限检测\n        if (!EasyPermissions.hasPermissions(this, *mPermessions)){\n            //没有权限就申请\n            EasyPermissions.requestPermissions(this, \"申请权限\",\n                100, *mPermessions);\n        }\n\n\n    }\n\n    private fun showSelect() {\n        val builder = AlertDialog.Builder(this@MainActivity)\n        builder.setItems(urls) { dialogInterface, i ->\n            var intent = Intent(this@MainActivity,PlayActivity::class.java)\n            intent.putExtra(\"url\",urls[i])\n            startActivity(intent)\n            dialogInterface.dismiss()\n        }\n        builder.show();\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/NetworkUtil.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer\n\nimport android.content.Context\nimport android.net.ConnectivityManager\nimport android.telephony.TelephonyManager\nimport com.bilibili.lingxiao.ijkplayer.NetworkUtil.NetworkType\nimport androidx.core.content.ContextCompat.getSystemService\n\n\n\n\n\nobject  NetworkUtil{\n\n    enum class NetworkType {\n        // wifi\n        NETWORK_WIFI,\n        // 4G 网\n        NETWORK_4G,\n        // 3G 网\n        NETWORK_3G,\n        // 2G 网\n        NETWORK_2G,\n        // 未知网络\n        NETWORK_UNKNOWN,\n        // 没有网络\n        NETWORK_NO,\n        //网络断开或关闭\n        NETWORK_OFFLINE,\n        //以太网网络\n        NETWORK_ETHERNET\n    }\n    /**\n     * 获取当前网络类型\n     */\n    fun getNetworkType(context: Context):NetworkType {\n        val manager =\n            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n        val networkInfo = manager.activeNetworkInfo\n        var netType = NetworkType.NETWORK_NO\n        if (networkInfo == null){\n            /** 没有任何网络  */\n            netType = NetworkType.NETWORK_NO\n        }\n        if (!networkInfo.isConnected) {\n            /** 网络断开或关闭  */\n            netType = NetworkType.NETWORK_OFFLINE\n        }\n        if (networkInfo.type == ConnectivityManager.TYPE_ETHERNET) {\n            /** 以太网网络  */\n            netType = NetworkType.NETWORK_ETHERNET\n        } else if (networkInfo.type == ConnectivityManager.TYPE_WIFI) {\n            /** wifi网络，当激活时，默认情况下，所有的数据流量将使用此连接  */\n            netType = NetworkType.NETWORK_WIFI\n        } else if (networkInfo.type == ConnectivityManager.TYPE_MOBILE) {\n            /** 移动数据连接,不能与连接共存,如果wifi打开，则自动关闭  */\n            when (networkInfo.subtype) {\n                TelephonyManager.NETWORK_TYPE_GPRS, TelephonyManager.NETWORK_TYPE_EDGE, TelephonyManager.NETWORK_TYPE_CDMA, TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyManager.NETWORK_TYPE_IDEN ->\n                    /** 2G网络  */\n                    netType = NetworkType.NETWORK_2G\n                TelephonyManager.NETWORK_TYPE_UMTS, TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyManager.NETWORK_TYPE_EVDO_A, TelephonyManager.NETWORK_TYPE_HSDPA, TelephonyManager.NETWORK_TYPE_HSUPA, TelephonyManager.NETWORK_TYPE_HSPA, TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyManager.NETWORK_TYPE_HSPAP ->\n                    /** 3G网络  */\n                    netType = NetworkType.NETWORK_3G\n                TelephonyManager.NETWORK_TYPE_LTE ->\n                    /** 4G网络  */\n                    netType = NetworkType.NETWORK_4G\n            }\n        }\n        /** 未知网络 */\n        return netType\n    }\n\n\n    /**\n     * 判断移动数据是否打开\n     *\n     * @return `true`: 是<br></br>`false`: 否\n     */\n    fun isWifiState(context: Context): Boolean {\n        try {\n            val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager\n            val getMobileDataEnabledMethod = tm.javaClass.getDeclaredMethod(\"getDataEnabled\")\n            return getMobileDataEnabledMethod.invoke(tm) as Boolean\n        } catch (e: Exception) {\n            e.printStackTrace()\n        }\n        return false\n    }\n\n    /**\n     * 判断网络是否可用\n     *\n     * 需要异步 ping，如果 ping 不通就说明网络不可用\n     *\n     * @param ip ip 地址（自己服务器 ip），如果为空，ip 为阿里巴巴公共 ip\n     * @return `true`: 可用<br></br>`false`: 不可用\n     */\n    /*fun isAvailableByPing(ip: String?): Boolean {\n        var ip = ip\n        if (ip == null || ip.length <= 0) {\n            // 阿里巴巴公共 ip\n            ip = \"223.5.5.5\"\n        }\n        val result = Runtime.getRuntime().exec(String.format(\"ping -c 1 %s\", ip))\n\n        //val result = ShellUtil.execCmd(String.format(\"ping -c 1 %s\", ip), false)\n        val ret = result.result === 0\n        if (result.successMsg != null) {\n            Log.d(\"NetUtil\", \"isAvailableByPing() called\" + result.successMsg)\n        }\n        if (result.errorMsg != null) {\n            Log.d(\"NetUtil\", \"isAvailableByPing() called\" + result.errorMsg)\n        }\n        return ret\n    }*/\n}"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/PlayActivity.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer\n\nimport android.content.res.Configuration\nimport android.net.Uri\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.WindowManager\nimport com.bilibili.lingxiao.ijkplayer.media.IRenderView\nimport kotlinx.android.synthetic.main.activity_play.*\nimport kotlinx.android.synthetic.main.simple_player_view_player.*\nimport tv.danmaku.ijk.media.player.IjkMediaPlayer\n\nclass PlayActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_play)\n        //屏幕常亮\n        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n        /** 普通播放 start **/\n        var url = getIntent().getStringExtra(\"url\");\n        simple_view\n            .setVideoUrl(url)\n            .setVideoTitle(\"这是标题\")\n            .startPlay()\n\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        //横竖屏切换\n        var isPortrait = simple_view.onConfigurationChang(newConfig)\n        if (isPortrait) {\n            supportActionBar?.show()\n        } else {\n            supportActionBar?.hide()\n        }\n    }\n\n    override fun onBackPressed() {\n        simple_view.onBackPressed()\n        if (!simple_view.isPortrait){\n            supportActionBar?.show()\n        }else{\n            super.onBackPressed()\n        }\n    }\n\n    override fun onPause() {\n        super.onPause()\n        simple_view.onPause()\n    }\n\n    override fun onResume() {\n        super.onResume()\n        simple_view.onResume()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        simple_view.onDestory()\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/PlayState.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer\n\nobject PlayState {\n    /**\n     * 可能会剪裁,保持原视频的大小，显示在中心,当原视频的大小超过view的大小超过部分裁剪处理\n     */\n    val fitparent = 0\n    /**\n     * 可能会剪裁,等比例放大视频，直到填满View为止,超过View的部分作裁剪处理\n     */\n    val fillparent = 1\n    /**\n     * 将视频的内容完整居中显示，如果视频大于view,则按比例缩视频直到完全显示在view中\n     */\n    val wrapcontent = 2\n    /**\n     * 不剪裁,非等比例拉伸画面填满整个View\n     */\n    val fitxy = 3\n    /**\n     * 不剪裁,非等比例拉伸画面到16:9,并完全显示在View中\n     */\n    val f16_9 = 4\n    /**\n     * 不剪裁,非等比例拉伸画面到4:3,并完全显示在View中\n     */\n    val f4_3 = 5\n    /**====================视频裁剪比例 结束================================= */\n\n    /**====================进度条显示样式 开始================================= */\n\n    /**上下样式 */\n    val PROCESS_PORTRAIT = 0\n    /**左右样式 */\n    val PROCESS_LANDSCAPE = 1\n    /**中间两边样式 */\n    val PROCESS_CENTER = 2\n\n    /**====================进度条显示样式 结束================================= */\n\n\n    /**====================播放器中使用的播放状态 开始================================= */\n    /**\n     * 空闲\n     */\n    val STATE_IDLE = 330\n    /**\n     * 播放出错\n     */\n    val STATE_ERROR = 331\n    /**\n     * 准备中/加载中\n     */\n    val STATE_PREPARING = 332\n    /**\n     * 准备完成\n     */\n    val STATE_PREPARED = 333\n    /**\n     * 播放中\n     */\n    val STATE_PLAYING = 334\n    /**\n     * 暂停\n     */\n    val STATE_PAUSED = 335\n    /**\n     * 播放完成\n     */\n    val STATE_COMPLETED = 336\n    /**====================播放器中使用的播放状态 结束================================= */\n\n    /**====================ijk状态码表 开始================================= */\n    /*\n     * Do not change these values without updating their counterparts in native\n     */\n    val MEDIA_INFO_UNKNOWN = 1//未知信息\n    val MEDIA_INFO_STARTED_AS_NEXT = 2//播放下一条\n    val MEDIA_INFO_VIDEO_RENDERING_START = 3//视频开始整备中\n    val MEDIA_INFO_VIDEO_TRACK_LAGGING = 700//视频日志跟踪\n    val MEDIA_INFO_BUFFERING_START = 701//开始缓冲中\n    val MEDIA_INFO_BUFFERING_END = 702//缓冲结束\n    val MEDIA_INFO_BUFFERING_BYTES_UPDATE = 503//网速方面\n    val MEDIA_INFO_NETWORK_BANDWIDTH = 703//网络带宽，网速方面\n    val MEDIA_INFO_BAD_INTERLEAVING = 800//\n    val MEDIA_INFO_NOT_SEEKABLE = 801//不可设置播放位置，直播方面\n    val MEDIA_INFO_METADATA_UPDATE = 802//\n    val MEDIA_INFO_TIMED_TEXT_ERROR = 900\n    val MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901//不支持字幕\n    val MEDIA_INFO_SUBTITLE_TIMED_OUT = 902//字幕超时\n\n    val MEDIA_INFO_VIDEO_INTERRUPT = -10000//数据连接中断\n    val MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001//视频方向改变\n    val MEDIA_INFO_AUDIO_RENDERING_START = 10002//音频开始整备中\n\n    val MEDIA_ERROR_UNKNOWN = 1//未知错误\n    val MEDIA_ERROR_SERVER_DIED = 100//服务挂掉\n    val MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200//数据错误没有有效的回收\n    val MEDIA_ERROR_IO = -1004//IO错误\n    val MEDIA_ERROR_MALFORMED = -1007\n    val MEDIA_ERROR_UNSUPPORTED = -1010//数据不支持\n    val MEDIA_ERROR_TIMED_OUT = -110//数据超时\n    /**====================ijk状态码表 结束================================= */\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/application/App.java",
    "content": "package com.bilibili.lingxiao.ijkplayer.application;\n\nimport android.app.Application;\n//import com.tencent.bugly.crashreport.CrashReport;\n\npublic class App extends Application {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        //CrashReport.initCrashReport(getApplicationContext(), \"180f968345\", true);\n\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/application/Settings.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.application;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.preference.PreferenceManager;\nimport com.bilibili.lingxiao.ijkplayer.R;\n\npublic class Settings {\n    private Context mAppContext;\n    private SharedPreferences mSharedPreferences;\n\n    public static final int PV_PLAYER__Auto = 0;\n    public static final int PV_PLAYER__AndroidMediaPlayer = 1;\n    public static final int PV_PLAYER__IjkMediaPlayer = 2;\n    public static final int PV_PLAYER__IjkExoMediaPlayer = 3;\n\n    public Settings(Context context) {\n        mAppContext = context.getApplicationContext();\n        mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mAppContext);\n    }\n\n    public boolean getEnableBackgroundPlay() {\n        String key = mAppContext.getString(R.string.pref_key_enable_background_play);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public int getPlayer() {\n        String key = mAppContext.getString(R.string.pref_key_player);\n        String value = mSharedPreferences.getString(key, \"\");\n        try {\n            return Integer.valueOf(value).intValue();\n        } catch (NumberFormatException e) {\n            return 0;\n        }\n    }\n\n    public boolean getUsingMediaCodec() {\n        String key = mAppContext.getString(R.string.pref_key_using_media_codec);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getUsingMediaCodecAutoRotate() {\n        String key = mAppContext.getString(R.string.pref_key_using_media_codec_auto_rotate);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getMediaCodecHandleResolutionChange() {\n        String key = mAppContext.getString(R.string.pref_key_media_codec_handle_resolution_change);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getUsingOpenSLES() {\n        String key = mAppContext.getString(R.string.pref_key_using_opensl_es);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public String getPixelFormat() {\n        String key = mAppContext.getString(R.string.pref_key_pixel_format);\n        return mSharedPreferences.getString(key, \"\");\n    }\n\n    public boolean getEnableNoView() {\n        String key = mAppContext.getString(R.string.pref_key_enable_no_view);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getEnableSurfaceView() {\n        String key = mAppContext.getString(R.string.pref_key_enable_surface_view);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getEnableTextureView() {\n        String key = mAppContext.getString(R.string.pref_key_enable_texture_view);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getEnableDetachedSurfaceTextureView() {\n        String key = mAppContext.getString(R.string.pref_key_enable_detached_surface_texture);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public boolean getUsingMediaDataSource() {\n        String key = mAppContext.getString(R.string.pref_key_using_mediadatasource);\n        return mSharedPreferences.getBoolean(key, false);\n    }\n\n    public String getLastDirectory() {\n        String key = mAppContext.getString(R.string.pref_key_last_directory);\n        return mSharedPreferences.getString(key, \"/\");\n    }\n\n    public void setLastDirectory(String path) {\n        String key = mAppContext.getString(R.string.pref_key_last_directory);\n        mSharedPreferences.edit().putString(key, path).apply();\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/danmuku/BiliDanmuku.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer.danmuku\n\nimport android.graphics.Color\nimport android.util.Log\nimport master.flame.danmaku.controller.DrawHandler\nimport master.flame.danmaku.danmaku.loader.android.DanmakuLoaderFactory\nimport master.flame.danmaku.danmaku.model.BaseDanmaku\nimport master.flame.danmaku.danmaku.model.DanmakuTimer\nimport master.flame.danmaku.danmaku.model.IDisplayer\nimport master.flame.danmaku.danmaku.model.android.DanmakuContext\nimport master.flame.danmaku.danmaku.parser.BaseDanmakuParser\nimport master.flame.danmaku.ui.widget.DanmakuView\nimport java.io.ByteArrayInputStream\nimport java.util.HashMap\n\nobject BiliDanmuku {\n    //弹幕字体大小偏移量 1f是xml解析之后原始的大小\n    public val textSizeOffset = 1.3f\n    private val mDanmakuContext by lazy { DanmakuContext.create() }\n    private var initialized = false\n    private val TAG = BiliDanmuku::class.java.simpleName\n\n\n    /**\n     * 初始化弹幕库  只需要初始化一次\n     */\n    fun initDanmaku(danmakuView: DanmakuView) {\n        if (initialized) return\n        // 设置最大行数,从右向左滚动(有其它方向可选)\n        var maxLinesPair = HashMap<Int, Int>()\n        maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 3)\n        //配置弹幕库\n        danmakuView.enableDanmakuDrawingCache(true)\n        // 设置是否禁止重叠\n        var overlappingEnablePair = HashMap<Int, Boolean>()\n        overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_LR, true)\n        overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_BOTTOM, true)\n        mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3f) //设置描边样式\n            .setDuplicateMergingEnabled(false)\n            .setScrollSpeedFactor(1.2f) //是否启用合并重复弹幕\n            .setScaleTextSize(1.2f) //设置弹幕滚动速度系数,只对滚动弹幕有效\n            // 默认使用{@link SimpleTextCacheStuffer}只支持纯文字显示,\n            // 如果需要图文混排请设置{@link SpannedCacheStuffer}\n            // 如果需要定制其他样式请扩展{@link SimpleTextCacheStuffer}|{@link SpannedCacheStuffer}\n            .setMaximumLines(maxLinesPair) //设置最大显示行数\n            .preventOverlapping(overlappingEnablePair) //设置防弹幕重叠，null为允许重叠\n        initialized = true\n    }\n\n    /**\n     * 添加文本弹幕\n     * @param islive 直播弹幕\n     * @param density 像素密度\n     * @param text 要发送的弹幕\n     * @param danmakuContext 弹幕上下文\n     */\n    fun addDanmaku(islive: Boolean, density: Float, text:String, danmakuView: DanmakuView?) {\n        val danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL)\n        if (danmaku == null || danmakuView == null) {\n            return\n        }\n        danmaku.text = text + System.nanoTime()\n        danmaku.padding = 5\n        danmaku.priority = 0  //0 表示可能会被各种过滤器过滤并隐藏显示 //1 表示一定会显示, 一般用于本机发送的弹幕\n        danmaku.isLive = islive //是否是直播弹幕\n        //danmaku.time = danmakuView.getCurrentTime() + 1200; //显示时间\n        danmaku.textSize = 25f * (density - 0.6f) / textSizeOffset\n        danmaku.textColor = Color.RED\n        danmaku.textShadowColor = Color.WHITE //阴影/描边颜色\n        danmaku.borderColor = Color.GREEN //边框颜色，0表示无边框\n        danmakuView.addDanmaku(danmaku)\n    }\n\n    /**\n     * 解析弹幕\n     * @param danmakuData 弹幕数据\n     */\n    fun parseDanmaku(danmakuData:ByteArray?): BiliDanmukuParser{\n        var loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI)\n        var bytes = BiliDanmukuCompressionTools.decompressXML(danmakuData)\n        var inputStream = ByteArrayInputStream(bytes)\n        loader.load(inputStream)\n        val parser = BiliDanmukuParser()\n        assert(loader != null)\n        val dataSource = loader.dataSource\n        parser.load(dataSource)\n        return parser\n    }\n\n    /**\n     * 播放弹幕\n     * @param danmakuParser 弹幕解析类\n     * @param danmakuView\n     */\n    fun playDanmaku(danmakuParser: BaseDanmakuParser,danmakuView: DanmakuView){\n        danmakuView.prepare(danmakuParser, mDanmakuContext)\n        danmakuView.showFPS(false)//是否显示FPS\n        danmakuView.enableDanmakuDrawingCache(true)\n        danmakuView.setCallback(object : DrawHandler.Callback {\n            override fun prepared() {\n                danmakuView.start()\n                Log.d(TAG,\"开始播放弹幕\")\n            }\n\n            override fun updateTimer(danmakuTimer: DanmakuTimer) {\n\n            }\n\n            override fun danmakuShown(danmaku: BaseDanmaku) {\n                //Log.d(TAG,\"弹幕：\" + danmaku.text)\n            }\n\n            override fun drawingFinished() {\n\n            }\n        })\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/danmuku/BiliDanmukuCompressionTools.java",
    "content": "package com.bilibili.lingxiao.ijkplayer.danmuku;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.util.zip.DataFormatException;\nimport java.util.zip.Deflater;\nimport java.util.zip.Inflater;\n\n/**\n * @author zzq  作者 E-mail:   soleilyoyiyi@gmail.com\n * @date 创建时间：2017/6/23 9:03\n * 描述:压缩工具\n */\npublic class BiliDanmukuCompressionTools {\n    // Export only static methods\n    private BiliDanmukuCompressionTools() {\n\n    }\n\n    public static byte[] compress(byte[] value, int offset, int length, int compressionLevel) {\n        ByteArrayOutputStream bos = new ByteArrayOutputStream(length);\n        Deflater compressor = new Deflater();\n        try {\n            compressor.setLevel(compressionLevel); // 将当前压缩级别设置为指定值。\n            compressor.setInput(value, offset, length);\n            compressor.finish(); // 调用时，指示压缩应当以输入缓冲区的当前内容结尾。\n            // Compress the data\n            final byte[] buf = new byte[1024];\n            while (!compressor.finished()) {\n                // 如果已到达压缩数据输出流的结尾，则返回 true。\n                int count = compressor.deflate(buf);\n                // 使用压缩数据填充指定缓冲区。\n                bos.write(buf, 0, count);\n            }\n        } finally {\n            compressor.end(); // 关闭解压缩器并放弃所有未处理的输入。\n        }\n        return bos.toByteArray();\n    }\n\n    public static byte[] compress(byte[] value, int offset, int length) {\n        return compress(value, offset, length, Deflater.BEST_COMPRESSION);\n        // 最佳压缩的压缩级别\n    }\n\n    public static byte[] compress(byte[] value) {\n        return compress(value, 0, value.length, Deflater.BEST_COMPRESSION);\n    }\n\n    public static byte[] decompress(byte[] value) throws DataFormatException {\n\n        ByteArrayOutputStream bos = new ByteArrayOutputStream(value.length);\n\n        Inflater decompressor = new Inflater();\n\n        try {\n            decompressor.setInput(value);\n\n            final byte[] buf = new byte[1024];\n            while (!decompressor.finished()) {\n                int count = decompressor.inflate(buf);\n                bos.write(buf, 0, count);\n            }\n        } finally {\n            decompressor.end();\n        }\n\n        return bos.toByteArray();\n    }\n\n    /**\n     * 解压缩\n     * @param data\n     * @return\n     */\n    public static byte[] decompressXML(byte[] data) {\n\n        byte[] dest = new byte[data.length + 2];\n        System.arraycopy(data, 0, dest, 2, data.length);\n        dest[0] = 0x78;\n        dest[1] = 0x01;\n        data = dest;\n        Inflater decompresser = new Inflater();\n        decompresser.setInput(data);\n\n        byte[] bufferArray = new byte[1024];\n        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);\n        try {\n            int i = 1;\n            while (i != 0) {\n                i = decompresser.inflate(bufferArray);\n                baos.write(bufferArray, 0, i);\n            }\n            data = baos.toByteArray();\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            try {\n                baos.flush();\n                baos.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n\n        decompresser.end();\n        return data;\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/danmuku/BiliDanmukuParser.java",
    "content": "package com.bilibili.lingxiao.ijkplayer.danmuku;\n\nimport android.graphics.Color;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport master.flame.danmaku.danmaku.model.*;\nimport master.flame.danmaku.danmaku.model.android.DanmakuFactory;\nimport master.flame.danmaku.danmaku.model.android.Danmakus;\nimport master.flame.danmaku.danmaku.parser.BaseDanmakuParser;\nimport master.flame.danmaku.danmaku.parser.android.AndroidFileSource;\nimport master.flame.danmaku.danmaku.util.DanmakuUtils;\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.xml.sax.Attributes;\nimport org.xml.sax.InputSource;\nimport org.xml.sax.SAXException;\nimport org.xml.sax.XMLReader;\nimport org.xml.sax.helpers.DefaultHandler;\nimport org.xml.sax.helpers.XMLReaderFactory;\n\nimport java.io.IOException;\nimport java.util.Locale;\n\n/**\n * @author zzq  作者 E-mail:   soleilyoyiyi@gmail.com\n * @date 创建时间：2017/6/23 9:03\n * 描述:弹幕解析\n */\npublic class BiliDanmukuParser extends BaseDanmakuParser {\n\n    static {\n        System.setProperty(\"org.xml.sax.driver\", \"org.xmlpull.v1.sax2.Driver\");\n    }\n\n    private float mDispScaleX;\n    private float mDispScaleY;\n    private static final String TAG = BiliDanmukuParser.class.getSimpleName();\n    @Override\n    public Danmakus parse() {\n\n        if (mDataSource != null) {\n            AndroidFileSource source = (AndroidFileSource) mDataSource;\n            try {\n                XMLReader xmlReader = XMLReaderFactory.createXMLReader();\n                XmlContentHandler contentHandler = new XmlContentHandler();\n                xmlReader.setContentHandler(contentHandler);\n                xmlReader.parse(new InputSource(source.data()));\n                return contentHandler.getResult();\n            } catch (SAXException e) {\n                e.printStackTrace();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n\n        }\n\n        return null;\n    }\n\n    public class XmlContentHandler extends DefaultHandler {\n\n        private static final String TRUE_STRING = \"true\";\n\n        public Danmakus result = null;\n\n        public BaseDanmaku item = null;\n\n        public boolean completed = false;\n\n        public int index = 0;\n        public GlobalFlagValues flag = new GlobalFlagValues();\n\n        public Danmakus getResult() {\n            return result;\n        }\n\n        @Override\n        public void startDocument() throws SAXException {\n            result = new Danmakus();\n        }\n\n        @Override\n        public void endDocument() throws SAXException {\n            completed = true;\n        }\n\n        @Override\n        public void startElement(String uri, String localName, String qName, Attributes attributes)\n                throws SAXException {\n            String tagName = localName.length() != 0 ? localName : qName;\n            tagName = tagName.toLowerCase(Locale.getDefault()).trim();\n            if (tagName.equals(\"d\")) {\n                // <d p=\"23.826000213623,1,25,16777215,1422201084,0,057075e9,757076900\">我从未见过如此厚颜无耻之猴</d>\n                // 0:时间(弹幕出现时间)\n                // 1:类型(1从右至左滚动弹幕|6从左至右滚动弹幕|5顶端固定弹幕|4底端固定弹幕|7高级弹幕|8脚本弹幕)\n                // 2:字号\n                // 3:颜色\n                // 4:时间戳 ?\n                // 5:弹幕池id\n                // 6:用户hash\n                // 7:弹幕id\n                String pValue = attributes.getValue(\"p\");\n                // parse p value to danmaku\n                String[] values = pValue.split(\",\");\n                if (values.length > 0) {\n                    long time = (long) (Float.parseFloat(values[0]) * 1000); // 出现时间\n                    int type = Integer.parseInt(values[1]); // 弹幕类型\n                    float textSize = Float.parseFloat(values[2]); // 字体大小\n                    int color = (int) ((0x00000000ff000000 | Long.parseLong(values[3])) & 0x00000000ffffffff); // 颜色\n                    // int poolType = Integer.parseInt(values[5]); // 弹幕池类型（忽略\n                    item = mContext.mDanmakuFactory.createDanmaku(type, mContext);\n                    if (item != null) {\n                        item.setTime(time);\n                        item.textSize = textSize * (mDispDensity - 0.6f) / BiliDanmuku.INSTANCE.getTextSizeOffset();\n                        item.textColor = color;\n                        item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK;\n                        item.flags = flag;\n                        //Log.i(TAG,\"字体大小：\"+item.textSize);\n                    }\n                }\n            }\n        }\n\n        @Override\n        public void endElement(String uri, String localName, String qName) throws SAXException {\n            if (item != null) {\n                if (item.duration != null) {\n                    String tagName = localName.length() != 0 ? localName : qName;\n                    if (tagName.equalsIgnoreCase(\"d\")) {\n                        item.setTimer(mTimer);\n                        result.addItem(item);\n                    }\n                }\n                item = null;\n            }\n        }\n\n        @Override\n        public void characters(char[] ch, int start, int length) {\n            if (item != null) {\n                DanmakuUtils.fillText(item, decodeXmlString(new String(ch, start, length)));\n                item.index = index++;\n\n                // initial specail danmaku data\n                String text = String.valueOf(item.text).trim();\n                if (item.getType() == BaseDanmaku.TYPE_SPECIAL && text.startsWith(\"[\")\n                        && text.endsWith(\"]\")) {\n                    //text = text.substring(1, text.length() - 1);\n                    String[] textArr = null;//text.split(\",\", -1);\n                    try {\n                        JSONArray jsonArray = new JSONArray(text);\n                        textArr = new String[jsonArray.length()];\n                        for (int i = 0; i < textArr.length; i++) {\n                            textArr[i] = jsonArray.getString(i);\n                        }\n                    } catch (JSONException e) {\n                        e.printStackTrace();\n                    }\n\n                    if (textArr == null || textArr.length < 5) {\n                        item = null;\n                        return;\n                    }\n                    item.text = textArr[4];\n                    float beginX = Float.parseFloat(textArr[0]);\n                    float beginY = Float.parseFloat(textArr[1]);\n                    float endX = beginX;\n                    float endY = beginY;\n                    String[] alphaArr = textArr[2].split(\"-\");\n                    int beginAlpha = (int) (AlphaValue.MAX * Float.parseFloat(alphaArr[0]));\n                    int endAlpha = beginAlpha;\n                    if (alphaArr.length > 1) {\n                        endAlpha = (int) (AlphaValue.MAX * Float.parseFloat(alphaArr[1]));\n                    }\n                    long alphaDuraion = (long) (Float.parseFloat(textArr[3]) * 1000);\n                    long translationDuration = alphaDuraion;\n                    long translationStartDelay = 0;\n                    float rotateY = 0, rotateZ = 0;\n                    if (textArr.length >= 7) {\n                        rotateZ = Float.parseFloat(textArr[5]);\n                        rotateY = Float.parseFloat(textArr[6]);\n                    }\n                    if (textArr.length >= 11) {\n                        endX = Float.parseFloat(textArr[7]);\n                        endY = Float.parseFloat(textArr[8]);\n                        if (!\"\".equals(textArr[9])) {\n                            translationDuration = Integer.parseInt(textArr[9]);\n                        }\n                        if (!\"\".equals(textArr[10])) {\n                            translationStartDelay = (long) (Float.parseFloat(textArr[10]));\n                        }\n                    }\n                    if (isPercentageNumber(beginX)) {\n                        beginX *= DanmakuFactory.BILI_PLAYER_WIDTH;\n                    }\n                    if (isPercentageNumber(beginY)) {\n                        beginY *= DanmakuFactory.BILI_PLAYER_HEIGHT;\n                    }\n                    if (isPercentageNumber(endX)) {\n                        endX *= DanmakuFactory.BILI_PLAYER_WIDTH;\n                    }\n                    if (isPercentageNumber(endY)) {\n                        endY *= DanmakuFactory.BILI_PLAYER_HEIGHT;\n                    }\n                    item.duration = new Duration(alphaDuraion);\n                    item.rotationZ = rotateZ;\n                    item.rotationY = rotateY;\n                    mContext.mDanmakuFactory.fillTranslationData(item, beginX,\n                            beginY, endX, endY, translationDuration, translationStartDelay, mDispScaleX, mDispScaleY);\n                    mContext.mDanmakuFactory.fillAlphaData(item, beginAlpha, endAlpha, alphaDuraion);\n\n                    if (textArr.length >= 12) {\n                        // 是否有描边\n                        if (!TextUtils.isEmpty(textArr[11]) && TRUE_STRING.equals(textArr[11])) {\n                            item.textShadowColor = Color.TRANSPARENT;\n                        }\n                    }\n                    if (textArr.length >= 13) {\n                        //TODO 字体 textArr[12]\n                    }\n                    if (textArr.length >= 14) {\n                        //TODO 是否有动画缓冲(easing)\n                    }\n                    if (textArr.length >= 15) {\n                        // 路径数据\n                        if (!\"\".equals(textArr[14])) {\n                            String motionPathString = textArr[14].substring(1);\n                            String[] pointStrArray = motionPathString.split(\"L\");\n                            if (pointStrArray != null && pointStrArray.length > 0) {\n                                float[][] points = new float[pointStrArray.length][2];\n                                for (int i = 0; i < pointStrArray.length; i++) {\n                                    String[] pointArray = pointStrArray[i].split(\",\");\n                                    points[i][0] = Float.parseFloat(pointArray[0]);\n                                    points[i][1] = Float.parseFloat(pointArray[1]);\n                                }\n                                mContext.mDanmakuFactory.fillLinePathData(item, points, mDispScaleX,\n                                        mDispScaleY);\n                            }\n                        }\n                    }\n                }\n\n            }\n        }\n\n        private String decodeXmlString(String title) {\n            if (title.contains(\"&amp;\")) {\n                title = title.replace(\"&amp;\", \"&\");\n            }\n            if (title.contains(\"&quot;\")) {\n                title = title.replace(\"&quot;\", \"\\\"\");\n            }\n            if (title.contains(\"&gt;\")) {\n                title = title.replace(\"&gt;\", \">\");\n            }\n            if (title.contains(\"&lt;\")) {\n                title = title.replace(\"&lt;\", \"<\");\n            }\n            return title;\n        }\n\n    }\n\n    private boolean isPercentageNumber(float number) {\n        return number >= 0f && number <= 1f;\n    }\n\n    @Override\n    public BaseDanmakuParser setDisplayer(IDisplayer disp) {\n        super.setDisplayer(disp);\n        mDispScaleX = mDispWidth / DanmakuFactory.BILI_PLAYER_WIDTH;\n        mDispScaleY = mDispHeight / DanmakuFactory.BILI_PLAYER_HEIGHT;\n        return this;\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/localvideo/VideoAdapter.java",
    "content": "package com.bilibili.lingxiao.ijkplayer.localvideo;\n\n\n\nimport androidx.annotation.Nullable;\nimport com.bilibili.lingxiao.ijkplayer.R;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\n\nimport java.util.List;\n\n\npublic class VideoAdapter extends BaseQuickAdapter<VideoModel,BaseViewHolder> {\n    public VideoAdapter(int layoutResId, @Nullable List<VideoModel> data) {\n        super(layoutResId, data);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder helper, VideoModel item) {\n        int size = item.getSize();\n        float sizeF = size /1024f/1024f;\n        helper.setText(R.id.tv_name,\"标题：\"+item.getName());\n        if (String.valueOf(sizeF).length() > 4){\n            helper.setText(R.id.tv_size,\"大小：\"+(sizeF+\"\").substring(0,4)+\"M\");\n        }else {\n            helper.setText(R.id.tv_size,\"大小：\" + sizeF + \"M\");\n        }\n        helper.setText(R.id.tv_path,\"路径：\"+item.getPath());\n        helper.addOnClickListener(R.id.cardView);\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/localvideo/VideoListActivity.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer.localvideo\n\nimport android.Manifest\nimport android.content.Intent\nimport android.database.Cursor\nimport android.net.Uri\nimport android.os.Bundle\nimport android.os.PersistableBundle\nimport android.provider.MediaStore\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport android.util.Log\nimport android.view.View\nimport com.bilibili.lingxiao.ijkplayer.PlayActivity\nimport com.bilibili.lingxiao.ijkplayer.R\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.BaseViewHolder\nimport kotlinx.android.synthetic.main.activity_video_list.*\n\n\nimport java.util.ArrayList\n\n\nimport pub.devrel.easypermissions.EasyPermissions\n\nclass VideoListActivity : AppCompatActivity() {\n\n    private val listImage = ArrayList<VideoModel>()\n    private var mAdapter: VideoAdapter? = null\n\n    private val projection = arrayOf(\n        MediaStore.Video.Media._ID,\n        MediaStore.Video.Media.DISPLAY_NAME,\n        MediaStore.Video.Media.SIZE,\n        MediaStore.Video.Media.DATA\n    )\n    private val orderBy = MediaStore.Video.Media.DISPLAY_NAME\n    private val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI\n\n    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {\n        super.onCreate(savedInstanceState, persistentState)\n        setContentView( R.layout.activity_video_list)\n\n        val actionBar = supportActionBar\n        if (actionBar != null) {\n            actionBar.setDisplayHomeAsUpEnabled(true)\n            actionBar.setTitle(\"本地视频列表\")\n        }\n        val manager = androidx.recyclerview.widget.LinearLayoutManager(this)\n        recycerView.layoutManager = manager\n        mAdapter = VideoAdapter(R.layout.video_item, listImage)\n        recycerView.adapter = mAdapter\n        swipeLayout.setRefreshing(true)\n\n        val perms = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)\n        if (!EasyPermissions.hasPermissions(this, *perms)) {\n            EasyPermissions.requestPermissions(this, \"需要权限\", 100, *perms)\n        } else {\n            getContentProvider(uri, projection, orderBy)\n        }\n\n        mAdapter!!.setOnItemChildClickListener { adapter: BaseQuickAdapter<Any,BaseViewHolder>, view: View, position: Int ->\n            val intent = Intent(applicationContext, PlayActivity::class.java)\n            intent.putExtra(\"path\", listImage[position].path)\n            startActivity(intent)\n        }\n        swipeLayout.setOnRefreshListener({\n            listImage.clear()\n            getContentProvider(uri, projection, orderBy)\n        })\n        swipeLayout.setColorSchemeColors(\n            resources.getColor(R.color.colorPrimary),\n            resources.getColor(R.color.colorAccent)\n        )\n    }\n\n\n    /**\n     * 获取ContentProvider\n     * @param projection\n     * @param orderBy\n     */\n    fun getContentProvider(uri: Uri, projection: Array<String>, orderBy: String) {\n        // TODO Auto-generated method stub\n        val cursor = contentResolver.query(uri, projection, null, null, orderBy) ?: return\n        if (cursor.moveToFirst()) {\n            do {\n                val model = VideoModel()\n                model.id = cursor.getLong(0)\n                model.name = cursor.getString(1)\n                model.size = cursor.getInt(2)\n                model.path = cursor.getString(3)\n                listImage.add(model)\n            } while (cursor.moveToNext())\n        }\n        cursor.close()\n        mAdapter!!.notifyDataSetChanged()\n        swipeLayout.setRefreshing(false)\n        Log.d(TAG, \"getContentProvider: $listImage\")\n    }\n\n    companion object {\n        private val TAG = VideoListActivity::class.java.simpleName\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/localvideo/VideoModel.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer.localvideo\n\nclass VideoModel {\n    var id: Long = 0\n    var name: String? = null\n    var size: Int = 0\n    var path: String? = null\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/AndroidMediaController.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.content.Context;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.MediaController;\n\nimport java.util.ArrayList;\n\npublic class AndroidMediaController extends MediaController implements IMediaController {\n    private ActionBar mActionBar;\n\n    public AndroidMediaController(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initView(context);\n    }\n\n    public AndroidMediaController(Context context, boolean useFastForward) {\n        super(context, useFastForward);\n        initView(context);\n    }\n\n    public AndroidMediaController(Context context) {\n        super(context);\n        initView(context);\n    }\n\n    private void initView(Context context) {\n    }\n\n    public void setSupportActionBar(@Nullable ActionBar actionBar) {\n        mActionBar = actionBar;\n        if (isShowing()) {\n            actionBar.show();\n        } else {\n            actionBar.hide();\n        }\n    }\n\n    @Override\n    public void show() {\n        super.show();\n        if (mActionBar != null)\n            mActionBar.show();\n    }\n\n    @Override\n    public void hide() {\n        super.hide();\n        if (mActionBar != null)\n            mActionBar.hide();\n        for (View view : mShowOnceArray)\n            view.setVisibility(View.GONE);\n        mShowOnceArray.clear();\n    }\n\n    //----------\n    // Extends\n    //----------\n    private ArrayList<View> mShowOnceArray = new ArrayList<View>();\n\n    public void showOnce(@NonNull View view) {\n        mShowOnceArray.add(view);\n        view.setVisibility(View.VISIBLE);\n        show();\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/FileMediaDataSource.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\n\nimport tv.danmaku.ijk.media.player.misc.IMediaDataSource;\n\npublic class FileMediaDataSource implements IMediaDataSource {\n    private RandomAccessFile mFile;\n    private long mFileSize;\n\n    public FileMediaDataSource(File file) throws IOException {\n        mFile = new RandomAccessFile(file, \"r\");\n        mFileSize = mFile.length();\n    }\n\n    @Override\n    public int readAt(long position, byte[] buffer, int offset, int size) throws IOException {\n        if (mFile.getFilePointer() != position)\n            mFile.seek(position);\n\n        if (size == 0)\n            return 0;\n\n        return mFile.read(buffer, 0, size);\n    }\n\n    @Override\n    public long getSize() throws IOException {\n        return mFileSize;\n    }\n\n    @Override\n    public void close() throws IOException {\n        mFileSize = 0;\n        mFile.close();\n        mFile = null;\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/IMediaController.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.view.View;\nimport android.widget.MediaController;\n\npublic interface IMediaController {\n    void hide();\n\n    boolean isShowing();\n\n    void setAnchorView(View view);\n\n    void setEnabled(boolean enabled);\n\n    void setMediaPlayer(MediaController.MediaPlayerControl player);\n\n    void show(int timeout);\n\n    void show();\n\n    //----------\n    // Extends\n    //----------\n    void showOnce(View view);\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/IRenderView.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.graphics.SurfaceTexture;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport android.view.Surface;\nimport android.view.SurfaceHolder;\nimport android.view.View;\n\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\n\npublic interface IRenderView {\n    int AR_ASPECT_FIT_PARENT = 0; // without clip\n    int AR_ASPECT_FILL_PARENT = 1; // may clip\n    int AR_ASPECT_WRAP_CONTENT = 2;\n    int AR_MATCH_PARENT = 3;\n    int AR_16_9_FIT_PARENT = 4;\n    int AR_4_3_FIT_PARENT = 5;\n\n    View getView();\n\n    boolean shouldWaitForResize();\n\n    void setVideoSize(int videoWidth, int videoHeight);\n\n    void setVideoSampleAspectRatio(int videoSarNum, int videoSarDen);\n\n    void setVideoRotation(int degree);\n\n    void setAspectRatio(int aspectRatio);\n\n    void addRenderCallback(@NonNull IRenderCallback callback);\n\n    void removeRenderCallback(@NonNull IRenderCallback callback);\n\n    interface ISurfaceHolder {\n        void bindToMediaPlayer(IMediaPlayer mp);\n\n        @NonNull\n        IRenderView getRenderView();\n\n        @Nullable\n        SurfaceHolder getSurfaceHolder();\n\n        @Nullable\n        Surface openSurface();\n\n        @Nullable\n        SurfaceTexture getSurfaceTexture();\n    }\n\n    interface IRenderCallback {\n        /**\n         * @param holder\n         * @param width  could be 0\n         * @param height could be 0\n         */\n        void onSurfaceCreated(@NonNull ISurfaceHolder holder, int width, int height);\n\n        /**\n         * @param holder\n         * @param format could be 0\n         * @param width\n         * @param height\n         */\n        void onSurfaceChanged(@NonNull ISurfaceHolder holder, int format, int width, int height);\n\n        void onSurfaceDestroyed(@NonNull ISurfaceHolder holder);\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/IjkVideoView.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.res.Resources;\nimport android.media.AudioManager;\nimport android.media.MediaPlayer;\nimport android.net.Uri;\nimport android.os.Build;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport android.widget.MediaController;\nimport android.widget.TableLayout;\nimport android.widget.TextView;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\n\nimport com.bilibili.lingxiao.ijkplayer.R;\nimport com.bilibili.lingxiao.ijkplayer.application.Settings;\nimport com.bilibili.lingxiao.ijkplayer.services.MediaPlayerService;\nimport tv.danmaku.ijk.media.exo.IjkExoMediaPlayer;\nimport tv.danmaku.ijk.media.player.AndroidMediaPlayer;\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\nimport tv.danmaku.ijk.media.player.IjkMediaPlayer;\nimport tv.danmaku.ijk.media.player.IjkTimedText;\nimport tv.danmaku.ijk.media.player.TextureMediaPlayer;\nimport tv.danmaku.ijk.media.player.misc.IMediaDataSource;\nimport tv.danmaku.ijk.media.player.misc.IMediaFormat;\nimport tv.danmaku.ijk.media.player.misc.ITrackInfo;\nimport tv.danmaku.ijk.media.player.misc.IjkMediaFormat;\n\npublic class IjkVideoView extends FrameLayout implements MediaController.MediaPlayerControl {\n    private String TAG = \"IjkVideoView\";\n    // settable by the client\n    private Uri mUri;\n    private Map<String, String> mHeaders;\n\n    // all possible internal states\n    private static final int STATE_ERROR = -1;\n    private static final int STATE_IDLE = 0;\n    private static final int STATE_PREPARING = 1;\n    private static final int STATE_PREPARED = 2;\n    private static final int STATE_PLAYING = 3;\n    private static final int STATE_PAUSED = 4;\n    private static final int STATE_PLAYBACK_COMPLETED = 5;\n\n    // mCurrentState is a VideoView object's current state.\n    // mTargetState is the state that a method caller intends to reach.\n    // For instance, regardless the VideoView object's current state,\n    // calling pause() intends to bring the object to a target state\n    // of STATE_PAUSED.\n    private int mCurrentState = STATE_IDLE;\n    private int mTargetState = STATE_IDLE;\n\n    // All the stuff we need for playing and showing a video\n    private IRenderView.ISurfaceHolder mSurfaceHolder = null;\n    private IMediaPlayer mMediaPlayer = null;\n    // private int         mAudioSession;\n    private int mVideoWidth;\n    private int mVideoHeight;\n    private int mSurfaceWidth;\n    private int mSurfaceHeight;\n    private int mVideoRotationDegree;\n    private IMediaController mMediaController;\n    private IMediaPlayer.OnCompletionListener mOnCompletionListener;\n    private IMediaPlayer.OnPreparedListener mOnPreparedListener;\n    private int mCurrentBufferPercentage;\n    private IMediaPlayer.OnErrorListener mOnErrorListener;\n    private IMediaPlayer.OnInfoListener mOnInfoListener;\n    private int mSeekWhenPrepared;  // recording the seek position while preparing\n    private boolean mCanPause = true;\n    private boolean mCanSeekBack = true;\n    private boolean mCanSeekForward = true;\n\n    /** Subtitle rendering widget overlaid on top of the video. */\n    // private RenderingWidget mSubtitleWidget;\n\n    /**\n     * Listener for changes to subtitle data, used to redraw when needed.\n     */\n    // private RenderingWidget.OnChangedListener mSubtitlesChangedListener;\n\n    private Context mAppContext;\n    private Settings mSettings;\n    private IRenderView mRenderView;\n    private int mVideoSarNum;\n    private int mVideoSarDen;\n\n    private InfoHudViewHolder mHudViewHolder;\n\n    private long mPrepareStartTime = 0;\n    private long mPrepareEndTime = 0;\n\n    private long mSeekStartTime = 0;\n    private long mSeekEndTime = 0;\n\n    private TextView subtitleDisplay;\n\n    public IjkVideoView(Context context) {\n        super(context);\n        initVideoView(context);\n    }\n\n    public IjkVideoView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initVideoView(context);\n    }\n\n    public IjkVideoView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        initVideoView(context);\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public IjkVideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        initVideoView(context);\n    }\n\n    // REMOVED: onMeasure\n    // REMOVED: onInitializeAccessibilityEvent\n    // REMOVED: onInitializeAccessibilityNodeInfo\n    // REMOVED: resolveAdjustedSize\n\n    private void initVideoView(Context context) {\n        mAppContext = context.getApplicationContext();\n        mSettings = new Settings(mAppContext);\n\n        initBackground();\n        initRenders();  //初始化渲染器\n\n        mVideoWidth = 0;\n        mVideoHeight = 0;\n        // REMOVED: getHolder().addCallback(mSHCallback);\n        // REMOVED: getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);\n        setFocusable(true);\n        setFocusableInTouchMode(true);\n        requestFocus();\n        // REMOVED: mPendingSubtitleTracks = new Vector<Pair<InputStream, MediaFormat>>();\n        mCurrentState = STATE_IDLE;\n        mTargetState = STATE_IDLE;\n\n        subtitleDisplay = new TextView(context);\n        subtitleDisplay.setTextSize(24);\n        subtitleDisplay.setGravity(Gravity.CENTER);\n        LayoutParams layoutParams_txt = new LayoutParams(\n                LayoutParams.MATCH_PARENT,\n                LayoutParams.WRAP_CONTENT,\n                Gravity.BOTTOM);\n        addView(subtitleDisplay, layoutParams_txt);\n    }\n\n    public void setRenderView(IRenderView renderView) {\n        if (mRenderView != null) {\n            if (mMediaPlayer != null)\n                mMediaPlayer.setDisplay(null);\n\n            View renderUIView = mRenderView.getView();\n            mRenderView.removeRenderCallback(mSHCallback);\n            mRenderView = null;\n            removeView(renderUIView);\n        }\n\n        if (renderView == null)\n            return;\n\n        mRenderView = renderView;\n        renderView.setAspectRatio(mCurrentAspectRatio);\n        if (mVideoWidth > 0 && mVideoHeight > 0)\n            renderView.setVideoSize(mVideoWidth, mVideoHeight);\n        if (mVideoSarNum > 0 && mVideoSarDen > 0)\n            renderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen);\n\n        View renderUIView = mRenderView.getView();\n        LayoutParams lp = new LayoutParams(\n                LayoutParams.WRAP_CONTENT,\n                LayoutParams.WRAP_CONTENT,\n                Gravity.CENTER);\n        renderUIView.setLayoutParams(lp);\n        addView(renderUIView);\n\n        mRenderView.addRenderCallback(mSHCallback);\n        mRenderView.setVideoRotation(mVideoRotationDegree);\n    }\n\n    public void setAspectRatio(int arAspectFitParent){\n        if (mRenderView != null) {\n            mRenderView.setAspectRatio(arAspectFitParent);\n        }\n    }\n\n    public void setRender(int render) {\n        switch (render) {\n            case RENDER_NONE:\n                setRenderView(null);\n                break;\n            case RENDER_SURFACE_VIEW:\n            case RENDER_TEXTURE_VIEW: {\n                //初始化一个textureview，并且添加到视图容器中\n                TextureRenderView renderView = new TextureRenderView(getContext());\n                if (mMediaPlayer != null) {\n                    renderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer);\n                    renderView.setVideoSize(mMediaPlayer.getVideoWidth(), mMediaPlayer.getVideoHeight());\n                    renderView.setVideoSampleAspectRatio(mMediaPlayer.getVideoSarNum(), mMediaPlayer.getVideoSarDen());\n                    renderView.setAspectRatio(mCurrentAspectRatio);\n                }\n                setRenderView(renderView);\n                break;\n            }\n            default:\n                Log.e(TAG, String.format(Locale.getDefault(), \"invalid render %d\\n\", render));\n                break;\n        }\n    }\n\n    public void setHudView(TableLayout tableLayout) {\n        mHudViewHolder = new InfoHudViewHolder(getContext(), tableLayout);\n    }\n\n    /**\n     * Sets video path.\n     *\n     * @param path the path of the video.\n     */\n    public void setVideoPath(String path) {\n        setVideoURI(Uri.parse(path),is_Live);\n    }\n\n    /**\n     * Sets video URI.\n     *\n     * @param uri the URI of the video.\n     */\n    private boolean is_Live;\n    public void setVideoURI(Uri uri,boolean live) {\n        this.is_Live = live;\n        setVideoURI(uri, null);\n    }\n\n    /**\n     * Sets video URI using specific headers.\n     *\n     * @param uri     the URI of the video.\n     * @param headers the headers for the URI request.\n     *                Note that the cross domain redirection is allowed by default, but that can be\n     *                changed with key/value pairs through the headers parameter with\n     *                \"android-allow-cross-domain-redirect\" as the key and \"0\" or \"1\" as the value\n     *                to disallow or allow cross domain redirection.\n     */\n    private void setVideoURI(Uri uri, Map<String, String> headers) {\n        mUri = uri;\n        mHeaders = headers;\n        mSeekWhenPrepared = 0;\n        openVideo();\n        requestLayout();\n        invalidate();\n    }\n\n    // REMOVED: addSubtitleSource\n    // REMOVED: mPendingSubtitleTracks\n\n    public void stopPlayback() {\n        if (mMediaPlayer != null) {\n            mMediaPlayer.stop();\n            mMediaPlayer.release();\n            mMediaPlayer = null;\n\n            if (mHudViewHolder != null)\n                mHudViewHolder.setMediaPlayer(null);\n            mCurrentState = STATE_IDLE;\n            mTargetState = STATE_IDLE;\n            AudioManager am = (AudioManager) mAppContext.getSystemService(Context.AUDIO_SERVICE);\n            am.abandonAudioFocus(null);\n        }\n    }\n\n    @TargetApi(Build.VERSION_CODES.M)\n    public void openVideo() {\n        if (mUri == null || mSurfaceHolder == null) {\n            // not ready for playback just yet, will try again later\n            Log.e(TAG,\"如果没有画面，请检查是否开启了硬件加速\");\n            return;\n        }\n        // we shouldn't clear the target state, because somebody might have\n        // called start() previously\n        release(false);\n\n        AudioManager am = (AudioManager) mAppContext.getSystemService(Context.AUDIO_SERVICE);\n        am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);\n\n        try {\n            mMediaPlayer = createPlayer(mSettings.getPlayer());\n\n            // TODO: create SubtitleController in MediaPlayer, but we need\n            // a context for the subtitle renderers\n            final Context context = getContext();\n            // REMOVED: SubtitleController\n\n            // REMOVED: mAudioSession\n            mMediaPlayer.setOnPreparedListener(mPreparedListener);/**视频准备播放监听*/\n            mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);/**视频界面大小改变监听*/\n            mMediaPlayer.setOnCompletionListener(mCompletionListener);/**视频播放完成监听*/\n            mMediaPlayer.setOnErrorListener(mErrorListener);/**视频错误监听*/\n            mMediaPlayer.setOnInfoListener(mInfoListener);/**视频其他信息监听*/\n            mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);/**视频缓冲监听*/\n            //mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);  //seekbar监听\n            mMediaPlayer.setOnTimedTextListener(mOnTimedTextListener);\n            mCurrentBufferPercentage = 0;\n            String scheme = mUri.getScheme();\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&\n                    mSettings.getUsingMediaDataSource() &&\n                    (TextUtils.isEmpty(scheme) || scheme.equalsIgnoreCase(\"file\"))) {\n                IMediaDataSource dataSource = new FileMediaDataSource(new File(mUri.toString()));\n                mMediaPlayer.setDataSource(dataSource);\n            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {\n                mMediaPlayer.setDataSource(mAppContext, mUri, mHeaders);\n            } else {\n                mMediaPlayer.setDataSource(mUri.toString());\n            }\n            bindSurfaceHolder(mMediaPlayer, mSurfaceHolder);\n            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\n            mMediaPlayer.setScreenOnWhilePlaying(true);\n            mPrepareStartTime = System.currentTimeMillis();\n            mMediaPlayer.prepareAsync();\n            if (mHudViewHolder != null)\n                mHudViewHolder.setMediaPlayer(mMediaPlayer);\n\n            // REMOVED: mPendingSubtitleTracks\n\n            // we don't set the target state here either, but preserve the\n            // target state that was there before.\n            mCurrentState = STATE_PREPARING;\n            attachMediaController();\n        } catch (IOException ex) {\n            Log.w(TAG, \"Unable to open content: \" + mUri, ex);\n            mCurrentState = STATE_ERROR;\n            mTargetState = STATE_ERROR;\n            mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);\n        } catch (IllegalArgumentException ex) {\n            Log.w(TAG, \"Unable to open content: \" + mUri, ex);\n            mCurrentState = STATE_ERROR;\n            mTargetState = STATE_ERROR;\n            mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);\n        } finally {\n            // REMOVED: mPendingSubtitleTracks.clear();\n        }\n    }\n\n    public void setMediaController(IMediaController controller) {\n        if (mMediaController != null) {\n            mMediaController.hide();\n        }\n        mMediaController = controller;\n        attachMediaController();\n    }\n\n    private void attachMediaController() {\n        if (mMediaPlayer != null && mMediaController != null) {\n            mMediaController.setMediaPlayer(this);\n            View anchorView = this.getParent() instanceof View ?\n                    (View) this.getParent() : this;\n            mMediaController.setAnchorView(anchorView);\n            mMediaController.setEnabled(isInPlaybackState());\n        }\n    }\n\n    IMediaPlayer.OnVideoSizeChangedListener mSizeChangedListener =\n            new IMediaPlayer.OnVideoSizeChangedListener() {\n                @Override\n                public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) {\n                    mVideoWidth = mp.getVideoWidth();\n                    mVideoHeight = mp.getVideoHeight();\n                    mVideoSarNum = mp.getVideoSarNum();\n                    mVideoSarDen = mp.getVideoSarDen();\n                    if (mVideoWidth != 0 && mVideoHeight != 0) {\n                        if (mRenderView != null) {\n                            mRenderView.setVideoSize(mVideoWidth, mVideoHeight);\n                            mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen);\n                        }\n                        // REMOVED: getHolder().setFixedSize(mVideoWidth, mVideoHeight);\n                        requestLayout();\n                    }\n                }\n            };\n\n    IMediaPlayer.OnPreparedListener mPreparedListener = new IMediaPlayer.OnPreparedListener() {\n        public void onPrepared(IMediaPlayer mp) {\n            mPrepareEndTime = System.currentTimeMillis();\n            if (mHudViewHolder != null) {\n                mHudViewHolder.updateLoadCost(mPrepareEndTime - mPrepareStartTime);\n            }\n            mCurrentState = STATE_PREPARED;\n\n            // Get the capabilities of the player for this stream\n            // REMOVED: Metadata\n\n            if (mOnPreparedListener != null) {\n                mOnPreparedListener.onPrepared(mMediaPlayer);\n            }\n            if (mMediaController != null) {\n                mMediaController.setEnabled(true);\n            }\n            mVideoWidth = mp.getVideoWidth();\n            mVideoHeight = mp.getVideoHeight();\n\n            int seekToPosition = mSeekWhenPrepared;  // mSeekWhenPrepared may be changed after seekTo() call\n            if (seekToPosition != 0) {\n                seekTo(seekToPosition);\n            }\n            if (mVideoWidth != 0 && mVideoHeight != 0) {\n                //Log.i(\"@@@@\", \"video size: \" + mVideoWidth +\"/\"+ mVideoHeight);\n                // REMOVED: getHolder().setFixedSize(mVideoWidth, mVideoHeight);\n                if (mRenderView != null) {\n                    mRenderView.setVideoSize(mVideoWidth, mVideoHeight);\n                    mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen);\n                    if (!mRenderView.shouldWaitForResize() || mSurfaceWidth == mVideoWidth && mSurfaceHeight == mVideoHeight) {\n                        // We didn't actually change the size (it was already at the size\n                        // we need), so we won't get a \"surface changed\" callback, so\n                        // start the video here instead of in the callback.\n                        if (mTargetState == STATE_PLAYING) {\n                            start();\n                            if (mMediaController != null) {\n                                mMediaController.show();\n                            }\n                        } else if (!isPlaying() &&\n                                (seekToPosition != 0 || getCurrentPosition() > 0)) {\n                            if (mMediaController != null) {\n                                // Show the media controls when we're paused into a video and make 'em stick.\n                                mMediaController.show(0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                // We don't know the video size yet, but should start anyway.\n                // The video size might be reported to us later.\n                if (mTargetState == STATE_PLAYING) {\n                    start();\n                }\n            }\n        }\n    };\n\n    private IMediaPlayer.OnCompletionListener mCompletionListener =\n            new IMediaPlayer.OnCompletionListener() {\n                public void onCompletion(IMediaPlayer mp) {\n                    mCurrentState = STATE_PLAYBACK_COMPLETED;\n                    mTargetState = STATE_PLAYBACK_COMPLETED;\n                    if (mMediaController != null) {\n                        mMediaController.hide();\n                    }\n                    if (mOnCompletionListener != null) {\n                        mOnCompletionListener.onCompletion(mMediaPlayer);\n                    }\n                }\n            };\n\n    private IMediaPlayer.OnInfoListener mInfoListener =\n            new IMediaPlayer.OnInfoListener() {\n                public boolean onInfo(IMediaPlayer mp, int arg1, int arg2) {\n                    if (mOnInfoListener != null) {\n                        mOnInfoListener.onInfo(mp, arg1, arg2);\n                    }\n                    switch (arg1) {\n                        case IMediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:\n                            Log.d(TAG, \"MEDIA_INFO_VIDEO_TRACK_LAGGING:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:\n                            Log.d(TAG, \"MEDIA_INFO_VIDEO_RENDERING_START:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_BUFFERING_START:\n                            Log.d(TAG, \"MEDIA_INFO_BUFFERING_START:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_BUFFERING_END:\n                            Log.d(TAG, \"MEDIA_INFO_BUFFERING_END:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH:\n                            Log.d(TAG, \"MEDIA_INFO_NETWORK_BANDWIDTH: \" + arg2);\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:\n                            Log.d(TAG, \"MEDIA_INFO_BAD_INTERLEAVING:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_NOT_SEEKABLE:\n                            Log.d(TAG, \"MEDIA_INFO_NOT_SEEKABLE:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_METADATA_UPDATE:\n                            Log.d(TAG, \"MEDIA_INFO_METADATA_UPDATE:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE:\n                            Log.d(TAG, \"MEDIA_INFO_UNSUPPORTED_SUBTITLE:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_SUBTITLE_TIMED_OUT:\n                            Log.d(TAG, \"MEDIA_INFO_SUBTITLE_TIMED_OUT:\");\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED:\n                            mVideoRotationDegree = arg2;\n                            Log.d(TAG, \"MEDIA_INFO_VIDEO_ROTATION_CHANGED: \" + arg2);\n                            if (mRenderView != null)\n                                mRenderView.setVideoRotation(arg2);\n                            break;\n                        case IMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:\n                            Log.d(TAG, \"MEDIA_INFO_AUDIO_RENDERING_START:\");\n                            break;\n                    }\n                    return true;\n                }\n            };\n\n    private IMediaPlayer.OnErrorListener mErrorListener =\n            new IMediaPlayer.OnErrorListener() {\n                public boolean onError(IMediaPlayer mp, int framework_err, int impl_err) {\n                    Log.d(TAG, \"Error: \" + framework_err + \",\" + impl_err);\n                    mCurrentState = STATE_ERROR;\n                    mTargetState = STATE_ERROR;\n                    if (mMediaController != null) {\n                        mMediaController.hide();\n                    }\n\n                    /* If an error handler has been supplied, use it and finish. */\n                    if (mOnErrorListener != null) {\n                        if (mOnErrorListener.onError(mMediaPlayer, framework_err, impl_err)) {\n                            return true;\n                        }\n                    }\n\n                    /* Otherwise, pop up an error dialog so the user knows that\n                     * something bad has happened. Only try and pop up the dialog\n                     * if we're attached to a window. When we're going away and no\n                     * longer have a window, don't bother showing the user an error.\n                     */\n                    if (getWindowToken() != null) {\n                        Resources r = mAppContext.getResources();\n                        int messageId;\n\n                        if (framework_err == MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) {\n                            messageId = R.string.VideoView_error_text_invalid_progressive_playback;\n                        } else {\n                            messageId = R.string.VideoView_error_text_unknown;\n                        }\n\n                        new AlertDialog.Builder(getContext())\n                                .setMessage(messageId)\n                                .setPositiveButton(R.string.VideoView_error_button,\n                                        new DialogInterface.OnClickListener() {\n                                            public void onClick(DialogInterface dialog, int whichButton) {\n                                            /* If we get here, there is no onError listener, so\n                                             * at least inform them that the video is over.\n                                             */\n                                                if (mOnCompletionListener != null) {\n                                                    mOnCompletionListener.onCompletion(mMediaPlayer);\n                                                }\n                                            }\n                                        })\n                                .setCancelable(false)\n                                .show();\n                    }\n                    return true;\n                }\n            };\n\n    private IMediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener =\n            new IMediaPlayer.OnBufferingUpdateListener() {\n                public void onBufferingUpdate(IMediaPlayer mp, int percent) {\n                    mCurrentBufferPercentage = percent;\n                }\n            };\n\n    private IMediaPlayer.OnSeekCompleteListener mSeekCompleteListener = new IMediaPlayer.OnSeekCompleteListener() {\n\n        @Override\n        public void onSeekComplete(IMediaPlayer mp) {\n            mSeekEndTime = System.currentTimeMillis();\n            mHudViewHolder.updateSeekCost(mSeekEndTime - mSeekStartTime);\n        }\n    };\n\n    private IMediaPlayer.OnTimedTextListener mOnTimedTextListener = new IMediaPlayer.OnTimedTextListener() {\n        @Override\n        public void onTimedText(IMediaPlayer mp, IjkTimedText text) {\n            if (text != null) {\n                subtitleDisplay.setText(text.getText());\n            }\n        }\n    };\n\n    /**\n     * Register a callback to be invoked when the media file\n     * is loaded and ready to go.\n     *\n     * @param l The callback that will be run\n     */\n    public void setOnPreparedListener(IMediaPlayer.OnPreparedListener l) {\n        mOnPreparedListener = l;\n    }\n\n    /**\n     * Register a callback to be invoked when the end of a media file\n     * has been reached during playback.\n     *\n     * @param l The callback that will be run\n     */\n    public void setOnCompletionListener(IMediaPlayer.OnCompletionListener l) {\n        mOnCompletionListener = l;\n    }\n\n    /**\n     * Register a callback to be invoked when an error occurs\n     * during playback or setup.  If no listener is specified,\n     * or if the listener returned false, VideoView will inform\n     * the user of any errors.\n     *\n     * @param l The callback that will be run\n     */\n    public void setOnErrorListener(IMediaPlayer.OnErrorListener l) {\n        mOnErrorListener = l;\n    }\n\n    /**\n     * Register a callback to be invoked when an informational event\n     * occurs during playback or setup.\n     *\n     * @param l The callback that will be run\n     */\n    public void setOnInfoListener(IMediaPlayer.OnInfoListener l) {\n        mOnInfoListener = l;\n    }\n\n    // REMOVED: mSHCallback\n    private void bindSurfaceHolder(IMediaPlayer mp, IRenderView.ISurfaceHolder holder) {\n        if (mp == null)\n            return;\n\n        if (holder == null) {\n            mp.setDisplay(null);\n            return;\n        }\n\n        holder.bindToMediaPlayer(mp);\n    }\n\n    IRenderView.IRenderCallback mSHCallback = new IRenderView.IRenderCallback() {\n        @Override\n        public void onSurfaceChanged(@NonNull IRenderView.ISurfaceHolder holder, int format, int w, int h) {\n            if (holder.getRenderView() != mRenderView) {\n                Log.e(TAG, \"onSurfaceChanged: unmatched render callback\\n\");\n                return;\n            }\n\n            mSurfaceWidth = w;\n            mSurfaceHeight = h;\n            boolean isValidState = (mTargetState == STATE_PLAYING);\n            boolean hasValidSize = !mRenderView.shouldWaitForResize() || (mVideoWidth == w && mVideoHeight == h);\n            if (mMediaPlayer != null && isValidState && hasValidSize) {\n                if (mSeekWhenPrepared != 0) {\n                    seekTo(mSeekWhenPrepared);\n                }\n                start();\n            }\n        }\n\n        @Override\n        public void onSurfaceCreated(@NonNull IRenderView.ISurfaceHolder holder, int width, int height) {\n            if (holder.getRenderView() != mRenderView) {\n                Log.e(TAG, \"onSurfaceCreated: unmatched render callback\\n\");\n                return;\n            }\n\n            mSurfaceHolder = holder;\n            if (mMediaPlayer != null)\n                bindSurfaceHolder(mMediaPlayer, holder);\n            else\n                openVideo();\n        }\n\n        @Override\n        public void onSurfaceDestroyed(@NonNull IRenderView.ISurfaceHolder holder) {\n            if (holder.getRenderView() != mRenderView) {\n                Log.e(TAG, \"onSurfaceDestroyed: unmatched render callback\\n\");\n                return;\n            }\n\n            // after we return from this we can't use the surface any more\n            mSurfaceHolder = null;\n            // REMOVED: if (mMediaController != null) mMediaController.hide();\n            // REMOVED: release(true);\n            releaseWithoutStop();\n        }\n    };\n\n    public void releaseWithoutStop() {\n        if (mMediaPlayer != null)\n            mMediaPlayer.setDisplay(null);\n    }\n\n    /*\n     * release the media player in any state\n     */\n    public void release(boolean cleartargetstate) {\n        if (mMediaPlayer != null) {\n            mMediaPlayer.reset();\n            mMediaPlayer.release();\n            mMediaPlayer = null;\n            // REMOVED: mPendingSubtitleTracks.clear();\n            mCurrentState = STATE_IDLE;\n            if (cleartargetstate) {\n                mTargetState = STATE_IDLE;\n            }\n            AudioManager am = (AudioManager) mAppContext.getSystemService(Context.AUDIO_SERVICE);\n            am.abandonAudioFocus(null);\n        }\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        if (isInPlaybackState() && mMediaController != null) {\n            toggleMediaControlsVisiblity();\n        }\n        return false;\n    }\n\n    @Override\n    public boolean onTrackballEvent(MotionEvent ev) {\n        if (isInPlaybackState() && mMediaController != null) {\n            toggleMediaControlsVisiblity();\n        }\n        return false;\n    }\n\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n        boolean isKeyCodeSupported = keyCode != KeyEvent.KEYCODE_BACK &&\n                keyCode != KeyEvent.KEYCODE_VOLUME_UP &&\n                keyCode != KeyEvent.KEYCODE_VOLUME_DOWN &&\n                keyCode != KeyEvent.KEYCODE_VOLUME_MUTE &&\n                keyCode != KeyEvent.KEYCODE_MENU &&\n                keyCode != KeyEvent.KEYCODE_CALL &&\n                keyCode != KeyEvent.KEYCODE_ENDCALL;\n        if (isInPlaybackState() && isKeyCodeSupported && mMediaController != null) {\n            if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||\n                    keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) {\n                if (mMediaPlayer.isPlaying()) {\n                    pause();\n                    mMediaController.show();\n                } else {\n                    start();\n                    mMediaController.hide();\n                }\n                return true;\n            } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {\n                if (!mMediaPlayer.isPlaying()) {\n                    start();\n                    mMediaController.hide();\n                }\n                return true;\n            } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP\n                    || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {\n                if (mMediaPlayer.isPlaying()) {\n                    pause();\n                    mMediaController.show();\n                }\n                return true;\n            } else {\n                toggleMediaControlsVisiblity();\n            }\n        }\n\n        return super.onKeyDown(keyCode, event);\n    }\n\n    private void toggleMediaControlsVisiblity() {\n        if (mMediaController.isShowing()) {\n            mMediaController.hide();\n        } else {\n            mMediaController.show();\n        }\n    }\n\n    @Override\n    public void start() {\n        if (isInPlaybackState()) {\n            mMediaPlayer.start();\n            mCurrentState = STATE_PLAYING;\n        }\n        mTargetState = STATE_PLAYING;\n    }\n\n    @Override\n    public void pause() {\n        if (isInPlaybackState()) {\n            if (mMediaPlayer.isPlaying()) {\n                mMediaPlayer.pause();\n                mCurrentState = STATE_PAUSED;\n            }\n        }\n        mTargetState = STATE_PAUSED;\n    }\n\n    public void suspend() {\n        release(false);\n    }\n\n    public void resume() {\n        openVideo();\n    }\n\n    @Override\n    public int getDuration() {\n        if (isInPlaybackState()) {\n            return (int) mMediaPlayer.getDuration();\n        }\n\n        return -1;\n    }\n\n    @Override\n    public int getCurrentPosition() {\n        if (isInPlaybackState()) {\n            return (int) mMediaPlayer.getCurrentPosition();\n        }\n        return 0;\n    }\n\n    @Override\n    public void seekTo(int msec) {\n        if (isInPlaybackState()) {\n            mSeekStartTime = System.currentTimeMillis();\n            mMediaPlayer.seekTo(msec);\n            mSeekWhenPrepared = 0;\n        } else {\n            mSeekWhenPrepared = msec;\n        }\n    }\n\n    @Override\n    public boolean isPlaying() {\n        return isInPlaybackState() && mMediaPlayer.isPlaying();\n    }\n\n    @Override\n    public int getBufferPercentage() {\n        if (mMediaPlayer != null) {\n            return mCurrentBufferPercentage;\n        }\n        return 0;\n    }\n\n    private boolean isInPlaybackState() {\n        return (mMediaPlayer != null &&\n                mCurrentState != STATE_ERROR &&\n                mCurrentState != STATE_IDLE &&\n                mCurrentState != STATE_PREPARING);\n    }\n\n    @Override\n    public boolean canPause() {\n        return mCanPause;\n    }\n\n    @Override\n    public boolean canSeekBackward() {\n        return mCanSeekBack;\n    }\n\n    @Override\n    public boolean canSeekForward() {\n        return mCanSeekForward;\n    }\n\n    @Override\n    public int getAudioSessionId() {\n        return 0;\n    }\n\n    // REMOVED: getAudioSessionId();\n    // REMOVED: onAttachedToWindow();\n    // REMOVED: onDetachedFromWindow();\n    // REMOVED: onLayout();\n    // REMOVED: draw();\n    // REMOVED: measureAndLayoutSubtitleWidget();\n    // REMOVED: setSubtitleWidget();\n    // REMOVED: getSubtitleLooper();\n\n    //-------------------------\n    // Extend: Aspect Ratio\n    //-------------------------\n\n    private static final int[] s_allAspectRatio = {\n            IRenderView.AR_ASPECT_FIT_PARENT,\n            IRenderView.AR_ASPECT_FILL_PARENT,\n            IRenderView.AR_ASPECT_WRAP_CONTENT,\n            // IRenderView.AR_MATCH_PARENT,\n            IRenderView.AR_16_9_FIT_PARENT,\n            IRenderView.AR_4_3_FIT_PARENT};\n    private int mCurrentAspectRatioIndex = 0;\n    private int mCurrentAspectRatio = s_allAspectRatio[0];\n\n    public int toggleAspectRatio() {\n        mCurrentAspectRatioIndex++;\n        mCurrentAspectRatioIndex %= s_allAspectRatio.length;\n\n        mCurrentAspectRatio = s_allAspectRatio[mCurrentAspectRatioIndex];\n        if (mRenderView != null)\n            mRenderView.setAspectRatio(mCurrentAspectRatio);\n        return mCurrentAspectRatio;\n    }\n\n    //-------------------------\n    // Extend: Render\n    //-------------------------\n    public static final int RENDER_NONE = 0;\n    public static final int RENDER_SURFACE_VIEW = 1;\n    public static final int RENDER_TEXTURE_VIEW = 2;\n\n    private List<Integer> mAllRenders = new ArrayList<Integer>();\n    private int mCurrentRenderIndex = 0;\n    private int mCurrentRender = RENDER_NONE;\n\n    private void initRenders() {\n        mAllRenders.clear();\n\n        if (mSettings.getEnableSurfaceView())\n            mAllRenders.add(RENDER_SURFACE_VIEW);\n        if (mSettings.getEnableTextureView() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)\n            mAllRenders.add(RENDER_TEXTURE_VIEW);\n        if (mSettings.getEnableNoView())\n            mAllRenders.add(RENDER_NONE);\n\n        if (mAllRenders.isEmpty())\n            mAllRenders.add(RENDER_SURFACE_VIEW);\n        mCurrentRender = mAllRenders.get(mCurrentRenderIndex);\n        setRender(mCurrentRender); //根据渲染器类型初始化渲染器\n    }\n\n    public int toggleRender() {\n        mCurrentRenderIndex++;\n        mCurrentRenderIndex %= mAllRenders.size();\n\n        mCurrentRender = mAllRenders.get(mCurrentRenderIndex);\n        setRender(mCurrentRender);\n        return mCurrentRender;\n    }\n\n    @NonNull\n    public static String getRenderText(Context context, int render) {\n        String text;\n        switch (render) {\n            case RENDER_NONE:\n                text = context.getString(R.string.VideoView_render_none);\n                break;\n            case RENDER_SURFACE_VIEW:\n                text = context.getString(R.string.VideoView_render_surface_view);\n                break;\n            case RENDER_TEXTURE_VIEW:\n                text = context.getString(R.string.VideoView_render_texture_view);\n                break;\n            default:\n                text = context.getString(R.string.N_A);\n                break;\n        }\n        return text;\n    }\n\n    //-------------------------\n    // Extend: Player\n    //-------------------------\n    public int togglePlayer() {\n        if (mMediaPlayer != null)\n            mMediaPlayer.release();\n\n        if (mRenderView != null)\n            mRenderView.getView().invalidate();\n        openVideo();\n        return mSettings.getPlayer();\n    }\n\n    @NonNull\n    public static String getPlayerText(Context context, int player) {\n        String text;\n        switch (player) {\n            case Settings.PV_PLAYER__AndroidMediaPlayer:\n                text = context.getString(R.string.VideoView_player_AndroidMediaPlayer);\n                break;\n            case Settings.PV_PLAYER__IjkMediaPlayer:\n                text = context.getString(R.string.VideoView_player_IjkMediaPlayer);\n                break;\n            case Settings.PV_PLAYER__IjkExoMediaPlayer:\n                text = context.getString(R.string.VideoView_player_IjkExoMediaPlayer);\n                break;\n            default:\n                text = context.getString(R.string.N_A);\n                break;\n        }\n        return text;\n    }\n    private IjkMediaPlayer ijkMediaPlayer = null;\n    public IMediaPlayer createPlayer(int playerType) {\n        IMediaPlayer mediaPlayer = null;\n\n        switch (playerType) {\n            case Settings.PV_PLAYER__IjkExoMediaPlayer: {\n                IjkExoMediaPlayer IjkExoMediaPlayer = new IjkExoMediaPlayer(mAppContext);\n                mediaPlayer = IjkExoMediaPlayer;\n            }\n            break;\n            case Settings.PV_PLAYER__AndroidMediaPlayer: {\n                AndroidMediaPlayer androidMediaPlayer = new AndroidMediaPlayer();\n                mediaPlayer = androidMediaPlayer;\n            }\n            break;\n            case Settings.PV_PLAYER__IjkMediaPlayer:\n            default: {\n                if (mUri != null) {\n                    ijkMediaPlayer = new IjkMediaPlayer();\n                    ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);\n\n                    if (mSettings.getUsingMediaCodec()) {\n                        // 支持硬解 1：开启 O:关闭\n                        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"mediacodec\", 1);\n                        if (mSettings.getUsingMediaCodecAutoRotate()) {\n                            ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"mediacodec-auto-rotate\", 1);\n                        } else {\n                            ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"mediacodec-auto-rotate\", 0);\n                        }\n                        if (mSettings.getMediaCodecHandleResolutionChange()) {\n                            ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"mediacodec-handle-resolution-change\", 1);\n                        } else {\n                            ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"mediacodec-handle-resolution-change\", 0);\n                        }\n                    } else {\n                        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"mediacodec\", 0);\n                    }\n\n                    if (mSettings.getUsingOpenSLES()) {\n                        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"opensles\", 1);\n                    } else {\n                        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"opensles\", 0);\n                    }\n\n                    String pixelFormat = mSettings.getPixelFormat();\n                    if (TextUtils.isEmpty(pixelFormat)) {\n                        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"overlay-format\", IjkMediaPlayer.SDL_FCC_RV32);\n                    } else {\n                        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"overlay-format\", pixelFormat);\n                    }\n                    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"framedrop\", 1);\n                    // 需要准备好后自动播放\n                    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"start-on-prepared\", 0);\n\n                    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, \"http-detect-range-support\", 0);\n\n                    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, \"skip_loop_filter\", 48);\n\n                    //设置user_agent\n                    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,\"user_agent\",\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36\");\n                }\n                if (is_Live){\n                    setLive();\n                }\n                mediaPlayer = ijkMediaPlayer;\n            }\n            break;\n        }\n\n        if (mSettings.getEnableDetachedSurfaceTextureView()) {\n            mediaPlayer = new TextureMediaPlayer(mediaPlayer);\n        }\n\n        return mediaPlayer;\n    }\n\n    /**\n     * rtsp设置如下属性用来降低延迟\n     */\n    private void setLive(){\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"framedrop\", 60);\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"max-fps\", 0);\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"fps\", 30);\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, \"skip_loop_filter\", 48);\n        //ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"overlay-format\", IjkMediaPlayer.SDL_FCC_YV12);\n        // 是否开启预缓冲，一般直播项目会开启，达到秒开的效果，不过带来了播放丢帧卡顿的体验\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"packet-buffering\", 0);\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, \"fflags\", \"nobuffer\");\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, \"max-buffer-size\", 1024);\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"min-frames\", 3);\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, \"start-on-prepared\", 1);\n        //ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, \"probsize\", \"4096\");\n        // 设置播放前的探测时间 1,达到首屏秒开效果\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, \"analyzeduration\", \"2000000\");\n        // 播放前的探测Size，默认是1M, 改小一点会出画面更快\n        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, \"probesize\", 200); //1024L)\n    }\n    //-------------------------\n    // Extend: Background\n    //-------------------------\n\n    private boolean mEnableBackgroundPlay = false;\n\n    private void initBackground() {\n        mEnableBackgroundPlay = mSettings.getEnableBackgroundPlay();\n        if (mEnableBackgroundPlay) {\n            MediaPlayerService.intentToStart(getContext());\n            mMediaPlayer = MediaPlayerService.getMediaPlayer();\n            if (mHudViewHolder != null)\n                mHudViewHolder.setMediaPlayer(mMediaPlayer);\n        }\n    }\n\n    public boolean isBackgroundPlayEnabled() {\n        return mEnableBackgroundPlay;\n    }\n\n    public void enterBackground() {\n        MediaPlayerService.setMediaPlayer(mMediaPlayer);\n    }\n\n    public void stopBackgroundPlay() {\n        MediaPlayerService.setMediaPlayer(null);\n    }\n\n    //-------------------------\n    // Extend: Background\n    //-------------------------\n    public void showMediaInfo() {\n        if (mMediaPlayer == null)\n            return;\n\n        int selectedVideoTrack = MediaPlayerCompat.getSelectedTrack(mMediaPlayer, ITrackInfo.MEDIA_TRACK_TYPE_VIDEO);\n        int selectedAudioTrack = MediaPlayerCompat.getSelectedTrack(mMediaPlayer, ITrackInfo.MEDIA_TRACK_TYPE_AUDIO);\n        int selectedSubtitleTrack = MediaPlayerCompat.getSelectedTrack(mMediaPlayer, ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT);\n\n        TableLayoutBinder builder = new TableLayoutBinder(getContext());\n        builder.appendSection(R.string.mi_player);\n        builder.appendRow2(R.string.mi_player, MediaPlayerCompat.getName(mMediaPlayer));\n        builder.appendSection(R.string.mi_media);\n        builder.appendRow2(R.string.mi_resolution, buildResolution(mVideoWidth, mVideoHeight, mVideoSarNum, mVideoSarDen));\n        builder.appendRow2(R.string.mi_length, buildTimeMilli(mMediaPlayer.getDuration()));\n\n        ITrackInfo trackInfos[] = mMediaPlayer.getTrackInfo();\n        if (trackInfos != null) {\n            int index = -1;\n            for (ITrackInfo trackInfo : trackInfos) {\n                index++;\n\n                int trackType = trackInfo.getTrackType();\n                if (index == selectedVideoTrack) {\n                    builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index) + \" \" + getContext().getString(R.string.mi__selected_video_track));\n                } else if (index == selectedAudioTrack) {\n                    builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index) + \" \" + getContext().getString(R.string.mi__selected_audio_track));\n                } else if (index == selectedSubtitleTrack) {\n                    builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index) + \" \" + getContext().getString(R.string.mi__selected_subtitle_track));\n                } else {\n                    builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index));\n                }\n                builder.appendRow2(R.string.mi_type, buildTrackType(trackType));\n                builder.appendRow2(R.string.mi_language, buildLanguage(trackInfo.getLanguage()));\n\n                IMediaFormat mediaFormat = trackInfo.getFormat();\n                if (mediaFormat == null) {\n                } else if (mediaFormat instanceof IjkMediaFormat) {\n                    switch (trackType) {\n                        case ITrackInfo.MEDIA_TRACK_TYPE_VIDEO:\n                            builder.appendRow2(R.string.mi_codec, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_LONG_NAME_UI));\n                            builder.appendRow2(R.string.mi_profile_level, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_PROFILE_LEVEL_UI));\n                            builder.appendRow2(R.string.mi_pixel_format, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_PIXEL_FORMAT_UI));\n                            builder.appendRow2(R.string.mi_resolution, mediaFormat.getString(IjkMediaFormat.KEY_IJK_RESOLUTION_UI));\n                            builder.appendRow2(R.string.mi_frame_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_FRAME_RATE_UI));\n                            builder.appendRow2(R.string.mi_bit_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_BIT_RATE_UI));\n                            break;\n                        case ITrackInfo.MEDIA_TRACK_TYPE_AUDIO:\n                            builder.appendRow2(R.string.mi_codec, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_LONG_NAME_UI));\n                            builder.appendRow2(R.string.mi_profile_level, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_PROFILE_LEVEL_UI));\n                            builder.appendRow2(R.string.mi_sample_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_SAMPLE_RATE_UI));\n                            builder.appendRow2(R.string.mi_channels, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CHANNEL_UI));\n                            builder.appendRow2(R.string.mi_bit_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_BIT_RATE_UI));\n                            break;\n                        default:\n                            break;\n                    }\n                }\n            }\n        }\n\n        AlertDialog.Builder adBuilder = builder.buildAlertDialogBuilder();\n        adBuilder.setTitle(R.string.media_information);\n        adBuilder.setNegativeButton(R.string.close, null);\n        adBuilder.show();\n    }\n\n    private String buildResolution(int width, int height, int sarNum, int sarDen) {\n        StringBuilder sb = new StringBuilder();\n        sb.append(width);\n        sb.append(\" x \");\n        sb.append(height);\n\n        if (sarNum > 1 || sarDen > 1) {\n            sb.append(\"[\");\n            sb.append(sarNum);\n            sb.append(\":\");\n            sb.append(sarDen);\n            sb.append(\"]\");\n        }\n\n        return sb.toString();\n    }\n\n    private String buildTimeMilli(long duration) {\n        long total_seconds = duration / 1000;\n        long hours = total_seconds / 3600;\n        long minutes = (total_seconds % 3600) / 60;\n        long seconds = total_seconds % 60;\n        if (duration <= 0) {\n            return \"--:--\";\n        }\n        if (hours >= 100) {\n            return String.format(Locale.US, \"%d:%02d:%02d\", hours, minutes, seconds);\n        } else if (hours > 0) {\n            return String.format(Locale.US, \"%02d:%02d:%02d\", hours, minutes, seconds);\n        } else {\n            return String.format(Locale.US, \"%02d:%02d\", minutes, seconds);\n        }\n    }\n\n    private String buildTrackType(int type) {\n        Context context = getContext();\n        switch (type) {\n            case ITrackInfo.MEDIA_TRACK_TYPE_VIDEO:\n                return context.getString(R.string.TrackType_video);\n            case ITrackInfo.MEDIA_TRACK_TYPE_AUDIO:\n                return context.getString(R.string.TrackType_audio);\n            case ITrackInfo.MEDIA_TRACK_TYPE_SUBTITLE:\n                return context.getString(R.string.TrackType_subtitle);\n            case ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT:\n                return context.getString(R.string.TrackType_timedtext);\n            case ITrackInfo.MEDIA_TRACK_TYPE_METADATA:\n                return context.getString(R.string.TrackType_metadata);\n            case ITrackInfo.MEDIA_TRACK_TYPE_UNKNOWN:\n            default:\n                return context.getString(R.string.TrackType_unknown);\n        }\n    }\n\n    private String buildLanguage(String language) {\n        if (TextUtils.isEmpty(language))\n            return \"und\";\n        return language;\n    }\n\n    public ITrackInfo[] getTrackInfo() {\n        if (mMediaPlayer == null)\n            return null;\n\n        return mMediaPlayer.getTrackInfo();\n    }\n\n    public void selectTrack(int stream) {\n        MediaPlayerCompat.selectTrack(mMediaPlayer, stream);\n    }\n\n    public void deselectTrack(int stream) {\n        MediaPlayerCompat.deselectTrack(mMediaPlayer, stream);\n    }\n\n    public int getSelectedTrack(int trackType) {\n        return MediaPlayerCompat.getSelectedTrack(mMediaPlayer, trackType);\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/InfoHudViewHolder.java",
    "content": "package com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.util.SparseArray;\nimport android.view.View;\nimport android.widget.TableLayout;\n\n\nimport java.util.Locale;\n\nimport com.bilibili.lingxiao.ijkplayer.R;\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\nimport tv.danmaku.ijk.media.player.IjkMediaPlayer;\nimport tv.danmaku.ijk.media.player.MediaPlayerProxy;\n\npublic class InfoHudViewHolder {\n    private TableLayoutBinder mTableLayoutBinder;\n    private SparseArray<View> mRowMap = new SparseArray<View>();\n    private IMediaPlayer mMediaPlayer;\n    private long mLoadCost = 0;\n    private long mSeekCost = 0;\n\n    public InfoHudViewHolder(Context context, TableLayout tableLayout) {\n        mTableLayoutBinder = new TableLayoutBinder(context, tableLayout);\n    }\n\n    private void appendSection(int nameId) {\n        mTableLayoutBinder.appendSection(nameId);\n    }\n\n    private void appendRow(int nameId) {\n        View rowView = mTableLayoutBinder.appendRow2(nameId, null);\n        mRowMap.put(nameId, rowView);\n    }\n\n    private void setRowValue(int id, String value) {\n        View rowView = mRowMap.get(id);\n        if (rowView == null) {\n            rowView = mTableLayoutBinder.appendRow2(id, value);\n            mRowMap.put(id, rowView);\n        } else {\n            mTableLayoutBinder.setValueText(rowView, value);\n        }\n    }\n\n    public void setMediaPlayer(IMediaPlayer mp) {\n        mMediaPlayer = mp;\n        if (mMediaPlayer != null) {\n            mHandler.sendEmptyMessageDelayed(MSG_UPDATE_HUD, 500);\n        } else {\n            mHandler.removeMessages(MSG_UPDATE_HUD);\n        }\n    }\n\n    private static String formatedDurationMilli(long duration) {\n        if (duration >=  1000) {\n            return String.format(Locale.US, \"%.2f sec\", ((float)duration) / 1000);\n        } else {\n            return String.format(Locale.US, \"%d msec\", duration);\n        }\n    }\n\n    private static String formatedSpeed(long bytes,long elapsed_milli) {\n        if (elapsed_milli <= 0) {\n            return \"0 B/s\";\n        }\n\n        if (bytes <= 0) {\n            return \"0 B/s\";\n        }\n\n        float bytes_per_sec = ((float)bytes) * 1000.f /  elapsed_milli;\n        if (bytes_per_sec >= 1000 * 1000) {\n            return String.format(Locale.US, \"%.2f MB/s\", ((float)bytes_per_sec) / 1000 / 1000);\n        } else if (bytes_per_sec >= 1000) {\n            return String.format(Locale.US, \"%.1f KB/s\", ((float)bytes_per_sec) / 1000);\n        } else {\n            return String.format(Locale.US, \"%d B/s\", (long)bytes_per_sec);\n        }\n    }\n\n    public void updateLoadCost(long time)  {\n        mLoadCost = time;\n    }\n\n    public void updateSeekCost(long time)  {\n        mSeekCost = time;\n    }\n\n    private static String formatedSize(long bytes) {\n        if (bytes >= 100 * 1000) {\n            return String.format(Locale.US, \"%.2f MB\", ((float)bytes) / 1000 / 1000);\n        } else if (bytes >= 100) {\n            return String.format(Locale.US, \"%.1f KB\", ((float)bytes) / 1000);\n        } else {\n            return String.format(Locale.US, \"%d B\", bytes);\n        }\n    }\n\n    private static final int MSG_UPDATE_HUD = 1;\n    private Handler mHandler = new Handler() {\n        @Override\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n                case MSG_UPDATE_HUD: {\n                    InfoHudViewHolder holder = InfoHudViewHolder.this;\n                    IjkMediaPlayer mp = null;\n                    if (mMediaPlayer == null)\n                        break;\n                    if (mMediaPlayer instanceof IjkMediaPlayer) {\n                        mp = (IjkMediaPlayer) mMediaPlayer;\n                    } else if (mMediaPlayer instanceof MediaPlayerProxy) {\n                        MediaPlayerProxy proxy = (MediaPlayerProxy) mMediaPlayer;\n                        IMediaPlayer internal = proxy.getInternalMediaPlayer();\n                        if (internal != null && internal instanceof IjkMediaPlayer)\n                            mp = (IjkMediaPlayer) internal;\n                    }\n                    if (mp == null)\n                        break;\n\n                    int vdec = mp.getVideoDecoder();\n                    switch (vdec) {\n                        case IjkMediaPlayer.FFP_PROPV_DECODER_AVCODEC:\n                            setRowValue(R.string.vdec, \"avcodec\");\n                            break;\n                        case IjkMediaPlayer.FFP_PROPV_DECODER_MEDIACODEC:\n                            setRowValue(R.string.vdec, \"MediaCodec\");\n                            break;\n                        default:\n                            setRowValue(R.string.vdec, \"\");\n                            break;\n                    }\n\n                    float fpsOutput = mp.getVideoOutputFramesPerSecond();\n                    float fpsDecode = mp.getVideoDecodeFramesPerSecond();\n                    setRowValue(R.string.fps, String.format(Locale.US, \"%.2f / %.2f\", fpsDecode, fpsOutput));\n\n                    long videoCachedDuration = mp.getVideoCachedDuration();\n                    long audioCachedDuration = mp.getAudioCachedDuration();\n                    long videoCachedBytes    = mp.getVideoCachedBytes();\n                    long audioCachedBytes    = mp.getAudioCachedBytes();\n                    long tcpSpeed            = mp.getTcpSpeed();\n                    long bitRate             = mp.getBitRate();\n                    long seekLoadDuration    = mp.getSeekLoadDuration();\n\n                    setRowValue(R.string.v_cache, String.format(Locale.US, \"%s, %s\", formatedDurationMilli(videoCachedDuration), formatedSize(videoCachedBytes)));\n                    setRowValue(R.string.a_cache, String.format(Locale.US, \"%s, %s\", formatedDurationMilli(audioCachedDuration), formatedSize(audioCachedBytes)));\n                    setRowValue(R.string.load_cost, String.format(Locale.US, \"%d ms\", mLoadCost));\n                    setRowValue(R.string.seek_cost, String.format(Locale.US, \"%d ms\", mSeekCost));\n                    setRowValue(R.string.seek_load_cost, String.format(Locale.US, \"%d ms\", seekLoadDuration));\n                    setRowValue(R.string.tcp_speed, String.format(Locale.US, \"%s\", formatedSpeed(tcpSpeed, 1000)));\n                    setRowValue(R.string.bit_rate, String.format(Locale.US, \"%.2f kbs\", bitRate/1000f));\n\n                    mHandler.removeMessages(MSG_UPDATE_HUD);\n                    mHandler.sendEmptyMessageDelayed(MSG_UPDATE_HUD, 500);\n                }\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/MeasureHelper.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.content.Context;\nimport androidx.annotation.NonNull;\nimport android.view.View;\nimport com.bilibili.lingxiao.ijkplayer.R;\n\n\nimport java.lang.ref.WeakReference;\n\n\npublic final class MeasureHelper {\n    private WeakReference<View> mWeakView;\n\n    private int mVideoWidth;\n    private int mVideoHeight;\n    private int mVideoSarNum;\n    private int mVideoSarDen;\n\n    private int mVideoRotationDegree;\n\n    private int mMeasuredWidth;\n    private int mMeasuredHeight;\n\n    private int mCurrentAspectRatio = IRenderView.AR_ASPECT_FIT_PARENT;\n\n    public MeasureHelper(View view) {\n        mWeakView = new WeakReference<View>(view);\n    }\n\n    public View getView() {\n        if (mWeakView == null)\n            return null;\n        return mWeakView.get();\n    }\n\n    public void setVideoSize(int videoWidth, int videoHeight) {\n        mVideoWidth = videoWidth;\n        mVideoHeight = videoHeight;\n    }\n\n    public void setVideoSampleAspectRatio(int videoSarNum, int videoSarDen) {\n        mVideoSarNum = videoSarNum;\n        mVideoSarDen = videoSarDen;\n    }\n\n    public void setVideoRotation(int videoRotationDegree) {\n        mVideoRotationDegree = videoRotationDegree;\n    }\n\n    /**\n     * Must be called by View.onMeasure(int, int)\n     *\n     * @param widthMeasureSpec\n     * @param heightMeasureSpec\n     */\n    public void doMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        //Log.i(\"@@@@\", \"onMeasure(\" + MeasureSpec.toString(widthMeasureSpec) + \", \"\n        //        + MeasureSpec.toString(heightMeasureSpec) + \")\");\n        if (mVideoRotationDegree == 90 || mVideoRotationDegree == 270) {\n            int tempSpec = widthMeasureSpec;\n            widthMeasureSpec  = heightMeasureSpec;\n            heightMeasureSpec = tempSpec;\n        }\n\n        int width = View.getDefaultSize(mVideoWidth, widthMeasureSpec);\n        int height = View.getDefaultSize(mVideoHeight, heightMeasureSpec);\n        if (mCurrentAspectRatio == IRenderView.AR_MATCH_PARENT) {\n            width = widthMeasureSpec;\n            height = heightMeasureSpec;\n        } else if (mVideoWidth > 0 && mVideoHeight > 0) {\n            int widthSpecMode = View.MeasureSpec.getMode(widthMeasureSpec);\n            int widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec);\n            int heightSpecMode = View.MeasureSpec.getMode(heightMeasureSpec);\n            int heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec);\n\n            if (widthSpecMode == View.MeasureSpec.AT_MOST && heightSpecMode == View.MeasureSpec.AT_MOST) {\n                float specAspectRatio = (float) widthSpecSize / (float) heightSpecSize;\n                float displayAspectRatio;\n                switch (mCurrentAspectRatio) {\n                    case IRenderView.AR_16_9_FIT_PARENT:\n                        displayAspectRatio = 16.0f / 9.0f;\n                        if (mVideoRotationDegree == 90 || mVideoRotationDegree == 270)\n                            displayAspectRatio = 1.0f / displayAspectRatio;\n                        break;\n                    case IRenderView.AR_4_3_FIT_PARENT:\n                        displayAspectRatio = 4.0f / 3.0f;\n                        if (mVideoRotationDegree == 90 || mVideoRotationDegree == 270)\n                            displayAspectRatio = 1.0f / displayAspectRatio;\n                        break;\n                    case IRenderView.AR_ASPECT_FIT_PARENT:\n                    case IRenderView.AR_ASPECT_FILL_PARENT:\n                    case IRenderView.AR_ASPECT_WRAP_CONTENT:\n                    default:\n                        displayAspectRatio = (float) mVideoWidth / (float) mVideoHeight;\n                        if (mVideoSarNum > 0 && mVideoSarDen > 0)\n                            displayAspectRatio = displayAspectRatio * mVideoSarNum / mVideoSarDen;\n                        break;\n                }\n                boolean shouldBeWider = displayAspectRatio > specAspectRatio;\n\n                switch (mCurrentAspectRatio) {\n                    case IRenderView.AR_ASPECT_FIT_PARENT:\n                    case IRenderView.AR_16_9_FIT_PARENT:\n                    case IRenderView.AR_4_3_FIT_PARENT:\n                        if (shouldBeWider) {\n                            // too wide, fix width\n                            width = widthSpecSize;\n                            height = (int) (width / displayAspectRatio);\n                        } else {\n                            // too high, fix height\n                            height = heightSpecSize;\n                            width = (int) (height * displayAspectRatio);\n                        }\n                        break;\n                    case IRenderView.AR_ASPECT_FILL_PARENT:\n                        if (shouldBeWider) {\n                            // not high enough, fix height\n                            height = heightSpecSize;\n                            width = (int) (height * displayAspectRatio);\n                        } else {\n                            // not wide enough, fix width\n                            width = widthSpecSize;\n                            height = (int) (width / displayAspectRatio);\n                        }\n                        break;\n                    case IRenderView.AR_ASPECT_WRAP_CONTENT:\n                    default:\n                        if (shouldBeWider) {\n                            // too wide, fix width\n                            width = Math.min(mVideoWidth, widthSpecSize);\n                            height = (int) (width / displayAspectRatio);\n                        } else {\n                            // too high, fix height\n                            height = Math.min(mVideoHeight, heightSpecSize);\n                            width = (int) (height * displayAspectRatio);\n                        }\n                        break;\n                }\n            } else if (widthSpecMode == View.MeasureSpec.EXACTLY && heightSpecMode == View.MeasureSpec.EXACTLY) {\n                // the size is fixed\n                width = widthSpecSize;\n                height = heightSpecSize;\n\n                // for compatibility, we adjust size based on aspect ratio\n                if (mVideoWidth * height < width * mVideoHeight) {\n                    //Log.i(\"@@@\", \"image too wide, correcting\");\n                    width = height * mVideoWidth / mVideoHeight;\n                } else if (mVideoWidth * height > width * mVideoHeight) {\n                    //Log.i(\"@@@\", \"image too tall, correcting\");\n                    height = width * mVideoHeight / mVideoWidth;\n                }\n            } else if (widthSpecMode == View.MeasureSpec.EXACTLY) {\n                // only the width is fixed, adjust the height to match aspect ratio if possible\n                width = widthSpecSize;\n                height = width * mVideoHeight / mVideoWidth;\n                if (heightSpecMode == View.MeasureSpec.AT_MOST && height > heightSpecSize) {\n                    // couldn't match aspect ratio within the constraints\n                    height = heightSpecSize;\n                }\n            } else if (heightSpecMode == View.MeasureSpec.EXACTLY) {\n                // only the height is fixed, adjust the width to match aspect ratio if possible\n                height = heightSpecSize;\n                width = height * mVideoWidth / mVideoHeight;\n                if (widthSpecMode == View.MeasureSpec.AT_MOST && width > widthSpecSize) {\n                    // couldn't match aspect ratio within the constraints\n                    width = widthSpecSize;\n                }\n            } else {\n                // neither the width nor the height are fixed, try to use actual video size\n                width = mVideoWidth;\n                height = mVideoHeight;\n                if (heightSpecMode == View.MeasureSpec.AT_MOST && height > heightSpecSize) {\n                    // too tall, decrease both width and height\n                    height = heightSpecSize;\n                    width = height * mVideoWidth / mVideoHeight;\n                }\n                if (widthSpecMode == View.MeasureSpec.AT_MOST && width > widthSpecSize) {\n                    // too wide, decrease both width and height\n                    width = widthSpecSize;\n                    height = width * mVideoHeight / mVideoWidth;\n                }\n            }\n        } else {\n            // no size yet, just adopt the given spec sizes\n        }\n\n        mMeasuredWidth = width;\n        mMeasuredHeight = height;\n    }\n\n    public int getMeasuredWidth() {\n        return mMeasuredWidth;\n    }\n\n    public int getMeasuredHeight() {\n        return mMeasuredHeight;\n    }\n\n    public void setAspectRatio(int aspectRatio) {\n        mCurrentAspectRatio = aspectRatio;\n    }\n\n    @NonNull\n    public static String getAspectRatioText(Context context, int aspectRatio) {\n        String text;\n        switch (aspectRatio) {\n            case IRenderView.AR_ASPECT_FIT_PARENT:\n                text = context.getString(R.string.VideoView_ar_aspect_fit_parent);\n                break;\n            case IRenderView.AR_ASPECT_FILL_PARENT:\n                text = context.getString(R.string.VideoView_ar_aspect_fill_parent);\n                break;\n            case IRenderView.AR_ASPECT_WRAP_CONTENT:\n                text = context.getString(R.string.VideoView_ar_aspect_wrap_content);\n                break;\n            case IRenderView.AR_MATCH_PARENT:\n                text = context.getString(R.string.VideoView_ar_match_parent);\n                break;\n            case IRenderView.AR_16_9_FIT_PARENT:\n                text = context.getString(R.string.VideoView_ar_16_9_fit_parent);\n                break;\n            case IRenderView.AR_4_3_FIT_PARENT:\n                text = context.getString(R.string.VideoView_ar_4_3_fit_parent);\n                break;\n            default:\n                text = context.getString(R.string.N_A);\n                break;\n        }\n        return text;\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/MediaPlayerCompat.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\nimport tv.danmaku.ijk.media.player.IjkMediaPlayer;\nimport tv.danmaku.ijk.media.player.MediaPlayerProxy;\nimport tv.danmaku.ijk.media.player.TextureMediaPlayer;\n\npublic class MediaPlayerCompat {\n    public static String getName(IMediaPlayer mp) {\n        if (mp == null) {\n            return \"null\";\n        } else if (mp instanceof TextureMediaPlayer) {\n            StringBuilder sb = new StringBuilder(\"TextureMediaPlayer <\");\n            IMediaPlayer internalMediaPlayer = ((TextureMediaPlayer) mp).getInternalMediaPlayer();\n            if (internalMediaPlayer == null) {\n                sb.append(\"null>\");\n            } else {\n                sb.append(internalMediaPlayer.getClass().getSimpleName());\n                sb.append(\">\");\n            }\n            return sb.toString();\n        } else {\n            return mp.getClass().getSimpleName();\n        }\n    }\n\n    public static IjkMediaPlayer getIjkMediaPlayer(IMediaPlayer mp) {\n        IjkMediaPlayer ijkMediaPlayer = null;\n        if (mp == null) {\n            return null;\n        } if (mp instanceof IjkMediaPlayer) {\n            ijkMediaPlayer = (IjkMediaPlayer) mp;\n        } else if (mp instanceof MediaPlayerProxy && ((MediaPlayerProxy) mp).getInternalMediaPlayer() instanceof IjkMediaPlayer) {\n            ijkMediaPlayer = (IjkMediaPlayer) ((MediaPlayerProxy) mp).getInternalMediaPlayer();\n        }\n        return ijkMediaPlayer;\n    }\n\n    public static void selectTrack(IMediaPlayer mp, int stream) {\n        IjkMediaPlayer ijkMediaPlayer = getIjkMediaPlayer(mp);\n        if (ijkMediaPlayer == null)\n            return;\n        ijkMediaPlayer.selectTrack(stream);\n    }\n\n    public static void deselectTrack(IMediaPlayer mp, int stream) {\n        IjkMediaPlayer ijkMediaPlayer = getIjkMediaPlayer(mp);\n        if (ijkMediaPlayer == null)\n            return;\n        ijkMediaPlayer.deselectTrack(stream);\n    }\n\n    public static int getSelectedTrack(IMediaPlayer mp, int trackType) {\n        IjkMediaPlayer ijkMediaPlayer = getIjkMediaPlayer(mp);\n        if (ijkMediaPlayer == null)\n            return -1;\n        return ijkMediaPlayer.getSelectedTrack(trackType);\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/PlayerManager.java",
    "content": "package com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.pm.ActivityInfo;\nimport android.content.res.Resources;\nimport android.media.AudioManager;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.view.OrientationEventListener;\nimport android.view.Surface;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowManager;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.bilibili.lingxiao.ijkplayer.R;\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\nimport tv.danmaku.ijk.media.player.IjkMediaPlayer;\nimport tv.danmaku.ijk.media.player.pragma.DebugLog;\n\n/**\n * Created by yilv on 2018/3/29.\n */\n\npublic class PlayerManager {\n    /**\n     * 可能会剪裁,保持原视频的大小，显示在中心,当原视频的大小超过view的大小超过部分裁剪处理\n     */\n    public static final String SCALETYPE_FITPARENT=\"fitParent\";\n    /**\n     * 可能会剪裁,等比例放大视频，直到填满View为止,超过View的部分作裁剪处理\n     */\n    public static final String SCALETYPE_FILLPARENT=\"fillParent\";\n    /**\n     * 将视频的内容完整居中显示，如果视频大于view,则按比例缩视频直到完全显示在view中\n     */\n    public static final String SCALETYPE_WRAPCONTENT=\"wrapContent\";\n    /**\n     * 不剪裁,非等比例拉伸画面填满整个View\n     */\n    public static final String SCALETYPE_FITXY=\"fitXY\";\n    /**\n     * 不剪裁,非等比例拉伸画面到16:9,并完全显示在View中\n     */\n    public static final String SCALETYPE_16_9=\"16:9\";\n    /**\n     * 不剪裁,非等比例拉伸画面到4:3,并完全显示在View中\n     */\n    public static final String SCALETYPE_4_3=\"4:3\";\n\n    /**\n     * 状态常量\n     */\n    private final int STATUS_ERROR=-1;\n    private final int STATUS_IDLE=0;\n    private final int STATUS_LOADING=1;\n    private final int STATUS_PLAYING=2;\n    private final int STATUS_PAUSE=3;\n    private final int STATUS_COMPLETED=4;\n\n    private final Activity activity;\n    private final IjkVideoView videoView;\n    private final AudioManager audioManager;\n    public GestureDetector gestureDetector;\n\n    private boolean playerSupport;\n    private boolean isLive = false;//是否为直播\n    private boolean fullScreenOnly;\n    private boolean portrait;\n\n    private final int mMaxVolume;\n    private int screenWidthPixels;\n    private int currentPosition;\n    private int status=STATUS_IDLE;\n    private long pauseTime;\n    private String url;\n\n    private float brightness=-1;\n    private int volume=-1;\n    private long newPosition = -1;\n    private long defaultRetryTime=5000;\n\n    private OrientationEventListener orientationEventListener;\n    private PlayerStateListener playerStateListener;\n\n    public void setPlayerStateListener(PlayerStateListener playerStateListener) {\n        this.playerStateListener = playerStateListener;\n    }\n\n    private OnErrorListener onErrorListener=new OnErrorListener() {\n        @Override\n        public void onError(int what, int extra) {\n        }\n    };\n\n    private OnCompleteListener onCompleteListener=new OnCompleteListener() {\n        @Override\n        public void onComplete() {\n        }\n    };\n\n    private OnInfoListener onInfoListener=new OnInfoListener(){\n        @Override\n        public void onInfo(int what, int extra) {\n\n        }\n    };\n    private OnControlPanelVisibilityChangeListener onControlPanelVisibilityChangeListener=new OnControlPanelVisibilityChangeListener() {\n        @Override\n        public void change(boolean isShowing) {\n        }\n    };\n\n    /**\n     * try to play when error(only for live video)\n     * @param defaultRetryTime millisecond,0 will stop retry,default is 5000 millisecond\n     */\n    public void setDefaultRetryTime(long defaultRetryTime) {\n        this.defaultRetryTime = defaultRetryTime;\n    }\n\n    public PlayerManager(final Activity activity) {\n        try {\n            IjkMediaPlayer.loadLibrariesOnce(null);\n            IjkMediaPlayer.native_profileBegin(\"libijkplayer.so\");\n            playerSupport=true;\n        } catch (Throwable e) {\n            Log.e(\"GiraffePlayer\", \"loadLibraries error\", e);\n        }\n        this.activity=activity;\n        screenWidthPixels = activity.getResources().getDisplayMetrics().widthPixels;\n\n        videoView = (IjkVideoView) activity.findViewById(R.id.video_view);\n        videoView.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() {\n            @Override\n            public void onCompletion(IMediaPlayer mp) {\n                statusChange(STATUS_COMPLETED);\n                onCompleteListener.onComplete();\n            }\n        });\n        videoView.setOnErrorListener(new IMediaPlayer.OnErrorListener() {\n            @Override\n            public boolean onError(IMediaPlayer mp, int what, int extra) {\n                statusChange(STATUS_ERROR);\n                onErrorListener.onError(what,extra);\n                return true;\n            }\n        });\n        videoView.setOnInfoListener(new IMediaPlayer.OnInfoListener() {\n            @Override\n            public boolean onInfo(IMediaPlayer mp, int what, int extra) {\n                switch (what) {\n                    case IMediaPlayer.MEDIA_INFO_BUFFERING_START:\n                        statusChange(STATUS_LOADING);\n                        break;\n                    case IMediaPlayer.MEDIA_INFO_BUFFERING_END:\n                        statusChange(STATUS_PLAYING);\n                        break;\n                    case IMediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH:\n                        //显示下载速度\n//                      Toast.show(\"download rate:\" + extra);\n                        break;\n                    case IMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:\n                        statusChange(STATUS_PLAYING);\n                        break;\n                }\n                onInfoListener.onInfo(what,extra);\n                return false;\n            }\n        });\n\n        audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);\n        mMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);\n        gestureDetector = new GestureDetector(activity, new PlayerGestureListener());\n\n        if (fullScreenOnly) {\n            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\n        }\n        portrait=getScreenOrientation()== ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n\n        if (!playerSupport) {\n            DebugLog.e(\"\",\"播放器不支持此设备\");\n        }\n    }\n\n    private void statusChange(int newStatus) {\n        status = newStatus;\n        if (!isLive && newStatus==STATUS_COMPLETED) {\n            DebugLog.d(\"\",\"statusChange STATUS_COMPLETED...\");\n            if (playerStateListener != null){\n                playerStateListener.onComplete();\n            }\n        }else if (newStatus == STATUS_ERROR) {\n            DebugLog.d(\"\",\"statusChange STATUS_ERROR...\");\n            if (playerStateListener != null){\n                playerStateListener.onError();\n            }\n        } else if(newStatus==STATUS_LOADING){\n//            $.id(R.id.app_video_loading).visible();\n            if (playerStateListener != null){\n                playerStateListener.onLoading();\n            }\n            DebugLog.d(\"\",\"statusChange STATUS_LOADING...\");\n        } else if (newStatus == STATUS_PLAYING) {\n            DebugLog.d(\"\",\"statusChange STATUS_PLAYING...\");\n            if (playerStateListener != null){\n                playerStateListener.onPlay();\n            }\n        }\n    }\n\n    public void onPause() {\n        pauseTime= System.currentTimeMillis();\n        if (status==STATUS_PLAYING) {\n            videoView.pause();\n            if (!isLive) {\n                currentPosition = videoView.getCurrentPosition();\n            }\n        }\n    }\n\n    public void onResume() {\n        pauseTime=0;\n        if (status==STATUS_PLAYING) {\n            if (isLive) {\n                videoView.seekTo(0);\n            } else {\n                if (currentPosition>0) {\n                    videoView.seekTo(currentPosition);\n                }\n            }\n            videoView.start();\n        }\n    }\n\n    public void onDestroy() {\n        orientationEventListener.disable();\n        videoView.stopPlayback();\n    }\n\n    public void play(String url) {\n        this.url = url;\n        if (playerSupport) {\n            videoView.setVideoPath(url);\n            videoView.start();\n        }\n    }\n\n    private String generateTime(long time) {\n        int totalSeconds = (int) (time / 1000);\n        int seconds = totalSeconds % 60;\n        int minutes = (totalSeconds / 60) % 60;\n        int hours = totalSeconds / 3600;\n        return hours > 0 ? String.format(\"%02d:%02d:%02d\", hours, minutes, seconds) : String.format(\"%02d:%02d\", minutes, seconds);\n    }\n\n    private int getScreenOrientation() {\n        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();\n        DisplayMetrics dm = new DisplayMetrics();\n        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);\n        int width = dm.widthPixels;\n        int height = dm.heightPixels;\n        int orientation;\n        // if the device's natural orientation is portrait:\n        if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && height > width ||\n                (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && width > height) {\n            switch (rotation) {\n                case Surface.ROTATION_0:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n                    break;\n                case Surface.ROTATION_90:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;\n                    break;\n                case Surface.ROTATION_180:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;\n                    break;\n                case Surface.ROTATION_270:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;\n                    break;\n                default:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n                    break;\n            }\n        }\n        // if the device's natural orientation is landscape or if the device\n        // is square:\n        else {\n            switch (rotation) {\n                case Surface.ROTATION_0:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;\n                    break;\n                case Surface.ROTATION_90:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n                    break;\n                case Surface.ROTATION_180:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;\n                    break;\n                case Surface.ROTATION_270:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;\n                    break;\n                default:\n                    orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;\n                    break;\n            }\n        }\n        return orientation;\n    }\n\n    /**\n     * 滑动改变声音大小\n     *\n     * @param percent\n     */\n    private void onVolumeSlide(float percent) {\n        if (volume == -1) {\n            volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);\n            if (volume < 0)\n                volume = 0;\n        }\n        int index = (int) (percent * mMaxVolume) + volume;\n        if (index > mMaxVolume) {\n            index = mMaxVolume;\n        } else if (index < 0){\n            index = 0;\n        }\n        // 变更声音\n        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);\n        // 变更进度条\n        int i = (int) (index * 1.0 / mMaxVolume * 100);\n        String s = i + \"%\";\n        if (i == 0) {\n            s = \"off\";\n        }\n        DebugLog.d(\"\",\"onVolumeSlide:\"+s);\n    }\n\n    private void onProgressSlide(float percent) {\n        long position = videoView.getCurrentPosition();\n        long duration = videoView.getDuration();\n        long deltaMax = Math.min(100 * 1000, duration - position);\n        long delta = (long) (deltaMax * percent);\n\n        newPosition = delta + position;\n        if (newPosition > duration) {\n            newPosition = duration;\n        } else if (newPosition <= 0) {\n            newPosition=0;\n            delta=-position;\n        }\n        int showDelta = (int) delta / 1000;\n        if (showDelta != 0) {\n            String text = showDelta > 0 ? (\"+\" + showDelta) : \"\" + showDelta;\n            DebugLog.d(\"\",\"onProgressSlide:\" + text);\n        }\n    }\n\n    /**\n     * 滑动改变亮度\n     *\n     * @param percent\n     */\n    private void onBrightnessSlide(float percent) {\n        if (brightness < 0) {\n            brightness = activity.getWindow().getAttributes().screenBrightness;\n            if (brightness <= 0.00f){\n                brightness = 0.50f;\n            }else if (brightness < 0.01f){\n                brightness = 0.01f;\n            }\n        }\n        DebugLog.d(\"\",\"brightness:\"+brightness+\",percent:\"+ percent);\n        WindowManager.LayoutParams lpa = activity.getWindow().getAttributes();\n        lpa.screenBrightness = brightness + percent;\n        if (lpa.screenBrightness > 1.0f){\n            lpa.screenBrightness = 1.0f;\n        }else if (lpa.screenBrightness < 0.01f){\n            lpa.screenBrightness = 0.01f;\n        }\n        activity.getWindow().setAttributes(lpa);\n    }\n\n    public void setFullScreenOnly(boolean fullScreenOnly) {\n        this.fullScreenOnly = fullScreenOnly;\n        tryFullScreen(fullScreenOnly);\n        if (fullScreenOnly) {\n            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\n        } else {\n            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);\n        }\n    }\n\n    private void tryFullScreen(boolean fullScreen) {\n        if (activity instanceof AppCompatActivity) {\n            ActionBar supportActionBar = ((AppCompatActivity) activity).getSupportActionBar();\n            if (supportActionBar != null) {\n                if (fullScreen) {\n                    supportActionBar.hide();\n                } else {\n                    supportActionBar.show();\n                }\n            }\n        }\n        setFullScreen(fullScreen);\n    }\n\n    private void setFullScreen(boolean fullScreen) {\n        if (activity != null) {\n            WindowManager.LayoutParams attrs = activity.getWindow().getAttributes();\n            if (fullScreen) {\n                attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;\n                activity.getWindow().setAttributes(attrs);\n                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);\n            } else {\n                attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);\n                activity.getWindow().setAttributes(attrs);\n                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);\n            }\n        }\n    }\n\n    /**\n     * <pre>\n     *     fitParent:可能会剪裁,保持原视频的大小，显示在中心,当原视频的大小超过view的大小超过部分裁剪处理\n     *     fillParent:可能会剪裁,等比例放大视频，直到填满View为止,超过View的部分作裁剪处理\n     *     wrapContent:将视频的内容完整居中显示，如果视频大于view,则按比例缩视频直到完全显示在view中\n     *     fitXY:不剪裁,非等比例拉伸画面填满整个View\n     *     16:9:不剪裁,非等比例拉伸画面到16:9,并完全显示在View中\n     *     4:3:不剪裁,非等比例拉伸画面到4:3,并完全显示在View中\n     * </pre>\n     * @param scaleType\n     */\n    public void setScaleType(String scaleType) {\n        if (SCALETYPE_FITPARENT.equals(scaleType)) {\n            videoView.setAspectRatio(IRenderView.AR_ASPECT_FIT_PARENT);\n        }else if (SCALETYPE_FILLPARENT.equals(scaleType)) {\n            videoView.setAspectRatio(IRenderView.AR_ASPECT_FILL_PARENT);\n        }else if (SCALETYPE_WRAPCONTENT.equals(scaleType)) {\n            videoView.setAspectRatio(IRenderView.AR_ASPECT_WRAP_CONTENT);\n        }else if (SCALETYPE_FITXY.equals(scaleType)) {\n            videoView.setAspectRatio(IRenderView.AR_MATCH_PARENT);\n        }else if (SCALETYPE_16_9.equals(scaleType)) {\n            videoView.setAspectRatio(IRenderView.AR_16_9_FIT_PARENT);\n        }else if (SCALETYPE_4_3.equals(scaleType)) {\n            videoView.setAspectRatio(IRenderView.AR_4_3_FIT_PARENT);\n        }\n    }\n\n    public void start() {\n        videoView.start();\n    }\n\n    public void pause() {\n        videoView.pause();\n    }\n\n    public boolean onBackPressed() {\n        if (!fullScreenOnly && getScreenOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {\n            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\n            return true;\n        }\n        return false;\n    }\n\n    class Query {\n        private final Activity activity;\n        private View view;\n\n        public Query(Activity activity) {\n            this.activity=activity;\n        }\n\n        public Query id(int id) {\n            view = activity.findViewById(id);\n            return this;\n        }\n\n        public Query image(int resId) {\n            if (view instanceof ImageView) {\n                ((ImageView) view).setImageResource(resId);\n            }\n            return this;\n        }\n\n        public Query visible() {\n            if (view != null) {\n                view.setVisibility(View.VISIBLE);\n            }\n            return this;\n        }\n\n        public Query gone() {\n            if (view != null) {\n                view.setVisibility(View.GONE);\n            }\n            return this;\n        }\n\n        public Query invisible() {\n            if (view != null) {\n                view.setVisibility(View.INVISIBLE);\n            }\n            return this;\n        }\n\n        public Query clicked(View.OnClickListener handler) {\n            if (view != null) {\n                view.setOnClickListener(handler);\n            }\n            return this;\n        }\n\n        public Query text(CharSequence text) {\n            if (view!=null && view instanceof TextView) {\n                ((TextView) view).setText(text);\n            }\n            return this;\n        }\n\n        public Query visibility(int visible) {\n            if (view != null) {\n                view.setVisibility(visible);\n            }\n            return this;\n        }\n\n        private void size(boolean width, int n, boolean dip){\n            if(view != null){\n                ViewGroup.LayoutParams lp = view.getLayoutParams();\n                if(n > 0 && dip){\n                    n = dip2pixel(activity, n);\n                }\n                if(width){\n                    lp.width = n;\n                }else{\n                    lp.height = n;\n                }\n                view.setLayoutParams(lp);\n            }\n        }\n\n        public void height(int height, boolean dip) {\n            size(false,height,dip);\n        }\n\n        public int dip2pixel(Context context, float n){\n            int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, n, context.getResources().getDisplayMetrics());\n            return value;\n        }\n\n        public float pixel2dip(Context context, float n){\n            Resources resources = context.getResources();\n            DisplayMetrics metrics = resources.getDisplayMetrics();\n            float dp = n / (metrics.densityDpi / 160f);\n            return dp;\n        }\n    }\n\n    public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListener {\n        private boolean firstTouch;\n        private boolean volumeControl;\n        private boolean toSeek;\n\n        /**\n         * 双击\n         */\n        @Override\n        public boolean onDoubleTap(MotionEvent e) {\n            videoView.toggleAspectRatio();\n            return true;\n        }\n\n        @Override\n        public boolean onDown(MotionEvent e) {\n            firstTouch = true;\n            return super.onDown(e);\n        }\n\n        /**\n         * 滑动\n         */\n        @Override\n        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {\n            float mOldX = e1.getX(), mOldY = e1.getY();\n            float deltaY = mOldY - e2.getY();\n            float deltaX = mOldX - e2.getX();\n            if (firstTouch) {\n                toSeek = Math.abs(distanceX) >= Math.abs(distanceY);\n                volumeControl=mOldX > screenWidthPixels * 0.5f;\n                firstTouch = false;\n            }\n\n            if (toSeek) {\n                if (!isLive) {\n                    onProgressSlide(-deltaX / videoView.getWidth());\n                }\n            } else {\n                float percent = deltaY / videoView.getHeight();\n                if (volumeControl) {\n                    onVolumeSlide(percent);\n                } else {\n                    onBrightnessSlide(percent);\n                }\n            }\n\n            return super.onScroll(e1, e2, distanceX, distanceY);\n        }\n\n        @Override\n        public boolean onSingleTapUp(MotionEvent e) {\n            return true;\n        }\n    }\n\n    /**\n     * is player support this device\n     * @return\n     */\n    public boolean isPlayerSupport() {\n        return playerSupport;\n    }\n\n    /**\n     * 是否正在播放\n     * @return\n     */\n    public boolean isPlaying() {\n        return videoView!=null?videoView.isPlaying():false;\n    }\n\n    public void stop(){\n        videoView.stopPlayback();\n    }\n\n    public int getCurrentPosition(){\n        return videoView.getCurrentPosition();\n    }\n\n    public IjkVideoView getVideoView(){\n        if (videoView != null){\n            return videoView;\n        }\n        return null;\n    }\n\n    /**\n     * get video duration\n     * @return\n     */\n    public int getDuration(){\n        return videoView.getDuration();\n    }\n\n    public PlayerManager playInFullScreen(boolean fullScreen){\n        if (fullScreen) {\n            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\n        }\n        return this;\n    }\n\n    public PlayerManager onError(OnErrorListener onErrorListener) {\n        this.onErrorListener = onErrorListener;\n        return this;\n    }\n\n    public PlayerManager onComplete(OnCompleteListener onCompleteListener) {\n        this.onCompleteListener = onCompleteListener;\n        return this;\n    }\n\n    public PlayerManager onInfo(OnInfoListener onInfoListener) {\n        this.onInfoListener = onInfoListener;\n        return this;\n    }\n\n    public PlayerManager onControlPanelVisibilityChange(OnControlPanelVisibilityChangeListener listener){\n        this.onControlPanelVisibilityChangeListener = listener;\n        return this;\n    }\n\n    /**\n     * set is live (can't seek forward)\n     * @param isLive\n     * @return\n     */\n    public PlayerManager live(boolean isLive) {\n        this.isLive = isLive;\n        return this;\n    }\n\n    public PlayerManager toggleAspectRatio(){\n        if (videoView != null) {\n            videoView.toggleAspectRatio();\n        }\n        return this;\n    }\n\n    public interface PlayerStateListener{\n        void onComplete();\n        void onError();\n        void onLoading();\n        void onPlay();\n    }\n\n    public interface OnErrorListener{\n        void onError(int what, int extra);\n    }\n\n    public interface OnCompleteListener{\n        void onComplete();\n    }\n\n    public interface OnControlPanelVisibilityChangeListener{\n        void change(boolean isShowing);\n    }\n\n    public interface OnInfoListener{\n        void onInfo(int what, int extra);\n    }\n}"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/SurfaceRenderView.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.SurfaceTexture;\nimport android.os.Build;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.Surface;\nimport android.view.SurfaceHolder;\nimport android.view.SurfaceView;\nimport android.view.View;\nimport android.view.accessibility.AccessibilityEvent;\nimport android.view.accessibility.AccessibilityNodeInfo;\n\nimport java.lang.ref.WeakReference;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\nimport tv.danmaku.ijk.media.player.ISurfaceTextureHolder;\n\npublic class SurfaceRenderView extends SurfaceView implements IRenderView {\n    private MeasureHelper mMeasureHelper;\n\n    public SurfaceRenderView(Context context) {\n        super(context);\n        initView(context);\n    }\n\n    public SurfaceRenderView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initView(context);\n    }\n\n    public SurfaceRenderView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        initView(context);\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public SurfaceRenderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        initView(context);\n    }\n\n    private void initView(Context context) {\n        mMeasureHelper = new MeasureHelper(this);\n        mSurfaceCallback = new SurfaceCallback(this);\n        getHolder().addCallback(mSurfaceCallback);\n        //noinspection deprecation\n        getHolder().setType(SurfaceHolder.SURFACE_TYPE_NORMAL);\n    }\n\n    @Override\n    public View getView() {\n        return this;\n    }\n\n    @Override\n    public boolean shouldWaitForResize() {\n        return true;\n    }\n\n    //--------------------\n    // Layout & Measure\n    //--------------------\n    @Override\n    public void setVideoSize(int videoWidth, int videoHeight) {\n        if (videoWidth > 0 && videoHeight > 0) {\n            mMeasureHelper.setVideoSize(videoWidth, videoHeight);\n            getHolder().setFixedSize(videoWidth, videoHeight);\n            requestLayout();\n        }\n    }\n\n    @Override\n    public void setVideoSampleAspectRatio(int videoSarNum, int videoSarDen) {\n        if (videoSarNum > 0 && videoSarDen > 0) {\n            mMeasureHelper.setVideoSampleAspectRatio(videoSarNum, videoSarDen);\n            requestLayout();\n        }\n    }\n\n    @Override\n    public void setVideoRotation(int degree) {\n        Log.e(\"\", \"SurfaceView doesn't support rotation (\" + degree + \")!\\n\");\n    }\n\n    @Override\n    public void setAspectRatio(int aspectRatio) {\n        mMeasureHelper.setAspectRatio(aspectRatio);\n        requestLayout();\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        if (this.getWidth() != 0) {\n            setMeasuredDimension(this.getWidth(), this.getHeight());\n            return;\n        }\n        int width = getDefaultSize(0, widthMeasureSpec);\n        int height = getDefaultSize(0, heightMeasureSpec);\n        setMeasuredDimension(width, height);\n    }\n\n    //--------------------\n    // SurfaceViewHolder\n    //--------------------\n\n    private static final class InternalSurfaceHolder implements IRenderView.ISurfaceHolder {\n        private SurfaceRenderView mSurfaceView;\n        private SurfaceHolder mSurfaceHolder;\n\n        public InternalSurfaceHolder(@NonNull SurfaceRenderView surfaceView,\n                                     @Nullable SurfaceHolder surfaceHolder) {\n            mSurfaceView = surfaceView;\n            mSurfaceHolder = surfaceHolder;\n        }\n\n        public void bindToMediaPlayer(IMediaPlayer mp) {\n            if (mp != null) {\n                if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) &&\n                        (mp instanceof ISurfaceTextureHolder)) {\n                    ISurfaceTextureHolder textureHolder = (ISurfaceTextureHolder) mp;\n                    textureHolder.setSurfaceTexture(null);\n                }\n                mp.setDisplay(mSurfaceHolder);\n            }\n        }\n\n        @NonNull\n        @Override\n        public IRenderView getRenderView() {\n            return mSurfaceView;\n        }\n\n        @Nullable\n        @Override\n        public SurfaceHolder getSurfaceHolder() {\n            return mSurfaceHolder;\n        }\n\n        @Nullable\n        @Override\n        public SurfaceTexture getSurfaceTexture() {\n            return null;\n        }\n\n        @Nullable\n        @Override\n        public Surface openSurface() {\n            if (mSurfaceHolder == null)\n                return null;\n            return mSurfaceHolder.getSurface();\n        }\n    }\n\n    //-------------------------\n    // SurfaceHolder.Callback\n    //-------------------------\n\n    @Override\n    public void addRenderCallback(IRenderCallback callback) {\n        mSurfaceCallback.addRenderCallback(callback);\n    }\n\n    @Override\n    public void removeRenderCallback(IRenderCallback callback) {\n        mSurfaceCallback.removeRenderCallback(callback);\n    }\n\n    private SurfaceCallback mSurfaceCallback;\n\n    private static final class SurfaceCallback implements SurfaceHolder.Callback {\n        private SurfaceHolder mSurfaceHolder;\n        private boolean mIsFormatChanged;\n        private int mFormat;\n        private int mWidth;\n        private int mHeight;\n\n        private WeakReference<SurfaceRenderView> mWeakSurfaceView;\n        private Map<IRenderCallback, Object> mRenderCallbackMap = new ConcurrentHashMap<IRenderCallback, Object>();\n\n        public SurfaceCallback(@NonNull SurfaceRenderView surfaceView) {\n            mWeakSurfaceView = new WeakReference<SurfaceRenderView>(surfaceView);\n        }\n\n        public void addRenderCallback(@NonNull IRenderCallback callback) {\n            mRenderCallbackMap.put(callback, callback);\n\n            ISurfaceHolder surfaceHolder = null;\n            if (mSurfaceHolder != null) {\n                if (surfaceHolder == null)\n                    surfaceHolder = new InternalSurfaceHolder(mWeakSurfaceView.get(), mSurfaceHolder);\n                callback.onSurfaceCreated(surfaceHolder, mWidth, mHeight);\n            }\n\n            if (mIsFormatChanged) {\n                if (surfaceHolder == null)\n                    surfaceHolder = new InternalSurfaceHolder(mWeakSurfaceView.get(), mSurfaceHolder);\n                callback.onSurfaceChanged(surfaceHolder, mFormat, mWidth, mHeight);\n            }\n        }\n\n        public void removeRenderCallback(@NonNull IRenderCallback callback) {\n            mRenderCallbackMap.remove(callback);\n        }\n\n        @Override\n        public void surfaceCreated(SurfaceHolder holder) {\n            mSurfaceHolder = holder;\n            mIsFormatChanged = false;\n            mFormat = 0;\n            mWidth = 0;\n            mHeight = 0;\n\n            ISurfaceHolder surfaceHolder = new InternalSurfaceHolder(mWeakSurfaceView.get(), mSurfaceHolder);\n            for (IRenderCallback renderCallback : mRenderCallbackMap.keySet()) {\n                renderCallback.onSurfaceCreated(surfaceHolder, 0, 0);\n            }\n        }\n\n        @Override\n        public void surfaceDestroyed(SurfaceHolder holder) {\n            mSurfaceHolder = null;\n            mIsFormatChanged = false;\n            mFormat = 0;\n            mWidth = 0;\n            mHeight = 0;\n\n            ISurfaceHolder surfaceHolder = new InternalSurfaceHolder(mWeakSurfaceView.get(), mSurfaceHolder);\n            for (IRenderCallback renderCallback : mRenderCallbackMap.keySet()) {\n                renderCallback.onSurfaceDestroyed(surfaceHolder);\n            }\n        }\n\n        @Override\n        public void surfaceChanged(SurfaceHolder holder, int format,\n                                   int width, int height) {\n            mSurfaceHolder = holder;\n            mIsFormatChanged = true;\n            mFormat = format;\n            mWidth = width;\n            mHeight = height;\n\n            // mMeasureHelper.setVideoSize(width, height);\n\n            ISurfaceHolder surfaceHolder = new InternalSurfaceHolder(mWeakSurfaceView.get(), mSurfaceHolder);\n            for (IRenderCallback renderCallback : mRenderCallbackMap.keySet()) {\n                renderCallback.onSurfaceChanged(surfaceHolder, format, width, height);\n            }\n        }\n    }\n\n    //--------------------\n    // Accessibility\n    //--------------------\n\n    @Override\n    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {\n        super.onInitializeAccessibilityEvent(event);\n        event.setClassName(SurfaceRenderView.class.getName());\n    }\n\n    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)\n    @Override\n    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {\n        super.onInitializeAccessibilityNodeInfo(info);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {\n            info.setClassName(SurfaceRenderView.class.getName());\n        }\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/TableLayoutBinder.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.content.Context;\nimport androidx.appcompat.app.AlertDialog;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TableLayout;\nimport android.widget.TextView;\nimport com.bilibili.lingxiao.ijkplayer.R;\n\npublic class TableLayoutBinder {\n    private Context mContext;\n    public ViewGroup mTableView;\n    public TableLayout mTableLayout;\n\n    public TableLayoutBinder(Context context) {\n        this(context, R.layout.table_media_info);\n    }\n\n    public TableLayoutBinder(Context context, int layoutResourceId) {\n        mContext = context;\n        mTableView = (ViewGroup) LayoutInflater.from(mContext).inflate(layoutResourceId, null);\n        mTableLayout = (TableLayout) mTableView.findViewById(R.id.table);\n    }\n\n    public TableLayoutBinder(Context context, TableLayout tableLayout) {\n        mContext = context;\n        mTableView = tableLayout;\n        mTableLayout = tableLayout;\n    }\n\n    public View appendRow1(String name, String value) {\n        return appendRow(R.layout.table_media_info_row1, name, value);\n    }\n\n    public View appendRow1(int nameId, String value) {\n        return appendRow1(mContext.getString(nameId), value);\n    }\n\n    public View appendRow2(String name, String value) {\n        return appendRow(R.layout.table_media_info_row2, name, value);\n    }\n\n    public View appendRow2(int nameId, String value) {\n        return appendRow2(mContext.getString(nameId), value);\n    }\n\n    public View appendSection(String name) {\n        return appendRow(R.layout.table_media_info_section, name, null);\n    }\n\n    public View appendSection(int nameId) {\n        return appendSection(mContext.getString(nameId));\n    }\n\n    public View appendRow(int layoutId, String name, String value) {\n        ViewGroup rowView = (ViewGroup) LayoutInflater.from(mContext).inflate(layoutId, mTableLayout, false);\n        setNameValueText(rowView, name, value);\n\n        mTableLayout.addView(rowView);\n        return rowView;\n    }\n\n    public ViewHolder obtainViewHolder(View rowView) {\n        ViewHolder viewHolder = (ViewHolder) rowView.getTag();\n        if (viewHolder == null) {\n            viewHolder = new ViewHolder();\n            viewHolder.mNameTextView = (TextView) rowView.findViewById(R.id.name);\n            viewHolder.mValueTextView = (TextView) rowView.findViewById(R.id.value);\n            rowView.setTag(viewHolder);\n        }\n        return viewHolder;\n    }\n\n    public void setNameValueText(View rowView, String name, String value) {\n        ViewHolder viewHolder = obtainViewHolder(rowView);\n        viewHolder.setName(name);\n        viewHolder.setValue(value);\n    }\n\n    public void setValueText(View rowView, String value) {\n        ViewHolder viewHolder = obtainViewHolder(rowView);\n        viewHolder.setValue(value);\n    }\n\n    public ViewGroup buildLayout() {\n        return mTableView;\n    }\n\n    public AlertDialog.Builder buildAlertDialogBuilder() {\n        AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(mContext);\n        dlgBuilder.setView(buildLayout());\n        return dlgBuilder;\n    }\n\n    private static class ViewHolder {\n        public TextView mNameTextView;\n        public TextView mValueTextView;\n\n        public void setName(String name) {\n            if (mNameTextView != null) {\n                mNameTextView.setText(name);\n            }\n        }\n\n        public void setValue(String value) {\n            if (mValueTextView != null) {\n                mValueTextView.setText(value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/media/TextureRenderView.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.media;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.SurfaceTexture;\nimport android.os.Build;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.Surface;\nimport android.view.SurfaceHolder;\nimport android.view.TextureView;\nimport android.view.View;\nimport android.view.accessibility.AccessibilityEvent;\nimport android.view.accessibility.AccessibilityNodeInfo;\n\nimport java.lang.ref.WeakReference;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\nimport tv.danmaku.ijk.media.player.ISurfaceTextureHolder;\nimport tv.danmaku.ijk.media.player.ISurfaceTextureHost;\n\n@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)\npublic class TextureRenderView extends TextureView implements IRenderView {\n    private static final String TAG = \"TextureRenderView\";\n    private MeasureHelper mMeasureHelper;\n\n    public TextureRenderView(Context context) {\n        super(context);\n        initView(context);\n    }\n\n    public TextureRenderView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initView(context);\n    }\n\n    public TextureRenderView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        initView(context);\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public TextureRenderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        initView(context);\n    }\n\n    private void initView(Context context) {\n        mMeasureHelper = new MeasureHelper(this);\n        mSurfaceCallback = new SurfaceCallback(this);\n        setSurfaceTextureListener(mSurfaceCallback);\n    }\n\n    @Override\n    public View getView() {\n        return this;\n    }\n\n    @Override\n    public boolean shouldWaitForResize() {\n        return false;\n    }\n\n    @Override\n    protected void onDetachedFromWindow() {\n        mSurfaceCallback.willDetachFromWindow();\n        super.onDetachedFromWindow();\n        mSurfaceCallback.didDetachFromWindow();\n    }\n\n    //--------------------\n    // Layout & Measure\n    //--------------------\n    @Override\n    public void setVideoSize(int videoWidth, int videoHeight) {\n        if (videoWidth > 0 && videoHeight > 0) {\n            mMeasureHelper.setVideoSize(videoWidth, videoHeight);\n            requestLayout();\n        }\n    }\n\n    @Override\n    public void setVideoSampleAspectRatio(int videoSarNum, int videoSarDen) {\n        if (videoSarNum > 0 && videoSarDen > 0) {\n            mMeasureHelper.setVideoSampleAspectRatio(videoSarNum, videoSarDen);\n            requestLayout();\n        }\n    }\n\n    @Override\n    public void setVideoRotation(int degree) {\n        mMeasureHelper.setVideoRotation(degree);\n        setRotation(degree);\n    }\n\n    @Override\n    public void setAspectRatio(int aspectRatio) {\n        mMeasureHelper.setAspectRatio(aspectRatio);\n        requestLayout();\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        mMeasureHelper.doMeasure(widthMeasureSpec, heightMeasureSpec);\n        setMeasuredDimension(mMeasureHelper.getMeasuredWidth(), mMeasureHelper.getMeasuredHeight());\n    }\n\n    //--------------------\n    // TextureViewHolder\n    //--------------------\n\n    public IRenderView.ISurfaceHolder getSurfaceHolder() {\n        return new InternalSurfaceHolder(this, mSurfaceCallback.mSurfaceTexture, mSurfaceCallback);\n    }\n\n    private static final class InternalSurfaceHolder implements IRenderView.ISurfaceHolder {\n        private TextureRenderView mTextureView;\n        private SurfaceTexture mSurfaceTexture;\n        private ISurfaceTextureHost mSurfaceTextureHost;\n\n        public InternalSurfaceHolder(@NonNull TextureRenderView textureView,\n                                     @Nullable SurfaceTexture surfaceTexture,\n                                     @NonNull ISurfaceTextureHost surfaceTextureHost) {\n            mTextureView = textureView;\n            mSurfaceTexture = surfaceTexture;\n            mSurfaceTextureHost = surfaceTextureHost;\n        }\n\n        @TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n        public void bindToMediaPlayer(IMediaPlayer mp) {\n            if (mp == null)\n                return;\n\n            if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) &&\n                    (mp instanceof ISurfaceTextureHolder)) {\n                ISurfaceTextureHolder textureHolder = (ISurfaceTextureHolder) mp;\n                mTextureView.mSurfaceCallback.setOwnSurfaceTexture(false);\n\n                SurfaceTexture surfaceTexture = textureHolder.getSurfaceTexture();\n                if (surfaceTexture != null) {\n                    mTextureView.setSurfaceTexture(surfaceTexture);\n                } else {\n                    textureHolder.setSurfaceTexture(mSurfaceTexture);\n                    textureHolder.setSurfaceTextureHost(mTextureView.mSurfaceCallback);\n                }\n            } else {\n                mp.setSurface(openSurface());\n            }\n        }\n\n        @NonNull\n        @Override\n        public IRenderView getRenderView() {\n            return mTextureView;\n        }\n\n        @Nullable\n        @Override\n        public SurfaceHolder getSurfaceHolder() {\n            return null;\n        }\n\n        @Nullable\n        @Override\n        public SurfaceTexture getSurfaceTexture() {\n            return mSurfaceTexture;\n        }\n\n        @Nullable\n        @Override\n        public Surface openSurface() {\n            if (mSurfaceTexture == null)\n                return null;\n            return new Surface(mSurfaceTexture);\n        }\n    }\n\n    //-------------------------\n    // SurfaceHolder.Callback\n    //-------------------------\n\n    @Override\n    public void addRenderCallback(IRenderCallback callback) {\n        mSurfaceCallback.addRenderCallback(callback);\n    }\n\n    @Override\n    public void removeRenderCallback(IRenderCallback callback) {\n        mSurfaceCallback.removeRenderCallback(callback);\n    }\n\n    private SurfaceCallback mSurfaceCallback;\n\n    private static final class SurfaceCallback implements SurfaceTextureListener, ISurfaceTextureHost {\n        private SurfaceTexture mSurfaceTexture;\n        private boolean mIsFormatChanged;\n        private int mWidth;\n        private int mHeight;\n\n        private boolean mOwnSurfaceTexture = true;\n        private boolean mWillDetachFromWindow = false;\n        private boolean mDidDetachFromWindow = false;\n\n        private WeakReference<TextureRenderView> mWeakRenderView;\n        private Map<IRenderCallback, Object> mRenderCallbackMap = new ConcurrentHashMap<IRenderCallback, Object>();\n\n        public SurfaceCallback(@NonNull TextureRenderView renderView) {\n            mWeakRenderView = new WeakReference<TextureRenderView>(renderView);\n        }\n\n        public void setOwnSurfaceTexture(boolean ownSurfaceTexture) {\n            mOwnSurfaceTexture = ownSurfaceTexture;\n        }\n\n        public void addRenderCallback(@NonNull IRenderCallback callback) {\n            mRenderCallbackMap.put(callback, callback);\n\n            ISurfaceHolder surfaceHolder = null;\n            if (mSurfaceTexture != null) {\n                if (surfaceHolder == null)\n                    surfaceHolder = new InternalSurfaceHolder(mWeakRenderView.get(), mSurfaceTexture, this);\n                callback.onSurfaceCreated(surfaceHolder, mWidth, mHeight);\n            }\n\n            if (mIsFormatChanged) {\n                if (surfaceHolder == null)\n                    surfaceHolder = new InternalSurfaceHolder(mWeakRenderView.get(), mSurfaceTexture, this);\n                callback.onSurfaceChanged(surfaceHolder, 0, mWidth, mHeight);\n            }\n        }\n\n        public void removeRenderCallback(@NonNull IRenderCallback callback) {\n            mRenderCallbackMap.remove(callback);\n        }\n\n        @Override\n        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {\n            mSurfaceTexture = surface;\n            mIsFormatChanged = false;\n            mWidth = 0;\n            mHeight = 0;\n\n            ISurfaceHolder surfaceHolder = new InternalSurfaceHolder(mWeakRenderView.get(), surface, this);\n            for (IRenderCallback renderCallback : mRenderCallbackMap.keySet()) {\n                renderCallback.onSurfaceCreated(surfaceHolder, 0, 0);\n            }\n        }\n\n        @Override\n        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {\n            mSurfaceTexture = surface;\n            mIsFormatChanged = true;\n            mWidth = width;\n            mHeight = height;\n\n            ISurfaceHolder surfaceHolder = new InternalSurfaceHolder(mWeakRenderView.get(), surface, this);\n            for (IRenderCallback renderCallback : mRenderCallbackMap.keySet()) {\n                renderCallback.onSurfaceChanged(surfaceHolder, 0, width, height);\n            }\n        }\n\n        @Override\n        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {\n            mSurfaceTexture = surface;\n            mIsFormatChanged = false;\n            mWidth = 0;\n            mHeight = 0;\n\n            ISurfaceHolder surfaceHolder = new InternalSurfaceHolder(mWeakRenderView.get(), surface, this);\n            for (IRenderCallback renderCallback : mRenderCallbackMap.keySet()) {\n                renderCallback.onSurfaceDestroyed(surfaceHolder);\n            }\n\n            Log.d(TAG, \"onSurfaceTextureDestroyed: destroy: \" + mOwnSurfaceTexture);\n            return mOwnSurfaceTexture;\n        }\n\n        @Override\n        public void onSurfaceTextureUpdated(SurfaceTexture surface) {\n        }\n\n        //-------------------------\n        // ISurfaceTextureHost\n        //-------------------------\n\n        @Override\n        public void releaseSurfaceTexture(SurfaceTexture surfaceTexture) {\n            if (surfaceTexture == null) {\n                Log.d(TAG, \"releaseSurfaceTexture: null\");\n            } else if (mDidDetachFromWindow) {\n                if (surfaceTexture != mSurfaceTexture) {\n                    Log.d(TAG, \"releaseSurfaceTexture: didDetachFromWindow(): release different SurfaceTexture\");\n                    surfaceTexture.release();\n                } else if (!mOwnSurfaceTexture) {\n                    Log.d(TAG, \"releaseSurfaceTexture: didDetachFromWindow(): release detached SurfaceTexture\");\n                    surfaceTexture.release();\n                } else {\n                    Log.d(TAG, \"releaseSurfaceTexture: didDetachFromWindow(): already released by TextureView\");\n                }\n            } else if (mWillDetachFromWindow) {\n                if (surfaceTexture != mSurfaceTexture) {\n                    Log.d(TAG, \"releaseSurfaceTexture: willDetachFromWindow(): release different SurfaceTexture\");\n                    surfaceTexture.release();\n                } else if (!mOwnSurfaceTexture) {\n                    Log.d(TAG, \"releaseSurfaceTexture: willDetachFromWindow(): re-attach SurfaceTexture to TextureView\");\n                    setOwnSurfaceTexture(true);\n                } else {\n                    Log.d(TAG, \"releaseSurfaceTexture: willDetachFromWindow(): will released by TextureView\");\n                }\n            } else {\n                if (surfaceTexture != mSurfaceTexture) {\n                    Log.d(TAG, \"releaseSurfaceTexture: alive: release different SurfaceTexture\");\n                    surfaceTexture.release();\n                } else if (!mOwnSurfaceTexture) {\n                    Log.d(TAG, \"releaseSurfaceTexture: alive: re-attach SurfaceTexture to TextureView\");\n                    setOwnSurfaceTexture(true);\n                } else {\n                    Log.d(TAG, \"releaseSurfaceTexture: alive: will released by TextureView\");\n                }\n            }\n        }\n\n        public void willDetachFromWindow() {\n            Log.d(TAG, \"willDetachFromWindow()\");\n            mWillDetachFromWindow = true;\n        }\n\n        public void didDetachFromWindow() {\n            Log.d(TAG, \"didDetachFromWindow()\");\n            mDidDetachFromWindow = true;\n        }\n    }\n\n    //--------------------\n    // Accessibility\n    //--------------------\n\n    @Override\n    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {\n        super.onInitializeAccessibilityEvent(event);\n        event.setClassName(TextureRenderView.class.getName());\n    }\n\n    @Override\n    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {\n        super.onInitializeAccessibilityNodeInfo(info);\n        info.setClassName(TextureRenderView.class.getName());\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/services/MediaPlayerService.java",
    "content": "/*\n * Copyright (C) 2015 Bilibili\n * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.bilibili.lingxiao.ijkplayer.services;\n\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.IBinder;\nimport androidx.annotation.Nullable;\n\nimport tv.danmaku.ijk.media.player.IMediaPlayer;\n\npublic class MediaPlayerService extends Service {\n    private static IMediaPlayer sMediaPlayer;\n\n    public static Intent newIntent(Context context) {\n        Intent intent = new Intent(context, MediaPlayerService.class);\n        return intent;\n    }\n\n    public static void intentToStart(Context context) {\n        context.startService(newIntent(context));\n    }\n\n    public static void intentToStop(Context context) {\n        context.stopService(newIntent(context));\n    }\n\n    @Nullable\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n\n    public static void setMediaPlayer(IMediaPlayer mp) {\n        if (sMediaPlayer != null && sMediaPlayer != mp) {\n            if (sMediaPlayer.isPlaying())\n                sMediaPlayer.stop();\n            sMediaPlayer.release();\n            sMediaPlayer = null;\n        }\n        sMediaPlayer = mp;\n    }\n\n    public static IMediaPlayer getMediaPlayer() {\n        return sMediaPlayer;\n    }\n}\n"
  },
  {
    "path": "ijkplayer/src/main/java/com/bilibili/lingxiao/ijkplayer/widget/SimplePlayerView.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer.widget\n\nimport android.content.Context\nimport android.net.Uri\nimport android.os.Handler\nimport android.os.Looper\nimport android.os.Message\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.widget.RelativeLayout\nimport android.widget.SeekBar\nimport com.bilibili.lingxiao.ijkplayer.PlayState\nimport com.bilibili.lingxiao.ijkplayer.R\nimport com.bilibili.lingxiao.ijkplayer.media.IRenderView\nimport kotlinx.android.synthetic.main.simple_player_controlbar.view.*\nimport kotlinx.android.synthetic.main.simple_player_view_player.view.*\nimport android.animation.AnimatorSet\nimport android.animation.ObjectAnimator\nimport android.media.AudioManager\nimport tv.danmaku.ijk.media.player.pragma.DebugLog\nimport android.content.ContextWrapper\nimport android.app.Activity\nimport android.content.pm.ActivityInfo\nimport android.content.res.Configuration\nimport android.graphics.Color\nimport android.os.Build\nimport androidx.fragment.app.Fragment\nimport android.util.DisplayMetrics\nimport android.util.TypedValue\nimport android.view.*\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.bilibili.lingxiao.ijkplayer.NetworkUtil\nimport com.bilibili.lingxiao.ijkplayer.danmuku.BiliDanmuku\nimport com.camera.lingxiao.common.app.BaseFragment\nimport kotlinx.android.synthetic.main.simple_player_controlbar_fullscreen.view.*\nimport kotlinx.android.synthetic.main.simple_player_topbar.view.*\nimport okhttp3.*\nimport java.io.IOException\nimport java.lang.StringBuilder\nimport kotlin.properties.Delegates\n\n\nclass SimplePlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :\n    RelativeLayout(context, attrs, defStyleAttr),View.OnTouchListener,View.OnClickListener ,SeekBar.OnSeekBarChangeListener{\n\n    private var mCurrentPosition = 0\n    private var mVideoState = PlayState.STATE_IDLE\n    /**\n     * 同步进度\n     */\n    private val MESSAGE_SHOW_PROGRESS = 1\n    /**\n     * 设置新位置\n     */\n    private val MESSAGE_SEEK_NEW_POSITION = 2\n    /**\n     * 隐藏提示的box\n     */\n    private val MESSAGE_HIDE_CENTER_BOX = 3\n    /**\n     * 重新播放\n     */\n    private val MESSAGE_RESTART_PLAY = 4\n\n    /**\n     * 是否在拖动进度条中，默认为停止拖动，true为在拖动中，false为停止拖动\n     */\n    private var isDragging: Boolean = false\n\n    /**\n     * 是否隐藏了状态栏\n     */\n    private var isHiddenBar = false\n\n    /**\n     * 滑动进度条得到的新位置，和当前播放位置是有区别的,newPosition =0也会调用设置的，故初始化值为-1\n     */\n    private var newPosition: Long = -1\n\n    /**\n     * 滑动进度条得到的当前亮度\n     */\n    private var brightness = -1f\n    /**\n     * 滑动进度条得到的当前音量\n     */\n    private var volume = -1\n    private var mMaxVolume: Int = 0\n    private var mAudioManager: AudioManager? = null\n\n    /**\n     * 是否是竖屏\n     */\n    var isPortrait = true\n\n    /**\n     * 记录播放器竖屏时的高度 延迟初始化\n     */\n    private val initHeight: Int by lazy { this@SimplePlayerView.height }\n\n    /**\n     * 播放器底部导航栏 在竖直时候的view\n     */\n    private val bottomBarHalf:View by lazy {\n        View.inflate(context,R.layout.simple_player_controlbar,null)\n    }\n\n    /**\n     * 播放器底部导航栏 在全屏时候的view\n     */\n    private val bottomBarFullScreen:View by lazy {\n        View.inflate(context,R.layout.simple_player_controlbar_fullscreen,null)\n    }\n\n    /**\n     * 是否显示网络改变提示\n     */\n    var isShowNetworkHint = true\n\n    private var mVideoUrl: String by Delegates.notNull<String>()\n\n    private var mActivity: Activity? = null\n\n    private var mGestureDector:GestureDetector? = null\n    private var screenWidthPixels: Int? = 0\n\n    private var isLive: Boolean = false\n        get() {\n            return mVideoUrl.startsWith(\"rtmp://\") ||\n                    mVideoUrl.startsWith(\"rtsp://\") ||\n                    mVideoUrl.startsWith(\"http://\") && mVideoUrl.endsWith(\".m3u8\") ||\n                    mVideoUrl.startsWith(\"http://\") && mVideoUrl.endsWith(\".flv\")\n        }\n\n    private val TAG = SimplePlayerView::class.java.simpleName\n    private val mHandler = object : Handler(Looper.getMainLooper()){\n        override fun handleMessage(msg: Message?) {\n            super.handleMessage(msg)\n            when(msg?.what){\n                MESSAGE_SHOW_PROGRESS -> {\n                    if (!isDragging){\n                        var position = updateProgress()\n                        var msge = obtainMessage(MESSAGE_SHOW_PROGRESS)\n                        sendMessageDelayed(msge,1000L - (position % 1000))\n                    }\n\n                }\n                MESSAGE_RESTART_PLAY ->{\n                    mVideoState = PlayState.STATE_ERROR\n                    startPlay()\n                    updatePauseOrPlay()\n                }\n                MESSAGE_SEEK_NEW_POSITION->{\n                    if (!isLive && newPosition >= 0) {\n                        video_view.seekTo(newPosition.toInt())\n                        newPosition = -1\n                    }\n                }\n            }\n        }\n    }\n\n    private var itemClickListener:OnPlayerItemClickListener? = null\n    fun setPlayerItemClickListener(listener:OnPlayerItemClickListener){\n        itemClickListener = listener\n    }\n    interface OnPlayerItemClickListener{\n        fun onQuilityTextClick()\n    }\n\n    init {\n        initView(context)\n    }\n\n    private fun initView(context: Context) {\n        View.inflate(context, R.layout.simple_player_view_player, this)\n        mActivity = getActivityFromContext(context)\n        screenWidthPixels = mActivity?.getResources()?.getDisplayMetrics()?.widthPixels\n        mAudioManager = mActivity?.getSystemService(Context.AUDIO_SERVICE) as AudioManager\n        mMaxVolume = mAudioManager?.getStreamMaxVolume(AudioManager.STREAM_MUSIC)!!\n        if (isShowNetworkHint){\n            video_progress.visibility = INVISIBLE\n        }\n        bottom_root.addView(bottomBarHalf)\n        video_play.setOnClickListener(this)\n        //video_play_full.setOnClickListener(this)\n        play_icon.setOnClickListener(this)\n        video_button_continue.setOnClickListener(this)\n        video_fullscreen.setOnClickListener(this)\n        video_finish.setOnClickListener(this)\n        //video_seekBar.setOnSeekBarChangeListener(mVideoProgressListener)\n        video_seekBar.setOnSeekBarChangeListener(this)\n        video_view.setOnInfoListener { mp, what, extra->\n            statusChanged(what)\n            return@setOnInfoListener true\n        }\n        mGestureDector = GestureDetector(getContext(),object : PlayerGestureDetector(){})\n        setClickable(true) //设置可点击\n        setOnTouchListener(this)\n    }\n\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        var widthMode = MeasureSpec.getMode(widthMeasureSpec)\n        var widthSize = MeasureSpec.getSize(widthMeasureSpec)\n        var heightMode = MeasureSpec.getMode(heightMeasureSpec)\n        var heightSize = MeasureSpec.getSize(heightMeasureSpec)\n        if (heightMode == MeasureSpec.AT_MOST){\n            heightSize = Math.max(heightMeasureSpec,200)\n        }\n        setMeasuredDimension(widthSize, heightSize)\n    }\n\n\n    private fun onChangeToLandScape(){\n        video_play_full.setOnClickListener(this)\n        video_fullscreen.setOnClickListener(this)\n        video_finish.setOnClickListener(this)\n        danmaku_switch_full.setOnClickListener(this)\n        video_seekBar_full.setOnSeekBarChangeListener(this)\n        video_quility.setOnClickListener {\n            hideBarUI()\n            itemClickListener?.onQuilityTextClick()\n        }\n        video_quility.setText(mQuilityText)\n    }\n\n    override fun onClick(v: View) {\n        when(v.id){\n            R.id.video_play,R.id.video_play_full->{\n                if (video_view.isPlaying){\n                    if (isLive)\n                        video_view.stopPlayback()\n                    else\n                        pausePlay()\n\n                    if (isPortrait)\n                        video_play.setImageResource(R.drawable.ic_img_pause)\n                    else\n                        video_play_full.setImageResource(R.drawable.ic_img_pause)\n\n                    play_icon.setImageResource(R.drawable.ic_img_pause)\n                    play_icon.visibility = View.VISIBLE\n                }else{\n                    startPlay()\n                    if (isPortrait)\n                        video_play.setImageResource(R.drawable.ic_img_play)\n                    else\n                        video_play_full.setImageResource(R.drawable.ic_img_play)\n\n                    play_icon.setImageResource(R.drawable.ic_img_play)\n                    play_icon.visibility = View.INVISIBLE\n                }\n            }\n            R.id.play_icon->{\n                if (video_view.isPlaying){\n                    pausePlay()\n                    video_play.setImageResource(R.drawable.ic_img_pause)\n                    play_icon.setImageResource(R.drawable.ic_img_pause)\n                    play_icon.visibility = View.VISIBLE\n                }else{\n                    startPlay()\n                    video_play.setImageResource(R.drawable.ic_img_play)\n                    play_icon.setImageResource(R.drawable.ic_img_play)\n                    mHandler.postDelayed({\n                        play_icon.visibility = View.INVISIBLE\n                    },500)\n                }\n            }\n            R.id.video_button_continue->{\n                video_netTie.visibility = View.GONE\n                video_view.start()\n            }\n            R.id.video_fullscreen-> toggleFullScreen()\n            R.id.video_finish->{\n                if (isPortrait){\n                    mActivity?.finish()\n                }else{\n                    toggleFullScreen()\n                }\n            }\n            R.id.danmaku_switch_full->{\n                if (danmaku.isShown){\n                    danmaku.hide()\n                    danmaku_switch_full.setImageResource(R.drawable.bili_player_danmaku_is_closed)\n                }else{\n                    danmaku.show()\n                    danmaku_switch_full.setImageResource(R.drawable.bili_player_danmaku_is_open)\n                }\n            }\n        }\n    }\n\n    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        if (!fromUser){\n            return\n        }\n        val position = progress\n        if (isPortrait) video_currentTime.text = generateTime(position)\n            else video_currentTime_full.text = generateTime(position)\n    }\n\n    override fun onStartTrackingTouch(seekBar: SeekBar?) {\n        //开始拖动\n        isDragging = true\n        mHandler.removeMessages(MESSAGE_SHOW_PROGRESS)\n    }\n\n    override fun onStopTrackingTouch(seekBar: SeekBar) {\n        //停止拖动\n        isDragging = false\n        mHandler.removeMessages(MESSAGE_SHOW_PROGRESS)\n        video_view.seekTo(seekBar.progress)\n        mHandler.sendEmptyMessageDelayed(MESSAGE_SHOW_PROGRESS,1000)\n    }\n\n\n\n    private fun statusChanged(what: Int) {\n        this.mVideoState = what\n        Log.i(TAG,\"播放状态: \" + mVideoState)\n\n        when(mVideoState){\n            PlayState.STATE_COMPLETED ->{\n                Log.d(TAG,\"播放结束\")\n                mCurrentPosition = 0\n                mVideoState = PlayState.STATE_COMPLETED\n            }\n\n            PlayState.STATE_PREPARING,PlayState.MEDIA_INFO_BUFFERING_START,PlayState.STATE_PREPARING->{\n                Log.d(TAG,\"视频缓冲\")\n                video_progress.visibility = View.VISIBLE\n                mVideoState = PlayState.STATE_PREPARING\n            }\n            PlayState.MEDIA_INFO_VIDEO_RENDERING_START,\n            PlayState.STATE_PREPARED,\n            PlayState.MEDIA_INFO_BUFFERING_END ->{\n                Log.d(TAG,\"视频缓冲结束\")\n                video_progress.visibility = View.INVISIBLE\n                mHandler.postDelayed({\n                    hideBarUI()\n                    mHandler.sendEmptyMessage(MESSAGE_SHOW_PROGRESS)\n                },500)\n                mVideoState = PlayState.STATE_PLAYING\n            }\n            PlayState.MEDIA_INFO_VIDEO_INTERRUPT->{\n                Log.d(TAG,\"直播停止推流\")\n                if (isShowNetworkHint &&\n                    NetworkUtil.getNetworkType(context) != NetworkUtil.NetworkType.NETWORK_WIFI &&\n                    NetworkUtil.getNetworkType(context) != NetworkUtil.NetworkType.NETWORK_NO){\n                    video_netTie.visibility = View.VISIBLE\n                }\n            }\n            PlayState.STATE_ERROR,\n            PlayState.MEDIA_INFO_UNKNOWN,\n            PlayState.MEDIA_ERROR_IO,\n            PlayState.MEDIA_ERROR_MALFORMED,\n            PlayState.MEDIA_ERROR_UNSUPPORTED,\n            PlayState.MEDIA_ERROR_TIMED_OUT,\n            PlayState.MEDIA_ERROR_SERVER_DIED->{\n                Log.d(TAG,\"播放错误\")\n                mVideoState = PlayState.STATE_ERROR\n            }\n        }\n    }\n\n    /**\n     * 时长格式化显示\n     */\n    private fun generateTime(time: Int): String {\n        val totalSeconds = time / 1000\n        val seconds = totalSeconds % 60\n        val minutes = totalSeconds / 60 % 60\n        val hours = totalSeconds / 3600\n        return if (hours > 0) String.format(\"%02d:%02d:%02d\", hours, minutes, seconds) else String.format(\n            \"%02d:%02d\",\n            minutes,\n            seconds\n        )\n    }\n\n    /**\n     * 更新播放状态\n     */\n    private fun updatePauseOrPlay(){\n        if (video_view.isPlaying){\n            video_play.setImageResource(R.drawable.ic_img_play)\n            play_icon.visibility = View.INVISIBLE\n        }else{\n            video_play.setImageResource(R.drawable.ic_img_pause)\n            play_icon.visibility = View.VISIBLE\n        }\n    }\n\n    /**\n     * 更新播放进度\n     */\n    private fun updateProgress(): Int{\n        var position = video_view.currentPosition  //视频进度\n        var duration = video_view.duration  //视频总长度\n        var bufferPos = video_view.bufferPercentage //视频缓冲进度\n\n        if (isPortrait){\n            video_currentTime.text = generateTime(position)\n            video_endTime.text = generateTime(duration)\n            video_seekBar.max = duration\n            video_seekBar.progress = position\n            video_seekBar.secondaryProgress = bufferPos * 1000\n        }else{\n            video_currentTime_full.text = generateTime(position)\n            video_endTime_full.text = generateTime(duration)\n            video_seekBar_full.max = duration\n            video_seekBar_full.progress = position\n            video_seekBar_full.secondaryProgress = bufferPos * 1000\n        }\n        return position\n    }\n\n    fun setLive(live:Boolean): SimplePlayerView{\n        this.isLive = live\n        return this\n    }\n    fun setVideoUrl(url: String): SimplePlayerView{\n        this.mVideoUrl = url\n        if(isLive){\n            video_seekBar.visibility = View.INVISIBLE\n            tv_sprit.visibility = View.INVISIBLE\n            video_endTime.visibility = View.INVISIBLE\n        }\n        //video_view.setAspectRatio(IRenderView.AR_ASPECT_FIT_PARENT)\n        video_view.setAspectRatio(IRenderView.AR_16_9_FIT_PARENT)\n        video_view.setVideoURI(Uri.parse(url),isLive)\n        return this\n    }\n\n    /**\n     * IRenderView\n     */\n    fun setSize(width :Int,height :Int): SimplePlayerView{\n        var scale = width / (height * 1.0f)\n        when(scale){\n            16.0f/9.0f -> video_view.setAspectRatio(IRenderView.AR_16_9_FIT_PARENT)\n            4.0f/3.0f -> video_view.setAspectRatio(IRenderView.AR_4_3_FIT_PARENT)\n            else -> video_view.setAspectRatio(IRenderView.AR_16_9_FIT_PARENT)\n        }\n\n        return this\n    }\n\n    fun startPlay(){\n        if (isLive){\n            video_view.setVideoPath(mVideoUrl)\n            video_view.seekTo(0)\n        }\n        if (isShowNetworkHint &&\n            NetworkUtil.getNetworkType(context) != NetworkUtil.NetworkType.NETWORK_WIFI &&\n            NetworkUtil.getNetworkType(context) != NetworkUtil.NetworkType.NETWORK_NO){\n            video_netTie.visibility = View.VISIBLE\n        }else{\n            video_view.start()\n        }\n        danmaku.start(mDanmukuPosition)\n\n    }\n\n    private var mDanmukuPosition = 0L\n    fun pausePlay(){\n        mVideoState = PlayState.STATE_PAUSED\n        getCurrentPosition()\n        video_view.pause()\n        danmaku.pause()\n        mDanmukuPosition = danmaku.currentTime\n    }\n\n    fun stopPlay(){\n        video_view.stopPlayback()\n        video_view.release(true)\n        danmaku.stop()\n    }\n\n    fun setVideoTitle(title: String): SimplePlayerView{\n        video_title.text = title\n        return this\n    }\n\n    private var mQuilityText = \"自动\"\n    fun setQuilityText(text:String): SimplePlayerView{\n        mQuilityText = text\n        return this\n    }\n\n    /**\n     * 初始化弹幕库\n     * @param url 弹幕地址\n     */\n    fun initDanMaKu(url:String): SimplePlayerView{\n        BiliDanmuku.initDanmaku(danmaku)\n        getDanmakuFromUrl(url)\n        return this\n    }\n\n    /**\n     * 初始化弹幕库\n     * @param url 弹幕xml地址\n     * @param delay 延迟获取，同时初始化视频和弹幕部分手机可能会卡顿\n     */\n    fun initDanMaKu(url :String,delay:Long): SimplePlayerView{\n        this.postDelayed({\n            BiliDanmuku.initDanmaku(danmaku)\n            getDanmakuFromUrl(url)\n        },delay)\n        return this\n    }\n\n    /**\n     * 是否显示网络状态提示\n     */\n    fun showNetWorkHint(show: Boolean): SimplePlayerView{\n        isShowNetworkHint = show\n        return this\n    }\n\n    /**\n     * 自定义底部状态栏\n     */\n    fun setBottomViewBar(view :View){\n        bottom_root.removeAllViews()\n        bottom_root.addView(view)\n    }\n\n    /**\n     * 获取当前播放位置\n     */\n    fun getCurrentPosition(): Int {\n        if (!isLive) {\n            mCurrentPosition = video_view.getCurrentPosition()\n        } else {\n            /**直播 */\n            mCurrentPosition = -1\n        }\n        return mCurrentPosition\n    }\n\n    fun isPlaying():Boolean{\n        when(mVideoState){\n            PlayState.STATE_PLAYING -> return true\n            else -> return false\n        }\n    }\n\n\n    private val mTopMargin:Int by lazy { (video_top.layoutParams as (ViewGroup.MarginLayoutParams)).topMargin }\n    private fun showBarUI(){\n        if (!isHiddenBar) return\n        var margin = 0\n        var layoutParams = video_top.layoutParams as (ViewGroup.MarginLayoutParams)\n        if (isPortrait){\n            margin = mTopMargin\n        }\n        layoutParams.setMargins(0,margin,0,0)\n        video_top.layoutParams = layoutParams\n        toggleAnim(video_top,-video_top.height.toFloat()-margin,0f)\n        toggleAnim(bottom_root, bottom_root.height.toFloat(),0f)\n        isHiddenBar = false\n        /*//3秒之后隐藏状态栏\n        mHandler.postDelayed({\n            hideBarUI()\n        },2000)*/\n    }\n\n    /**\n     * 隐藏顶部和底部的状态栏\n     */\n    private fun hideBarUI(){\n        if (isHiddenBar) return\n        var margin = 0\n        var layoutParams = video_top.layoutParams as (ViewGroup.MarginLayoutParams)\n        if (isPortrait){\n            margin = mTopMargin\n        }\n        layoutParams.setMargins(0,margin,0,0)\n        video_top.layoutParams = layoutParams\n        toggleAnim(video_top,0f,-video_top.height.toFloat() - margin)\n        toggleAnim(bottom_root,0f, bottom_root.height.toFloat())\n        isHiddenBar = true\n    }\n\n    private fun toggleAnim(view: View ,fromY:Float,toY:Float) {\n        val animatorx = ObjectAnimator.ofFloat(view, \"translationY\", fromY, toY)\n        //ObjectAnimator animatory = ObjectAnimator.ofFloat(view,\"scaleY\",visible?0f:1f,visible?1f:0f);\n        val animatorSet = AnimatorSet()\n        animatorSet.duration = 500\n        animatorSet.play(animatorx)\n        animatorSet.start()\n    }\n\n    /**\n     * 全透状态栏\n     */\n    protected fun setStatusBarTransparent(visible :Boolean) {\n        val window = mActivity!!.window\n        if (Build.VERSION.SDK_INT >= 21) {//21表示5.0\n            if (visible){\n                window.decorView.systemUiVisibility =\n                    View.SYSTEM_UI_FLAG_VISIBLE\n            }else{\n                window.decorView.systemUiVisibility =\n                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE\n            }\n            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)\n            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)\n            window.statusBarColor = Color.TRANSPARENT\n        } else if (Build.VERSION.SDK_INT >= 19) {//19表示4.4\n            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)\n            //虚拟键盘也透明\n            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);\n        }\n    }\n\n    fun onBackPressed(){\n        //这个地方横屏才响应\n        if (!isPortrait){\n            toggleFullScreen()\n        }else{\n            //TODO: 存在fragment栈的情况\n            mActivity?.finish()\n        }\n    }\n    /**\n     * activity横竖屏切换调用此方法\n     */\n    fun onConfigurationChang(conf: Configuration?) :Boolean{\n        isPortrait = conf!!.orientation == Configuration.ORIENTATION_PORTRAIT\n        mHandler.post {\n            //tryFullScreen(!portrait)\n            if (isPortrait) {\n                this@SimplePlayerView.size(false,initHeight, false)\n            } else {\n                val heightPixels = mActivity!!.getResources().displayMetrics.heightPixels\n                val widthPixels = mActivity!!.getResources().displayMetrics.widthPixels\n                this@SimplePlayerView.size(false,Math.min(heightPixels, widthPixels), false)\n            }\n            updateFullScreenButton()\n        }\n        //orientationEventListener.enable()\n        return isPortrait\n    }\n\n    private fun size(width: Boolean, n: Int, dip: Boolean) {\n        var n = n\n        val lp = getLayoutParams()\n        if (n > 0 && dip) {\n            n = dip2pixel(context, n.toFloat())\n        }\n        if (width) {\n            lp.width = n\n        } else {\n            lp.height = n\n        }\n        setLayoutParams(lp)\n    }\n\n    fun dip2pixel(context: Context, n: Float): Int {\n        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, n, context.resources.displayMetrics).toInt()\n    }\n\n    /**\n     * 全屏切换\n     */\n    private fun toggleFullScreen(): SimplePlayerView {\n        if (getScreenOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {\n            mActivity?.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)\n            bottom_root.removeView(bottomBarFullScreen)\n            bottom_root.addView(bottomBarHalf)\n        } else {\n            //因为是延迟初始化，所以在这里需要使用initHeight\n            Log.i(TAG,\"记录竖屏状态下的hiehgt：\" + initHeight)\n            mActivity?.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)\n            bottom_root.removeView(bottomBarHalf)\n            bottom_root.addView(bottomBarFullScreen)\n            onChangeToLandScape()\n        }\n        return this\n    }\n\n    private fun updateFullScreenButton() {\n        //layoutParams.width = LayoutParams.MATCH_PARENT\n        //layoutParams.height = LayoutParams.MATCH_PARENT\n        //setLayoutParams(layoutParams)\n        changeWindow()\n    }\n\n    fun changeWindow(){\n        val attrs = mActivity!!.getWindow().getAttributes()\n        if (isPortrait) {\n            attrs.flags = attrs.flags and WindowManager.LayoutParams.FLAG_FULLSCREEN.inv()\n            mActivity!!.getWindow().setAttributes(attrs)\n            mActivity!!.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)\n        } else {\n            attrs.flags = attrs.flags or WindowManager.LayoutParams.FLAG_FULLSCREEN\n            mActivity!!.getWindow().setAttributes(attrs)\n            mActivity!!.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)\n        }\n    }\n\n    private fun getScreenOrientation(): Int {\n        val rotation = mActivity!!.getWindowManager().getDefaultDisplay().getRotation()\n        val dm = DisplayMetrics()\n        mActivity!!.getWindowManager().getDefaultDisplay().getMetrics(dm)\n        val width = dm.widthPixels\n        val height = dm.heightPixels\n        val orientation: Int\n        // if the device's natural orientation is portrait:\n        if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && height > width || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && width > height) {\n            when (rotation) {\n                Surface.ROTATION_0 -> orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT\n                Surface.ROTATION_90 -> orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE\n                Surface.ROTATION_180 -> orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT\n                Surface.ROTATION_270 -> orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE\n                else -> orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT\n            }\n        } else {\n            when (rotation) {\n                Surface.ROTATION_0 -> orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE\n                Surface.ROTATION_90 -> orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT\n                Surface.ROTATION_180 -> orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE\n                Surface.ROTATION_270 -> orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT\n                else -> orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE\n            }\n        }// if the device's natural orientation is landscape or if the device\n        // is square:\n        return orientation\n    }\n    fun onPause(){\n        //恢复系统其它媒体的状态\n        muteAudioFocus(context,true)\n        getCurrentPosition()\n        video_view.release(false)\n        danmaku.pause()\n    }\n\n    fun onResume(){\n        //暂停系统其它媒体的状态\n        muteAudioFocus(context,false)\n        video_view.openVideo()\n        if (isLive){\n            video_view.seekTo(0)\n        }else{\n            video_view.seekTo(mCurrentPosition)\n        }\n        danmaku.resume()\n    }\n\n    fun onRestart(){\n        video_view.openVideo()\n        if (isLive){\n            video_view.seekTo(0)\n        }else{\n            video_view.seekTo(mCurrentPosition)\n        }\n        danmaku.restart()\n    }\n\n    fun onDestory(){\n        mHandler.removeCallbacksAndMessages(null)\n        stopPlay()\n        danmaku.release()\n    }\n\n    override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean {\n        //将触摸事件交给GestureDetector\n        if(mGestureDector!!.onTouchEvent(motionEvent)){\n            return true\n        }\n        //多点触控\n        when(motionEvent!!.action and MotionEvent.ACTION_MASK){\n            MotionEvent.ACTION_UP -> endGesture()\n        }\n        return false\n    }\n\n    /**\n     * 手势结束\n     */\n    private fun endGesture() {\n        volume = -1\n        brightness = -1f\n        if (newPosition >= 0) {\n            mHandler.removeMessages(MESSAGE_SEEK_NEW_POSITION)\n            mHandler.sendEmptyMessage(MESSAGE_SEEK_NEW_POSITION)\n        } else {\n            /**什么都不做(do nothing) */\n        }\n        mHandler.removeMessages(MESSAGE_HIDE_CENTER_BOX)\n        mHandler.sendEmptyMessageDelayed(MESSAGE_HIDE_CENTER_BOX, 500)\n        ll_video_progress.visibility = View.GONE\n        video_volume_controller_root.visibility = View.GONE\n        video_brightness_controller_root.visibility = View.GONE\n    }\n\n    private fun getActivityFromContext(context: Context?): Activity? {\n        var context = context\n        if (null != context) {\n            while (context is ContextWrapper) {\n                if (context is Activity) {\n                    return context\n                }else if (context is androidx.fragment.app.Fragment){\n                    return context.activity\n                }\n                context = context.baseContext\n            }\n        }\n        return null\n    }\n\n    /**\n     * @param bMute 值为true时为关闭背景音乐。\n     */\n    private fun muteAudioFocus(context: Context, bMute: Boolean): Boolean {\n        var bool = false\n        val am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager\n        if (bMute) {\n            val result = am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)\n            bool = result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED\n        } else {\n            val result = am.abandonAudioFocus(null)\n            bool = result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED\n        }\n        return bool\n    }\n\n    private open inner class PlayerGestureDetector: GestureDetector.SimpleOnGestureListener(){\n        private var firstTouch: Boolean = false  //是否是按下的标识，默认为其他动作\n        private var volumeControl: Boolean = false  //控制声音\n        private var toSeek: Boolean = false  //进度条\n        override fun onSingleTapUp(e: MotionEvent?): Boolean {\n            //return super.onSingleTapUp(e)\n            if (isHiddenBar){\n                showBarUI()\n            }else{\n                hideBarUI()\n            }\n            return true\n        }\n\n        override fun onDown(e: MotionEvent?): Boolean {\n            firstTouch = true\n            return super.onDown(e)\n        }\n        override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean {\n            val mOldX = e1!!.getX()\n            val mOldY = e1!!.getY()\n            val deltaX = mOldX - e2!!.getX()\n            val deltaY = mOldY - e2!!.getY()\n\n            if (firstTouch) {\n                toSeek = Math.abs(distanceX) >= Math.abs(distanceY)  //横向滑动\n                volumeControl = mOldX > screenWidthPixels!! * 0.5f  //左边是控制亮度，右边控制音量\n                firstTouch = false\n            }\n\n            if (toSeek) {\n                if (!isLive) {\n                    onProgressSlide(-deltaX / video_view.getWidth())\n                }\n            } else {\n                val percent = deltaY / video_view.getHeight()\n                if (volumeControl) {\n                    onVolumeSlide(percent)\n                } else {\n                    onBrightnessSlide(percent)\n                }\n            }\n            return super.onScroll(e1, e2, distanceX, distanceY)\n        }\n    }\n\n    /**\n     * 滑动改变声音大小\n     *\n     * @param percent\n     */\n    private fun onVolumeSlide(percent: Float) {\n        if (volume == -1) {\n            volume = mAudioManager!!.getStreamVolume(AudioManager.STREAM_MUSIC)\n            if (volume < 0)\n                volume = 0\n        }\n        var index = (percent * mMaxVolume).toInt() + volume\n        if (index > mMaxVolume) {\n            index = mMaxVolume\n        } else if (index < 0) {\n            index = 0\n        }\n        // 变更声音\n        mAudioManager!!.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0)\n        // 变更进度条\n        val i = (index * 1.0 / mMaxVolume * 100).toInt()\n        var s = \"\" + i + \"%\"\n        if (i == 0) {\n            s = \"off\"\n        }\n        DebugLog.d(\"\", \"onVolumeSlide:$s\")\n        if (video_volume_controller_root.visibility == View.GONE){\n            video_volume_controller_root.visibility = View.VISIBLE\n        }\n        video_volume_controller.max = 100\n        video_volume_controller.setProgress(i)\n    }\n\n    /**\n     * 滑动改变进度\n     *\n     * @param percent\n     */\n    private fun onProgressSlide(percent: Float) {\n        val position = video_view.getCurrentPosition().toLong()\n        val duration = video_view.getDuration().toLong()\n        val deltaMax = Math.min((100 * 1000).toLong(), duration - position)\n        var delta = (deltaMax * percent).toLong()\n\n        newPosition = delta + position\n        if (newPosition > duration) {\n            newPosition = duration\n        } else if (newPosition <= 0) {\n            newPosition = 0\n            delta = -position\n        }\n        val showDelta = delta.toInt() / 1000\n        if (showDelta != 0) {\n            val text = if (showDelta > 0) \"+$showDelta\" else \"\" + showDelta\n            DebugLog.d(\"\", \"onProgressSlide:$text\")\n        }\n        showBarUI()\n        video_currentTime.text = generateTime(newPosition.toInt())\n        video_seekBar.progress = newPosition.toInt()\n        ll_video_progress.visibility = View.VISIBLE\n        video_progress_text.text = video_currentTime.text.toString() + \"/\" + video_endTime.text.toString()\n    }\n\n    /**\n     * 滑动改变亮度\n     *\n     * @param percent\n     */\n    private fun onBrightnessSlide(percent: Float) {\n        if (brightness < 0) {\n            brightness = mActivity!!.getWindow().getAttributes().screenBrightness\n            if (brightness <= 0.00f) {\n                brightness = 0.50f\n            } else if (brightness < 0.01f) {\n                brightness = 0.01f\n            }\n        }\n        DebugLog.d(\"\", \"brightness:$brightness,percent:$percent\")\n        val lpa = mActivity!!.getWindow().getAttributes()\n        lpa.screenBrightness = brightness + percent\n        if (lpa.screenBrightness > 1.0f) {\n            lpa.screenBrightness = 1.0f\n        } else if (lpa.screenBrightness < 0.01f) {\n            lpa.screenBrightness = 0.01f\n        }\n        mActivity!!.getWindow().setAttributes(lpa)\n\n        if (video_brightness_controller_root.visibility == View.GONE){\n            video_brightness_controller_root.visibility = View.VISIBLE\n        }\n        video_brightness_controller.max = 100\n        video_brightness_controller.setProgress((lpa.screenBrightness*100).toInt())\n    }\n\n    /**\n     * 获取弹幕并播放\n     */\n    private fun getDanmakuFromUrl(url :String){\n        var client =  OkHttpClient();//创建OkHttpClient对象\n        var request = Request.Builder()\n            .url(url)//请求接口。如果需要传参拼接到接口后面。\n            .build();//创建Request 对象\n        //var response = client.newCall(request).execute();//得到Response 对象\n        client.newCall(request).enqueue(object :Callback{\n            override fun onFailure(call: Call, e: IOException) {\n                Log.e(TAG,\"播放弹幕失败$e\")\n            }\n            override fun onResponse(call: Call, response: Response) {\n                if (response.isSuccessful()) {\n                    var response = response.body()\n                    val parser = BiliDanmuku.parseDanmaku(response?.bytes())\n                    danmaku.post {\n                        BiliDanmuku.playDanmaku(parser,danmaku)\n                    }\n                }else{\n                    Log.e(TAG,\"播放弹幕失败$response\")\n                }\n            }\n\n        })\n    }\n\n}\n"
  },
  {
    "path": "ijkplayer/src/main/module/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.bilibili.lingxiao.ijkplayer\">\n    <uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.READ_LOGS\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n\n    <application\n            android:name=\".application.App\"\n            android:allowBackup=\"true\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:label=\"@string/app_name\"\n            android:roundIcon=\"@mipmap/ic_launcher_round\"\n            android:supportsRtl=\"true\"\n            android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <activity android:name=\".PlayActivity\"\n                  android:configChanges=\"orientation|keyboardHidden|screenSize\" >\n        </activity>\n        <activity android:name=\".localvideo.VideoListActivity\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/button_shape.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <!--设置背景色-->\n    <solid android:color=\"#66000000\"/>\n    <!--设置圆角-->\n    <corners android:radius=\"30dip\"/>\n    <!--设置边框线的宽度和颜色-->\n    <stroke android:width=\"2dp\" android:color=\"#33000000\" />\n</shape>"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_back.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M129.46,495.74c-11.41,11.41 -11.41,29.85 0,41.14l351.95,351.95c11.41,11.41 29.85,11.41 41.14,0 5.7,-5.7 8.5,-13.11 8.5,-20.63s-2.79,-14.93 -8.5,-20.63l-302.19,-302.19h650.63c16.14,0 29.13,-12.99 29.13,-29.13s-12.99,-29.13 -29.13,-29.13h-650.63l302.19,-302.19c5.7,-5.7 8.5,-13.11 8.5,-20.63s-2.79,-14.93 -8.5,-20.63c-11.41,-11.41 -29.85,-11.41 -41.14,0l-351.95,352.07z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_fullscreen.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M759.81,559.62a51.2,51.2 0,0 0,-51.2 51.2v110.59h-110.08a51.2,51.2 0,1 0,0 102.4h161.79a51.2,51.2 0,0 0,51.2 -51.2v-161.79a51.2,51.2 0,0 0,-51.71 -51.2zM400.38,200.19H238.59a51.2,51.2 0,0 0,-51.2 51.2v161.79a51.2,51.2 0,0 0,102.4 0V302.59h110.59a51.2,51.2 0,1 0,0 -102.4zM530.94,471.55a51.2,51.2 0,1 0,0 72.7,51.2 51.2,0 0,0 0,-72.7z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_light.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M512,824c-172.31,0 -312,-139.69 -312,-312s139.69,-312 312,-312 312,139.69 312,312 -139.69,312 -312,312zM512,760c136.97,0 248,-111.03 248,-248 0,-136.97 -111.03,-248 -248,-248 -136.97,0 -248,111.03 -248,248 0,136.97 111.03,248 248,248zM512,64c17.67,0 32,14.33 32,32 0,17.67 -14.33,32 -32,32 -17.67,0 -32,-14.33 -32,-32 0,-17.67 14.33,-32 32,-32zM512,900c17.67,0 32,14.33 32,32 0,17.67 -14.33,32 -32,32 -17.67,0 -32,-14.33 -32,-32 0,-17.67 14.33,-32 32,-32zM837.95,837.95c-12.5,12.5 -32.76,12.5 -45.26,0 -12.5,-12.5 -12.5,-32.76 0,-45.26s32.76,-12.5 45.26,0c12.5,12.5 12.5,32.76 0,45.26zM233.88,236.88c-12.5,12.5 -32.76,12.5 -45.26,0 -12.5,-12.5 -12.5,-32.76 0,-45.26 12.5,-12.5 32.76,-12.5 45.26,0 12.5,12.5 12.5,32.76 0,45.26zM830.95,191.63c12.5,12.5 12.5,32.76 0,45.26 -12.5,12.5 -32.76,12.5 -45.26,0s-12.5,-32.76 0,-45.26c12.5,-12.5 32.76,-12.5 45.26,0zM231.31,792.69c12.5,12.5 12.5,32.76 0,45.26 -12.5,12.5 -32.76,12.5 -45.26,0 -12.5,-12.5 -12.5,-32.76 0,-45.26 12.5,-12.5 32.76,-12.5 45.26,0zM960,512c0,17.67 -14.33,32 -32,32 -17.67,0 -32,-14.33 -32,-32 0,-17.67 14.33,-32 32,-32 17.67,0 32,14.33 32,32zM128,512c0,17.67 -14.33,32 -32,32 -17.67,0 -32,-14.33 -32,-32 0,-17.67 14.33,-32 32,-32 17.67,0 32,14.33 32,32z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_more.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M512,298.65a85.35,85.35 0,1 0,0 -170.65,85.35 85.35,0 0,0 0,170.65z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M512,512m-85.35,0a85.35,85.35 0,1 0,170.7 0,85.35 85.35,0 1,0 -170.7,0Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M512,896a85.35,85.35 0,1 0,0 -170.7,85.35 85.35,0 0,0 0,170.7z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_pause.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M273.92,849.92c-5.12,0 -7.68,0 -10.24,-2.56 -7.68,-5.12 -10.24,-12.8 -10.24,-20.48L256,197.12c0,-7.68 5.12,-15.36 10.24,-20.48 7.68,-5.12 15.36,-5.12 23.04,0l542.72,317.44c7.68,5.12 10.24,12.8 10.24,20.48 0,7.68 -5.12,15.36 -10.24,20.48L284.16,847.36c-2.56,0 -7.68,2.56 -10.24,2.56zM299.52,238.08l-5.12,550.4 478.72,-271.36L299.52,238.08z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_play.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M280,99m40,0l0,0q40,0 40,40l0,746q0,40 -40,40l0,0q-40,0 -40,-40l0,-746q0,-40 40,-40Z\"/>\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M663,99m40,0l0,0q40,0 40,40l0,746q0,40 -40,40l0,0q-40,0 -40,-40l0,-746q0,-40 40,-40Z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_img_volice.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024\"\n    android:viewportWidth=\"1024\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\" android:pathData=\"M628.27,680.53c-5.33,0 -11.73,-2.13 -16,-7.47 -7.47,-8.53 -7.47,-22.4 2.13,-29.87 40.53,-36.27 60.8,-73.6 58.67,-109.87 -2.13,-58.67 -56.53,-99.2 -57.6,-100.27 -9.6,-7.47 -11.73,-20.27 -4.27,-29.87 7.47,-9.6 20.27,-11.73 29.87,-4.27 3.2,2.13 71.47,54.4 74.67,132.27 2.13,50.13 -22.4,99.2 -72.53,144 -4.27,3.2 -9.6,5.33 -14.93,5.33zM742.4,750.93c-5.33,0 -11.73,-2.13 -16,-7.47 -7.47,-8.53 -7.47,-22.4 2.13,-29.87 67.2,-59.73 99.2,-121.6 97.07,-183.47 -4.27,-98.13 -94.93,-167.47 -96,-167.47 -9.6,-7.47 -11.73,-20.27 -4.27,-29.87 7.47,-9.6 20.27,-11.73 29.87,-4.27 4.27,3.2 107.73,81.07 112,199.47 3.2,75.73 -34.13,149.33 -110.93,217.6 -3.2,3.2 -8.53,5.33 -13.87,5.33zM564.27,856.53c-6.4,0 -11.73,-2.13 -16,-5.33 -1.07,0 -2.13,-1.07 -2.13,-1.07 -1.07,-1.07 -2.13,-1.07 -2.13,-1.07L275.2,691.2c-4.27,-2.13 -7.47,-4.27 -10.67,-7.47 -7.47,-4.27 -12.8,-8.53 -19.2,-9.6 -7.47,-2.13 -16,-1.07 -25.6,-1.07h-8.53c-30.93,0 -55.47,-24.53 -55.47,-55.47V429.87c0,-21.33 8.53,-34.13 17.07,-40.53 17.07,-14.93 41.6,-13.87 60.8,-11.73 30.93,4.27 39.47,3.2 65.07,-10.67 14.93,-8.53 29.87,-17.07 43.73,-25.6l36.27,-20.27c18.13,-9.6 35.2,-20.27 53.33,-29.87L554.67,220.8c7.47,-4.27 17.07,-4.27 24.53,0 7.47,4.27 11.73,12.8 11.73,21.33 0,0 -3.2,582.4 -3.2,589.87 1.07,12.8 -9.6,24.53 -23.47,24.53zM539.73,832c0,2.13 0,4.27 1.07,6.4 -1.07,-2.13 -1.07,-4.27 -1.07,-6.4zM228.27,622.93c9.6,0 19.2,0 28.8,3.2 14.93,3.2 25.6,10.67 34.13,17.07 3.2,2.13 5.33,4.27 8.53,5.33L539.73,789.33c0,-57.6 1.07,-190.93 3.2,-504.53l-86.4,49.07c-18.13,9.6 -35.2,20.27 -53.33,29.87L366.93,384c-14.93,8.53 -28.8,17.07 -43.73,24.53 -36.27,21.33 -56.53,22.4 -96,17.07 -13.87,-2.13 -19.2,-1.07 -21.33,0v192c0,3.2 3.2,6.4 6.4,6.4h7.47c2.13,0 5.33,-1.07 8.53,-1.07z\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"108dp\"\n        android:width=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path android:fillColor=\"#008577\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/progress_red.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <corners android:radius=\"50dp\" />\n            <solid android:color=\"@android:color/transparent\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <scale\n                android:drawable=\"@drawable/round_red\"\n                android:scaleWidth=\"100%\" />\n    </item>\n</layer-list>"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/round_red.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n\n    <corners android:radius=\"50dp\" />\n\n    <gradient\n            android:angle=\"0\"\n            android:endColor=\"#F44336\"\n            android:startColor=\"#FA6666\"\n            android:type=\"linear\" />\n</shape>"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/simple_player_btn.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@drawable/simple_player_bg_pressed\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/simple_player_bg_pressed\" android:state_enabled=\"false\"/>\n    <item android:drawable=\"@drawable/simple_player_bg_normal\"/>\n\n</selector>"
  },
  {
    "path": "ijkplayer/src/main/res/drawable/simple_player_center_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <corners android:radius=\"4dp\"/>\n    <solid android:color=\"#B3616161\"/>\n</shape>"
  },
  {
    "path": "ijkplayer/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector android:height=\"24dp\"\n        android:viewportHeight=\"1080\"\n        android:viewportWidth=\"1080\"\n        android:width=\"24dp\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/white\"\n          android:pathData=\"M285.03,597.69c13.74,-0.61 26.52,-1.46 39.16,-1.7 54.85,-0.97 108.74,5.59 159.94,26.27 25.06,10.1 49.26,21.77 71.03,38.19 17.88,13.5 21.77,30.29 13.62,55.1 -5.11,15.33 -15.33,26.88 -28.22,36.98 -30.41,23.72 -62.27,45.12 -98.88,57.17 -25.66,8.51 -52.3,14.96 -79.06,19.1 -35.15,5.47 -70.79,7.91 -106.3,11.19 -7.3,0.73 -14.72,-0.24 -22.01,-0.24 -3.77,0 -4.74,-1.95 -4.87,-5.23 -0.97,-16.18 -1.7,-32.48 -3.16,-48.65 -1.82,-20.92 -3.89,-41.84 -6.32,-62.64 -3.28,-29.07 -6.93,-58.02 -10.58,-86.97 -3.77,-30.53 -7.66,-60.94 -11.31,-91.47 -3.65,-29.8 -6.93,-59.72 -10.83,-89.52 -4.38,-34.06 -9.24,-68.11 -13.87,-102.17 -5.47,-40.26 -13.01,-80.15 -23.35,-119.44 -0.49,-1.7 0.97,-5.47 2.43,-5.96 34.42,-13.87 68.96,-27.37 103.39,-41.11 11.43,-4.62 12.41,-5.96 12.53,8.51 0.12,61.67 0.36,123.33 1.34,185 0.49,32.11 1.7,64.22 3.89,96.21 2.68,39.04 6.81,78.09 10.34,117.13 0,1.7 0.73,3.28 1.09,4.26zM353.75,776.73c31.87,-24.08 63,-47.68 94.26,-71.4 -3.89,-5.59 -89.76,-39.29 -109.95,-43.79 5.11,38.07 10.34,76.02 15.69,115.18zM710,764.56c-16.42,-166.02 -30.29,-333.87 -62.03,-500.75 10.34,-1.22 20.68,-2.68 31.14,-3.53 12.04,-1.09 24.2,-1.58 36.25,-2.55 10.1,-0.85 13.87,1.82 14.47,11.68 1.82,26.39 3.41,52.79 5.23,79.18 2.43,35.64 4.99,71.4 7.54,107.03 1.82,25.66 3.41,51.45 5.47,77.11 2.31,28.1 4.87,56.07 7.42,84.17 1.82,20.68 3.53,41.48 5.59,62.15 2.19,22.38 4.62,44.76 6.93,67.14 0.61,6.45 1.34,12.89 1.82,19.34 0.24,3.53 -1.7,4.01 -4.99,3.65 -17.88,-1.82 -35.76,-3.16 -54.85,-4.62zM561.13,524.1c14.47,-2.07 28.46,-4.38 42.45,-5.96 10.1,-1.22 20.31,-1.34 30.41,-2.31 5.47,-0.49 9,1.46 9.85,6.81 2.31,14.23 4.74,28.58 6.45,42.94 2.8,23.84 4.99,47.8 7.54,71.64 2.19,20.92 4.38,41.72 6.81,62.64 2.68,22.38 5.59,44.64 8.39,66.9 0.85,6.57 1.46,13.26 2.31,20.43 -20.43,2.55 -40.38,5.11 -61.42,7.91 -17.51,-90.25 -35.03,-179.77 -52.79,-270.99zM874.08,802.15c-19.7,0 -38.68,0.12 -57.65,-0.24 -1.58,0 -4.38,-2.8 -4.5,-4.5 -2.92,-30.41 -5.47,-60.69 -8.15,-91.1l-7.66,-84.65c-2.68,-29.07 -5.23,-58.14 -7.91,-87.21 -0.12,-1.7 -0.49,-3.28 -0.85,-5.84 7.05,-0.85 13.74,-2.19 20.56,-2.19 18.37,0 36.73,0.49 55.22,0.97 4.74,0.12 6.81,3.28 7.05,7.66 0.61,9.12 1.46,18.12 1.46,27.25 0.12,42.81 -0.12,85.75 0.24,128.56 0.36,34.18 1.46,68.48 2.19,102.66v8.64zM601.63,485.42c-4.38,-35.03 -8.76,-69.21 -13.26,-104.84 11.43,-0.12 22.87,-0.49 34.18,-0.49 3.77,0 5.47,2.07 5.84,6.2 3.04,31.87 6.2,63.73 9.49,96.82 -11.8,0.61 -23.96,1.46 -36.25,2.31zM830.78,390.55c9.73,0 20.07,-0.12 30.53,0 5.23,0.12 7.78,2.19 7.78,8.39 -0.36,29.68 -0.12,59.36 -0.12,88.91v6.69c-12.53,-0.61 -24.57,-1.22 -38.07,-1.82 -0.12,-33.69 -0.12,-67.5 -0.12,-102.17zM558.33,492.48c-6.08,-33.93 -12.28,-67.63 -18.49,-102.17 11.07,-1.7 22.14,-3.53 33.08,-4.87 4.87,-0.61 4.01,3.65 4.26,6.32 1.34,11.43 2.31,22.74 3.53,34.18 1.95,17.88 3.89,35.76 5.72,53.52 0.24,2.31 0,4.74 0,7.3 -9.24,1.95 -18.49,3.77 -28.1,5.72zM780.42,390.92c10.34,0 20.68,0.12 30.89,-0.12 4.62,-0.12 6.32,0.85 6.2,6.2 -0.36,14.23 0.12,28.46 0.24,42.81 0.12,17.64 0,35.39 0,52.91 -10.46,1.09 -19.58,1.95 -29.43,3.04 -2.55,-34.42 -5.23,-68.72 -7.91,-104.84z\"/>\n</vector>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".MainActivity\">\n\n    <Button\n            android:text=\"网络地址播放\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/bt_url\" android:layout_marginTop=\"4dp\"\n            app:layout_constraintTop_toTopOf=\"parent\" app:layout_constraintStart_toStartOf=\"parent\"\n            android:layout_marginStart=\"16dp\" app:layout_constraintEnd_toEndOf=\"parent\" android:layout_marginEnd=\"8dp\"\n            android:layout_marginBottom=\"3dp\" app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.382\" app:layout_constraintVertical_bias=\"0.0\"/>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/activity_play.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        tools:context=\".PlayActivity\">\n    <!--<com.bilibili.lingxiao.ijkplayer.media.IjkVideoView-->\n    <!--android:id=\"@+id/video_view\"-->\n    <!--android:layout_width=\"match_parent\"-->\n    <!--android:layout_height=\"match_parent\" android:layout_marginTop=\"8dp\"-->\n    <!--app:layout_constraintTop_toTopOf=\"parent\" app:layout_constraintEnd_toEndOf=\"parent\"-->\n    <!--android:layout_marginEnd=\"8dp\" app:layout_constraintStart_toStartOf=\"parent\"-->\n    <!--android:layout_marginStart=\"8dp\" android:layout_marginBottom=\"8dp\"-->\n    <!--app:layout_constraintBottom_toBottomOf=\"parent\">-->\n    <com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView\n            android:id=\"@+id/simple_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"180dp\">\n    </com.bilibili.lingxiao.ijkplayer.widget.SimplePlayerView>\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"hello world\"/>\n</LinearLayout>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/activity_video_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/swipeLayout\">\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycerView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n        </androidx.recyclerview.widget.RecyclerView>\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/simple_player_controlbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout android:id=\"@+id/ll_bottom_bar\"\n              xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"#11000000\"\n              android:gravity=\"center_vertical\"\n\n              android:padding=\"2dp\">\n\n    <ImageView\n        android:id=\"@+id/video_play\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"TODO\" android:padding=\"8dp\"\n        android:src=\"@drawable/ic_img_play\"/>\n\n    <LinearLayout\n        android:id=\"@+id/app_video_process_panl\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:orientation=\"horizontal\">\n\n        <TextView\n            android:id=\"@+id/app_video_currentTime_full\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"06:21\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"12dp\"\n            android:visibility=\"gone\"/>\n\n        <LinearLayout\n            android:id=\"@+id/app_video_lift\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_marginLeft=\"2dp\"\n            android:layout_marginRight=\"2dp\"\n            android:orientation=\"horizontal\"\n            android:visibility=\"gone\">\n\n            <TextView\n                android:id=\"@+id/app_video_currentTime_left\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"06:21\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"12dp\"/>\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"/\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"12dp\"/>\n\n            <TextView\n                android:id=\"@+id/app_video_endTime_left\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"10:10\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"12dp\"/>\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:orientation=\"vertical\">\n            <!--style=\"@style/Widget.AppCompat.SeekBar\"-->\n            <SeekBar\n                android:id=\"@+id/video_seekBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:thumb=\"@drawable/progress_bar_thumb_tv\"\n            />\n\n\n        </LinearLayout>\n\n\n        <LinearLayout\n            android:id=\"@+id/app_video_center\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"2dp\"\n            android:layout_marginRight=\"2dp\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:id=\"@+id/video_currentTime\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"00:00\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"12dp\"/>\n\n            <TextView\n                    android:id=\"@+id/tv_sprit\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"/\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"12dp\"/>\n\n            <TextView\n                android:id=\"@+id/video_endTime\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"00:00\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"12dp\"/>\n        </LinearLayout>\n\n        <TextView\n            android:id=\"@+id/app_video_endTime_full\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"10:10\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"12dp\"\n            android:visibility=\"gone\"/>\n    </LinearLayout>\n\n\n\n\n    <!--<TextView-->\n        <!--android:id=\"@+id/app_video_stream\"-->\n        <!--android:layout_width=\"wrap_content\"-->\n        <!--android:layout_height=\"wrap_content\"-->\n        <!--android:clickable=\"true\"-->\n        <!--android:focusable=\"true\"-->\n        <!--android:padding=\"8dp\"-->\n        <!--android:text=\"标清\"-->\n        <!--android:textColor=\"@android:color/white\"-->\n        <!--android:textSize=\"12dp\"/>-->\n\n\n    <ImageView\n        android:id=\"@+id/video_fullscreen\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"TODO\" android:padding=\"8dp\"\n        android:src=\"@drawable/ic_img_fullscreen\"/>\n\n</LinearLayout>\n"
  },
  {
    "path": "ijkplayer/src/main/res/layout/simple_player_controlbar_fullscreen.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n        android:id=\"@+id/ll_bottom_bar\"\n              xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"#60000000\"\n              tools:background=\"#666\"\n              android:padding=\"2dp\"\n              android:orientation=\"vertical\"\n              xmlns:tools=\"http://schemas.android.com/tools\" >\n    <SeekBar\n            android:id=\"@+id/video_seekBar_full\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:thumb=\"@drawable/progress_bar_thumb_tv\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n    />\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center_vertical\"\n            android:padding=\"2dp\"\n    >\n        <ImageView\n                android:id=\"@+id/video_play_full\"\n                android:layout_width=\"35dp\"\n                android:layout_height=\"35dp\"\n                android:contentDescription=\"TODO\" android:padding=\"8dp\"\n                android:src=\"@drawable/ic_img_play\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n        />\n\n        <LinearLayout\n                android:id=\"@+id/app_video_process_panl\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                app:layout_constraintLeft_toRightOf=\"@id/video_play_full\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n        >\n\n            <LinearLayout\n                    android:id=\"@+id/app_video_center\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginLeft=\"2dp\"\n                    android:layout_marginRight=\"2dp\"\n                    android:orientation=\"horizontal\">\n\n                <TextView\n                        android:id=\"@+id/video_currentTime_full\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"00:00\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"12dp\"/>\n\n                <TextView\n                        android:id=\"@+id/tv_sprit_full\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"/\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"12dp\"/>\n\n                <TextView\n                        android:id=\"@+id/video_endTime_full\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"00:00\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"12dp\"/>\n            </LinearLayout>\n        </LinearLayout>\n\n\n\n\n        <!--<TextView-->\n        <!--android:id=\"@+id/app_video_stream\"-->\n        <!--android:layout_width=\"wrap_content\"-->\n        <!--android:layout_height=\"wrap_content\"-->\n        <!--android:clickable=\"true\"-->\n        <!--android:focusable=\"true\"-->\n        <!--android:padding=\"8dp\"-->\n        <!--android:text=\"标清\"-->\n        <!--android:textColor=\"@android:color/white\"-->\n        <!--android:textSize=\"12dp\"/>-->\n\n        <ImageView\n                android:id=\"@+id/danmaku_switch_full\"\n                android:layout_width=\"25dp\"\n                android:layout_height=\"25dp\"\n                android:contentDescription=\"TODO\" android:src=\"@drawable/bili_player_danmaku_is_open\"\n                android:layout_marginLeft=\"10dp\"\n                app:layout_constraintLeft_toRightOf=\"@id/app_video_process_panl\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n        />\n        <ImageView\n                android:id=\"@+id/danmaku_setting\"\n                android:layout_width=\"25dp\"\n                android:layout_height=\"25dp\"\n                android:contentDescription=\"TODO\" android:src=\"@drawable/ic_player_danmaku_setting\"\n                android:layout_marginLeft=\"10dp\"\n                app:layout_constraintLeft_toRightOf=\"@id/danmaku_switch_full\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n        />\n        <TextView\n                android:id=\"@+id/video_quility\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"8dp\"\n                android:text=\"自动\"\n                android:textColor=\"@color/white\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n\n               />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n\n</LinearLayout>\n"
  },
  {
    "path": "ijkplayer/src/main/res/layout/simple_player_topbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout android:id=\"@+id/app_video_top_box\"\n              xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"#11000000\"\n              android:gravity=\"center_vertical\"\n              android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@+id/video_finish\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:src=\"@drawable/ic_img_back\"\n        android:contentDescription=\"TODO\" android:padding=\"5dp\"\n        android:layout_margin=\"5dp\"/>\n\n    <TextView\n        android:id=\"@+id/video_title\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:ellipsize=\"marquee\"\n        android:padding=\"5dp\"\n        android:singleLine=\"true\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"12dp\"\n        android:visibility=\"visible\"/>\n\n    <ImageView\n        android:id=\"@+id/video_more\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:src=\"@drawable/ic_img_more\"\n        android:layout_margin=\"5dp\"\n        android:contentDescription=\"TODO\" android:padding=\"5dp\"/>\n\n</LinearLayout>\n"
  },
  {
    "path": "ijkplayer/src/main/res/layout/simple_player_touch_gestures.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    android:id=\"@+id/app_video_center_box\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/simple_player_center_bg\"\n    android:gravity=\"center_vertical\">\n    <!-- 声音-->\n    <LinearLayout\n        android:id=\"@+id/app_video_volume_box\"\n        android:layout_width=\"80dp\"\n        android:layout_height=\"80dp\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\"\n        >\n\n        <ImageView\n            android:id=\"@+id/app_video_volume_icon\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:contentDescription=\"TODO\" android:src=\"@drawable/simple_player_volume_up_white_36dp\"/>\n\n        <TextView\n            android:id=\"@+id/app_video_volume\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"50%\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"18dp\"/>\n    </LinearLayout>\n    <!-- 亮度-->\n    <LinearLayout\n        android:id=\"@+id/app_video_brightness_box\"\n        android:layout_width=\"80dp\"\n        android:layout_height=\"80dp\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\"\n        >\n\n        <ImageView\n            android:id=\"@+id/app_video_brightness_icon\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:contentDescription=\"TODO\" android:src=\"@drawable/simple_player_brightness_6_white_36dp\"/>\n\n        <TextView\n            android:id=\"@+id/app_video_brightness\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/operation_bg\"\n            android:paddingTop=\"8dp\"\n            android:text=\"50%\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"16dp\"/>\n    </LinearLayout>\n    <!-- 快进快退-->\n    <LinearLayout\n        android:id=\"@+id/app_video_fastForward_box\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"8dp\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\">\n\n        <TextView\n            android:id=\"@+id/app_video_fastForward\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/operation_bg\"\n            android:paddingTop=\"8dp\"\n            android:text=\"50%\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"16dp\"/>\n\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:paddingTop=\"8dp\">\n\n            <TextView\n                android:id=\"@+id/app_video_fastForward_target\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"50%\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"16dp\"/>\n\n            <TextView\n                android:id=\"@+id/app_video_fastForward_all\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"50%\"\n                android:textColor=\"#B3616161\"\n                android:textSize=\"16dp\"/>\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n\n</FrameLayout>\n"
  },
  {
    "path": "ijkplayer/src/main/res/layout/simple_player_view_player.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:id=\"@+id/video_root\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:background=\"@android:color/black\">\n\n\n    <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n    >\n\n        <com.bilibili.lingxiao.ijkplayer.media.IjkVideoView\n                android:id=\"@+id/video_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n        <master.flame.danmaku.ui.widget.DanmakuView\n                android:id=\"@+id/danmaku\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n    </FrameLayout>\n\n\n    <LinearLayout\n            android:id=\"@+id/ll_bg\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\">\n\n        <!-- 封面显示-->\n        <ImageView\n                android:id=\"@+id/iv_trumb\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:contentDescription=\"TODO\" android:scaleType=\"fitXY\"\n                android:visibility=\"visible\"/>\n    </LinearLayout>\n\n    <!--重新播放-->\n    <LinearLayout\n            android:id=\"@+id/app_video_replay\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"#33000000\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:visibility=\"gone\">\n        <!-- 播放状态-->\n        <TextView\n                android:id=\"@+id/app_video_status_text\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/small_problem\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"14dp\"/>\n\n        <ImageView\n                android:id=\"@+id/app_video_replay_icon\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerHorizontal=\"true\"\n                android:layout_marginTop=\"8dp\"\n                android:contentDescription=\"TODO\" android:src=\"@drawable/simple_player_circle_outline_white_36dp\"/>\n    </LinearLayout>\n    <!-- 网络提示-->\n    <LinearLayout\n            android:id=\"@+id/video_netTie\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"#33000000\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            tools:visibility=\"visible\"\n            android:visibility=\"gone\"\n    >\n\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:gravity=\"center\"\n                android:paddingLeft=\"8dp\"\n                android:paddingRight=\"8dp\"\n                android:text=\"您正在使用移动网络播放视频，可能产生较高流量费用\"\n                android:textSize=\"12sp\"\n                android:textColor=\"@android:color/white\"/>\n\n        <Button\n                android:id=\"@+id/video_button_continue\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"继续\"\n                android:background=\"@drawable/button_shape\"\n                android:textColor=\"@android:color/white\"\n                android:padding=\"2dp\"\n        />\n\n    </LinearLayout>\n\n    <!-- 最大试看时长提示-->\n    <LinearLayout\n            android:id=\"@+id/app_video_freeTie\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"#33000000\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:visibility=\"gone\">\n\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:gravity=\"center\"\n                android:paddingLeft=\"8dp\"\n                android:paddingRight=\"8dp\"\n                android:text=\"试看时间已到请购买继续观看\"\n                android:textColor=\"@android:color/white\"/>\n\n        <TextView\n                android:id=\"@+id/app_video_freeTie_icon\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                android:paddingLeft=\"8dp\"\n                android:paddingRight=\"8dp\"\n                android:text=\"购买\"\n                android:textColor=\"@android:color/white\"/>\n    </LinearLayout>\n\n    <!--加载中-->\n    <LinearLayout\n            android:id=\"@+id/app_video_loading\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:visibility=\"gone\">\n\n        <ProgressBar\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:indeterminateBehavior=\"repeat\"\n                android:indeterminateOnly=\"true\"/>\n        <TextView\n                android:id=\"@+id/app_video_speed\"\n                android:layout_width=\"wrap_content\"\n                android:layout_marginTop=\"4dp\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                android:visibility=\"gone\"\n                android:text=\"188Kb/s\"\n                android:textColor=\"@android:color/white\"/>\n    </LinearLayout>\n\n    <!-- 中间触摸提示-->\n    <include\n            layout=\"@layout/simple_player_touch_gestures\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"/>\n\n    <!-- 顶部栏-->\n    <include android:id=\"@+id/video_top\"\n             android:layout_marginTop=\"22dp\"\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"wrap_content\"\n             layout=\"@layout/simple_player_topbar\"/>\n    <!-- 底部栏-->\n\n    <FrameLayout\n            android:id=\"@+id/bottom_root\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n    >\n        <!--<include\n                android:id=\"@+id/video_bottom\"\n                layout=\"@layout/simple_player_controlbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                />-->\n        <!--<include\n                android:id=\"@+id/video_bottom\"\n                layout=\"@layout/simple_player_controlbar_fullscreen\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n        />-->\n    </FrameLayout>\n    <!--滑动时显示的进度-->\n    <LinearLayout\n            android:id=\"@+id/ll_video_progress\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"#90000000\"\n            android:orientation=\"horizontal\"\n            android:layout_centerInParent=\"true\"\n            android:gravity=\"center\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\"\n    >\n        <TextView\n                android:id=\"@+id/video_progress_text\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"10dp\"\n                android:textColor=\"@android:color/white\"\n        />\n    </LinearLayout>\n    <!--声音亮度控制-->\n\n    <LinearLayout\n            android:id=\"@+id/video_volume_controller_root\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center\"\n            android:background=\"#90000000\"\n            android:orientation=\"horizontal\"\n            android:layout_centerInParent=\"true\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n        <ImageView\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:contentDescription=\"TODO\" android:src=\"@drawable/ic_img_volice\"\n                android:layout_margin=\"10dp\"/>\n\n        <ProgressBar\n                android:id=\"@+id/video_volume_controller\"\n                style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n                android:layout_width=\"150dp\"\n                android:layout_height=\"wrap_content\"\n                android:maxHeight=\"2dp\"\n                android:minHeight=\"2dp\"\n                android:background=\"@color/colorRed200\"\n                android:progressDrawable=\"@drawable/progress_red\"\n                android:layout_marginRight=\"10dp\"/>\n\n    </LinearLayout>\n\n    <LinearLayout\n            android:id=\"@+id/video_brightness_controller_root\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center\"\n            android:background=\"#90000000\"\n            android:orientation=\"horizontal\"\n            android:layout_centerInParent=\"true\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n        <ImageView\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:contentDescription=\"TODO\" android:padding=\"5dp\"\n                android:src=\"@drawable/ic_img_light\"\n                android:layout_margin=\"10dp\"/>\n\n        <ProgressBar\n                android:id=\"@+id/video_brightness_controller\"\n                style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n                android:layout_width=\"150dp\"\n                android:layout_height=\"wrap_content\"\n                android:maxHeight=\"2dp\"\n                android:minHeight=\"2dp\"\n                android:background=\"@color/colorRed200\"\n                android:progressDrawable=\"@drawable/progress_red\"\n                android:layout_marginRight=\"10dp\"/>\n\n    </LinearLayout>\n\n\n    <!--分辨率选择-->\n    <LinearLayout\n            android:id=\"@+id/simple_player_select_stream_container\"\n            android:layout_width=\"150dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_alignParentRight=\"true\"\n            android:background=\"#80000000\"\n            android:gravity=\"center_vertical\"\n            android:visibility=\"gone\">\n\n        <ListView\n                android:id=\"@+id/simple_player_select_streams_list\"\n                android:layout_width=\"150dp\"\n                android:layout_height=\"wrap_content\"/>\n    </LinearLayout>\n\n    <FrameLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n    >\n        <ProgressBar\n                android:id=\"@+id/video_progress\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"/>\n        <ImageView\n                android:id=\"@+id/play_icon\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:contentDescription=\"TODO\" android:src=\"@drawable/ic_img_pause\"\n                android:layout_gravity=\"center\"\n                android:visibility=\"invisible\"\n                tools:visibility=\"visible\"\n        />\n    </FrameLayout>\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "ijkplayer/src/main/res/layout/table_media_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"fill_parent\" >\n\n    <TableLayout\n        android:id=\"@+id/table\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:shrinkColumns=\"1\" >\n    </TableLayout>\n\n</ScrollView>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/table_media_info_row1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TableRow xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_marginLeft=\"10dip\"\n    android:paddingBottom=\"2dip\"\n    android:paddingTop=\"2dip\" >\n\n    <TextView\n        android:id=\"@+id/name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"15sp\" />\n\n    <TextView\n        android:id=\"@+id/value\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingLeft=\"10dip\"\n        android:paddingRight=\"10dip\"\n        android:textSize=\"15sp\" />\n\n</TableRow>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/table_media_info_row2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TableRow xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:paddingBottom=\"0dip\"\n    android:paddingLeft=\"16dip\"\n    android:paddingRight=\"16dip\"\n    android:paddingTop=\"0dip\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <TextView\n        android:id=\"@+id/name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"12sp\" />\n\n    <TextView\n        android:id=\"@+id/value\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingLeft=\"10dip\"\n        android:paddingRight=\"10dip\"\n        android:textSize=\"12sp\" />\n\n</TableRow>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/table_media_info_section.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TableRow xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:paddingBottom=\"2dip\"\n    android:paddingLeft=\"8dip\"\n    android:paddingRight=\"8dip\"\n    android:paddingTop=\"4dip\" >\n\n    <TextView\n        android:id=\"@+id/name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"16sp\"\n        android:textStyle=\"bold\" />\n\n</TableRow>"
  },
  {
    "path": "ijkplayer/src/main/res/layout/video_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    app:cardElevation=\"@dimen/cardview_default_elevation\"\n    app:cardCornerRadius=\"@dimen/cardview_default_radius\"\n    app:cardMaxElevation=\"5dp\"\n    android:layout_margin=\"5dp\"\n    android:background=\"?android:attr/selectableItemBackgroundBorderless\"\n    android:id=\"@+id/cardView\">\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:layout_margin=\"8dp\">\n        <TextView\n            android:id=\"@+id/tv_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"标题：\"\n            android:maxLines=\"1\"\n            android:ellipsize=\"end\"\n            />\n        <TextView\n            android:id=\"@+id/tv_size\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"大小：\"\n            android:maxLines=\"1\"\n            android:ellipsize=\"end\"\n            />\n        <TextView\n            android:id=\"@+id/tv_path\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"路径：\"\n            android:maxLines=\"2\"\n            android:ellipsize=\"end\"\n            />\n    </LinearLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "ijkplayer/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "ijkplayer/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "ijkplayer/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"colorPrimaryDark\">#00574B</color>\n    <color name=\"colorAccent\">#D81B60</color>\n\n    <color name=\"colorRed200\">#44EF9A9A</color>\n</resources>\n"
  },
  {
    "path": "ijkplayer/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">IJKPlayer</string>\n\n\n\n    <string name=\"N_A\">N/A</string>\n    <string name=\"close\">Close</string>\n    <string name=\"exit\">Exit</string>\n    <string name=\"sample\">Sample</string>\n    <string name=\"recent\">Recent</string>\n    <string name=\"settings\">Settings</string>\n    <string name=\"tracks\">Tracks</string>\n    <string name=\"toggle_player\">Player</string>\n    <string name=\"toggle_render\">Render</string>\n    <string name=\"toggle_ratio\">Scale</string>\n    <string name=\"show_info\">Info</string>\n    <string name=\"vdec\">vdec</string>\n    <string name=\"fps\">fps</string>\n    <string name=\"v_cache\">v-cache</string>\n    <string name=\"a_cache\">a-cache</string>\n    <string name=\"load_cost\">load-cost</string>\n    <string name=\"seek_cost\">seek_cost</string>\n    <string name=\"seek_load_cost\">seek_load_cost</string>\n    <string name=\"tcp_speed\">tcp_speed</string>\n    <string name=\"bit_rate\">bit_rate</string>\n\n    <string name=\"media_information\">Media Information</string>\n    <string name=\"mi_player\">Player</string>\n    <string name=\"mi_media\">Media</string>\n    <string name=\"mi_profile_level\">Profile level</string>\n    <string name=\"mi_pixel_format\">Pixel format</string>\n    <string name=\"mi_resolution\">Resolution</string>\n    <string name=\"mi_length\">Length</string>\n    <string name=\"mi_stream_fmt1\">Stream #%d</string>\n    <string name=\"mi_type\">Type</string>\n    <string name=\"mi_language\">Language</string>\n    <string name=\"mi_codec\">Codec</string>\n    <string name=\"mi_frame_rate\">Frame rate</string>\n    <string name=\"mi_bit_rate\">Bit rate</string>\n    <string name=\"mi_sample_rate\">Sample rate</string>\n    <string name=\"mi_channels\">Channels</string>\n    <string name=\"mi__selected_video_track\">*</string>\n    <string name=\"mi__selected_audio_track\">*</string>\n    <string name=\"mi__selected_subtitle_track\">*</string>\n\n    <string name=\"TrackType_video\">Video</string>\n    <string name=\"TrackType_audio\">Audio</string>\n    <string name=\"TrackType_subtitle\">Subtitle</string>\n    <string name=\"TrackType_timedtext\">Timed text</string>\n    <string name=\"TrackType_metadata\">Meta data</string>\n    <string name=\"TrackType_unknown\">Unknown</string>\n\n    <string name=\"VideoView_error_text_invalid_progressive_playback\">Invalid progressive playback</string>\n    <string name=\"VideoView_error_text_unknown\">Unknown</string>\n    <string name=\"VideoView_error_button\">OK</string>\n\n    <string name=\"VideoView_ar_aspect_fit_parent\">Aspect / Fit parent</string>\n    <string name=\"VideoView_ar_aspect_fill_parent\">Aspect / Fill parent</string>\n    <string name=\"VideoView_ar_aspect_wrap_content\">Aspect / Wrap content</string>\n    <string name=\"VideoView_ar_match_parent\">Free / Fill parent</string>\n    <string name=\"VideoView_ar_16_9_fit_parent\">16:9 / Fit parent</string>\n    <string name=\"VideoView_ar_4_3_fit_parent\">4:3 / Fit parent</string>\n\n    <string name=\"VideoView_render_none\">Render: None</string>\n    <string name=\"VideoView_render_surface_view\">Render: SurfaceView</string>\n    <string name=\"VideoView_render_texture_view\">Render: TextureView</string>\n\n    <string name=\"VideoView_player_none\">Player: None</string>\n    <string name=\"VideoView_player_AndroidMediaPlayer\">Player: AndroidMediaPlayer</string>\n    <string name=\"VideoView_player_IjkMediaPlayer\">Player: IjkMediaPlayer</string>\n    <string name=\"VideoView_player_IjkExoMediaPlayer\">Player: IjkExoMediaPlayer</string>\n\n\n    <string name=\"giraffe_player_url_empty\">请指定播放视频的地址</string>\n    <string name=\"small_problem\">出现了点小问题,稍后重试</string>\n    <string name=\"can_not_play\">不能播放此视频</string>\n    <string name=\"not_support\">播放器不支持此设备</string>\n</resources>\n"
  },
  {
    "path": "ijkplayer/src/main/res/values/strings_pref.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- -->\n    <string name=\"pref_title_general\">General</string>\n\n    <string name=\"pref_key_enable_background_play\">pref.enable_background_play</string>\n    <string name=\"pref_title_enable_background_play\">Enable background play</string>\n    <string name=\"pref_summary_enable_background_play\">need Android 4.0+</string>\n\n    <string name=\"pref_key_using_android_player\">pref.using_android_player</string>\n    <string name=\"pref_title_using_android_player\">Using system player</string>\n    <string name=\"pref_summary_using_android_player\"></string>\n\n    <string name=\"pref_key_player\">pref.player</string>\n    <string name=\"pref_title_player\">Choose Player</string>\n    <string-array name=\"pref_entries_player\">\n        <item>Auto Select</item>\n        <item>AndroidMediaPlayer</item>\n        <item>IjkMediaPlayer</item>\n        <item>IjkExoMediaPlayer</item>\n    </string-array>\n    <string-array name=\"pref_entry_values_player\">\n        <item>0</item>\n        <item>1</item>\n        <item>2</item>\n        <item>3</item>\n    </string-array>\n    <string-array name=\"pref_entry_summaries_player\">\n        <item>Auto Select</item>\n        <item>AndroidMediaPlayer</item>\n        <item>IjkMediaPlayer</item>\n        <item>IjkExoMediaPlayer</item>\n    </string-array>\n\n    <!-- -->\n    <string name=\"pref_title_ijkplayer_video\">Video: ijkplayer</string>\n\n    <string name=\"pref_key_using_media_codec\">pref.using_media_codec</string>\n    <string name=\"pref_title_using_media_codec\">Using MediaCodec</string>\n    <string name=\"pref_summary_using_media_codec\"></string>\n\n    <string name=\"pref_key_using_media_codec_auto_rotate\">pref.using_media_codec_auto_rotate</string>\n    <string name=\"pref_title_using_media_codec_auto_rotate\">Using MediaCodec auto rotate</string>\n    <string name=\"pref_summary_using_media_codec_auto_rotate\"></string>\n\n    <string name=\"pref_key_media_codec_handle_resolution_change\">pref.media_codec_handle_resolution_change</string>\n    <string name=\"pref_title_media_codec_handle_resolution_change\">MediaCodec handle resolution change</string>\n    <string name=\"pref_summary_media_codec_handle_resolution_change\"></string>\n\n    <string name=\"pref_key_pixel_format\">pref.pixel_format</string>\n    <string name=\"pref_title_pixel_format\">Pixel Format</string>\n    <string-array name=\"pref_entries_pixel_format\">\n        <item>Auto Select</item>\n        <item>RGB 565</item>\n        <item>RGB 888</item>\n        <item>RGBX 8888</item>\n        <item>YV12</item>\n        <item>OpenGL ES2</item>\n    </string-array>\n    <string-array name=\"pref_entry_values_pixel_format\">\n        <item></item>\n        <item>fcc-rv16</item>\n        <item>fcc-rv24</item>\n        <item>fcc-rv32</item>\n        <item>fcc-yv12</item>\n        <item>fcc-_es2</item>\n    </string-array>\n    <string-array name=\"pref_entry_summaries_pixel_format\">\n        <item>Auto Select</item>\n        <item>RGB 565</item>\n        <item>RGB 888</item>\n        <item>RGBX 8888</item>\n        <item>YV12</item>\n        <item>OpenGL ES2</item>\n    </string-array>\n\n    <!-- -->\n    <string name=\"pref_title_ijkplayer_audio\">Audio: ijkplayer</string>\n\n    <string name=\"pref_key_using_opensl_es\">pref.using_opensl_es</string>\n    <string name=\"pref_title_using_opensl_es\">Using OpenSL ES</string>\n    <string name=\"pref_summary_using_opensl_es\"></string>\n\n    <!-- -->\n    <string name=\"pref_title_render_view\">RenderView</string>\n\n    <string name=\"pref_key_enable_no_view\">pref.enable_no_view</string>\n    <string name=\"pref_title_enable_no_view\">Enable NoView</string>\n    <string name=\"pref_summary_enable_no_view\"></string>\n\n    <string name=\"pref_key_enable_surface_view\">pref.enable_surface_view</string>\n    <string name=\"pref_title_enable_surface_view\">Enable SurfaceView</string>\n    <string name=\"pref_summary_enable_surface_view\"></string>\n\n    <string name=\"pref_key_enable_texture_view\">pref.enable_texture_view</string>\n    <string name=\"pref_title_enable_texture_view\">Enable TextureView</string>\n    <string name=\"pref_summary_enable_texture_view\"></string>\n\n    <string name=\"pref_key_enable_detached_surface_texture\">pref.enable_detached_surface_texture</string>\n    <string name=\"pref_title_enable_detached_surface_texture\">Enable detached SurfaceTexture</string>\n    <string name=\"pref_summary_enable_detached_surface_texture\"></string>\n\n    <!-- -->\n    <string name=\"pref_title_misc\">Misc</string>\n    <string name=\"pref_key_using_mediadatasource\">pref.using_mediadatasource</string>\n    <string name=\"pref_title_using_mediadatasource\">Using MediaDataSource</string>\n    <string name=\"pref_summary_using_mediadatasource\"></string>\n\n    <!-- -->\n    <string name=\"pref_key_last_directory\"></string>\n\n</resources>\n"
  },
  {
    "path": "ijkplayer/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "ijkplayer/src/test/java/com/bilibili/lingxiao/ijkplayer/ExampleUnitTest.kt",
    "content": "package com.bilibili.lingxiao.ijkplayer\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':common', ':ijkplayer', ':skinLibrary'\n"
  },
  {
    "path": "skinLibrary/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "skinLibrary/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'\n\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation 'androidx.appcompat:appcompat:1.2.0'\n    implementation 'com.google.android.material:material:1.2.1'\n    api \"skin.support:skin-support:$rootProject.ext.skinSupportVersion\"                  // skin-support 基础控件支持\n    api \"skin.support:skin-support-design:$rootProject.ext.skinSupportVersion\"           // skin-support-design material design 控件支持[可选]\n    api \"skin.support:skin-support-cardview:$rootProject.ext.skinSupportVersion\"          // skin-support-cardview CardView 控件支持[可选]\n    api \"skin.support:skin-support-constraint-layout:$rootProject.ext.skinSupportVersion\" // skin-support-constraint-layout ConstraintLayout 控件支持[可选]\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.2'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version\"\n}\nrepositories {\n    mavenCentral()\n}\n"
  },
  {
    "path": "skinLibrary/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "skinLibrary/src/androidTest/java/com/lingxiao/skinlibrary/ExampleInstrumentedTest.java",
    "content": "package com.lingxiao.skinlibrary;\n\nimport android.content.Context;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.lingxiao.skinlibrary.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "skinLibrary/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.lingxiao.skinlibrary\" />\n"
  },
  {
    "path": "skinLibrary/src/main/java/com/lingxiao/skinlibrary/SkinLib.kt",
    "content": "package com.lingxiao.skinlibrary\n\nimport android.app.Application\n\nimport skin.support.SkinCompatManager\nimport skin.support.app.SkinCardViewInflater\nimport skin.support.constraint.app.SkinConstraintViewInflater\nimport skin.support.design.app.SkinMaterialViewInflater\n\nobject SkinLib {\n    fun init(context: Application) {\n        SkinCompatManager.withoutActivity(context)                         // 基础控件换肤初始化\n            .addInflater(SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]\n            .addInflater(SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]\n            .addInflater(SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]\n            .loadSkin()\n    }\n\n    /**\n     * 后缀加载\n     * @param skinName R.color.windowBackgroundColor, 添加对应资源R.color.windowBackgroundColor_night\n     */\n    fun loadSkin(skinName: String) {\n        SkinCompatManager.getInstance().loadSkin(skinName, SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN) // 后缀加载\n    }\n\n    /**\n     *\n     * @param skinName\n     */\n    fun loadSkinBack(skinName: String) {\n        SkinCompatManager.getInstance()\n            .loadSkin(skinName, SkinCompatManager.SKIN_LOADER_STRATEGY_PREFIX_BUILD_IN) // 前缀加载\n    }\n\n    fun resetSkin() {\n        // 恢复应用默认皮肤\n        SkinCompatManager.getInstance().restoreDefaultTheme()\n    }\n}\n"
  },
  {
    "path": "skinLibrary/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!--material color-->\n    <color name=\"red_50\">#FFEBEE</color>\n    <color name=\"red_100\">#FFCDD2</color>\n    <color name=\"red_200\">#EF9A9A</color>\n    <color name=\"red_300\">#E57373</color>\n    <color name=\"red_400\">#EF5350</color>\n    <color name=\"red_500\">#F44336</color>\n    <color name=\"red_600\">#E53935</color>\n    <color name=\"red_700\">#D32F2F</color>\n\n    <color name=\"pink_50\">#FCE4EC</color>\n    <color name=\"pink_100\">#F8BBD0</color>\n    <color name=\"pink_200\">#F48FB1</color>\n    <color name=\"pink_300\">#F06292</color>\n    <color name=\"pink_400\">#EC407A</color>\n    <color name=\"pink_500\">#E91E63</color>\n    <color name=\"pink_600\">#D81B60</color>\n    <color name=\"pink_700\">#C2185B</color>\n\n    <color name=\"purple50\">#F3E5F5</color>\n    <color name=\"purple100\">#E1BEE7</color>\n    <color name=\"purple200\">#CE93D8</color>\n    <color name=\"purple300\">#BA68C8</color>\n    <color name=\"purple400\">#AB47BC</color>\n    <color name=\"purple500\">#9C27B0</color>\n    <color name=\"purple600\">#8E24AA</color>\n    <color name=\"purple700\">#7B1FA2</color>\n\n    <color name=\"deepPurple50\">#EDE7F6</color>\n    <color name=\"deepPurple100\">#D1C4E9</color>\n    <color name=\"deepPurple200\">#B39DDB</color>\n    <color name=\"deepPurple300\">#9575CD</color>\n    <color name=\"deepPurple400\">#7E57C2</color>\n    <color name=\"deepPurple500\">#673AB7</color>\n    <color name=\"deepPurple600\">#5E35B1</color>\n    <color name=\"deepPurple700\">#512DA8</color>\n\n    <color name=\"indigo50\">#E8EAF6</color>\n    <color name=\"indigo100\">#C5CAE9</color>\n    <color name=\"indigo200\">#9FA8DA</color>\n    <color name=\"indigo300\">#7986CB</color>\n    <color name=\"indigo400\">#5C6BC0</color>\n    <color name=\"indigo500\">#3F51B5</color>\n    <color name=\"indigo600\">#3949AB</color>\n    <color name=\"indigo700\">#303F9F</color>\n\n\n    <color name=\"blue50\">#E3F2FD</color>\n    <color name=\"blue100\">#BBDEFB</color>\n    <color name=\"blue200\">#90CAF9</color>\n    <color name=\"blue300\">#64B5F6</color>\n    <color name=\"blue400\">#42A5F5</color>\n    <color name=\"blue500\">#2196F3</color>\n    <color name=\"blue600\">#1E88E5</color>\n    <color name=\"blue700\">#1976D2</color>\n\n    <!--toolbar颜色-->\n    <color name=\"colorPrimary_default\">#F06292</color>\n    <color name=\"colorPrimary_red300\">@color/red_300</color>\n    <color name=\"colorPrimary_blue300\">@color/blue300</color>\n    <color name=\"colorPrimary_lightBlue300\">@color/light_blue_300</color>\n    <color name=\"colorPrimary_cyan300\">@color/cyan_300</color>\n    <color name=\"colorPrimary_indigo300\">@color/indigo300</color>\n    <color name=\"colorPrimary_deepPurple300\">@color/deepPurple300</color>\n    <color name=\"colorPrimary_pink300\">@color/pink_300</color>\n    <color name=\"colorPrimary_orange300\">@color/orange_300</color>\n    <color name=\"colorPrimary_teal300\">@color/teal_300</color>\n    <color name=\"colorPrimary_green300\">@color/light_green_300</color>\n    <color name=\"colorPrimary_black\">@color/black</color>\n    <!--状态栏和开关颜色-->\n    <color name=\"colorPrimaryDark_default\">#388E3C</color>\n    <color name=\"colorPrimaryDark_red300\">@color/red_500</color>\n    <color name=\"colorPrimaryDark_blue300\">@color/blue500</color>\n    <color name=\"colorPrimaryDark_lightBlue300\">@color/light_blue_500</color>\n    <color name=\"colorPrimaryDark_cyan300\">@color/cyan_500</color>\n    <color name=\"colorPrimaryDark_indigo300\">@color/indigo500</color>\n    <color name=\"colorPrimaryDark_deepPurple300\">@color/deepPurple500</color>\n    <color name=\"colorPrimaryDark_pink300\">@color/pink_500</color>\n    <color name=\"colorPrimaryDark_orange300\">@color/orange_300</color>\n    <color name=\"colorPrimaryDark_teal300\">@color/teal_300</color>\n    <color name=\"colorPrimaryDark_green300\">@color/light_green_300</color>\n\n    <!--skinact背景颜色-->\n    <color name=\"skinBackground_default\">#ffffffff</color>\n    <color name=\"skinBackground_red300\">@color/red_300</color>\n    <color name=\"skinBackground_blue300\">@color/blue300</color>\n    <color name=\"skinBackground_lightBlue300\">@color/light_blue_300</color>\n    <color name=\"skinBackground_cyan300\">@color/cyan_300</color>\n    <color name=\"skinBackground_indigo300\">@color/indigo300</color>\n    <color name=\"skinBackground_deepPurple300\">@color/deepPurple300</color>\n    <color name=\"skinBackground_pink300\">@color/pink_300</color>\n    <color name=\"skinBackground_orange300\">@color/orange_300</color>\n    <color name=\"skinBackground_teal300\">@color/teal_300</color>\n\n    <color name=\"amber_100\">#ffecb3</color>\n    <color name=\"amber_200\">#ffe082</color>\n    <color name=\"amber_300\">#ffd54f</color>\n    <color name=\"amber_400\">#ffca28</color>\n    <color name=\"amber_50\">#fff8e1</color>\n    <color name=\"amber_500\">#ffc107</color>\n    <color name=\"amber_600\">#ffb300</color>\n    <color name=\"amber_700\">#ffa000</color>\n    <color name=\"amber_800\">#ff8f00</color>\n    <color name=\"amber_900\">#ff6f00</color>\n    <color name=\"amber_a100\">#ffe57f</color>\n    <color name=\"amber_a200\">#ffd740</color>\n    <color name=\"amber_a400\">#ffc400</color>\n    <color name=\"amber_a700\">#ffab00</color>\n    <color name=\"black\">#000000</color>\n    <color name=\"black_alpha_112\">#70000000</color>\n    <color name=\"black_alpha_128\">#80000000</color>\n    <color name=\"black_alpha_144\">#90000000</color>\n    <color name=\"black_alpha_16\">#10000000</color>\n    <color name=\"black_alpha_160\">#a0000000</color>\n    <color name=\"black_alpha_176\">#b0000000</color>\n    <color name=\"black_alpha_192\">#c0000000</color>\n    <color name=\"black_alpha_208\">#d0000000</color>\n    <color name=\"black_alpha_224\">#e0000000</color>\n    <color name=\"black_alpha_240\">#f0000000</color>\n    <color name=\"black_alpha_32\">#20000000</color>\n    <color name=\"black_alpha_48\">#30000000</color>\n    <color name=\"black_alpha_64\">#40000000</color>\n    <color name=\"black_alpha_80\">#50000000</color>\n    <color name=\"black_alpha_96\">#60000000</color>\n    <color name=\"blue_100\">#d0d9ff</color>\n    <color name=\"blue_200\">#afbfff</color>\n    <color name=\"blue_300\">#91a7ff</color>\n    <color name=\"blue_400\">#738ffe</color>\n    <color name=\"blue_50\">#e7e9fd</color>\n    <color name=\"blue_500\">#5677fc</color>\n    <color name=\"blue_600\">#4e6cef</color>\n    <color name=\"blue_700\">#455ede</color>\n    <color name=\"blue_800\">#3b50ce</color>\n    <color name=\"blue_900\">#2a36b1</color>\n    <color name=\"blue_a100\">#a6baff</color>\n    <color name=\"blue_a200\">#6889ff</color>\n    <color name=\"blue_a400\">#4d73ff</color>\n    <color name=\"blue_a700\">#4d69ff</color>\n    <color name=\"blue_grey_100\">#cfd8dc</color>\n    <color name=\"blue_grey_200\">#b0bec5</color>\n    <color name=\"blue_grey_300\">#90a4ae</color>\n    <color name=\"blue_grey_400\">#78909c</color>\n    <color name=\"blue_grey_50\">#eceff1</color>\n    <color name=\"blue_grey_500\">#607d8b</color>\n    <color name=\"blue_grey_600\">#546e7a</color>\n    <color name=\"blue_grey_700\">#455a64</color>\n    <color name=\"blue_grey_800\">#37474f</color>\n    <color name=\"blue_grey_900\">#263238</color>\n    <color name=\"brown_100\">#d7ccc8</color>\n    <color name=\"brown_200\">#bcaaa4</color>\n    <color name=\"brown_300\">#a1887f</color>\n    <color name=\"brown_400\">#8d6e63</color>\n    <color name=\"brown_50\">#efebe9</color>\n    <color name=\"brown_500\">#795548</color>\n    <color name=\"brown_600\">#6d4c41</color>\n    <color name=\"brown_700\">#5d4037</color>\n    <color name=\"brown_800\">#4e342e</color>\n    <color name=\"brown_900\">#3e2723</color>\n    <color name=\"cyan_100\">#b2ebf2</color>\n    <color name=\"cyan_200\">#80deea</color>\n    <color name=\"cyan_300\">#4dd0e1</color>\n    <color name=\"cyan_400\">#26c6da</color>\n    <color name=\"cyan_50\">#e0f7fa</color>\n    <color name=\"cyan_500\">#00bcd4</color>\n    <color name=\"cyan_600\">#00acc1</color>\n    <color name=\"cyan_700\">#0097a7</color>\n    <color name=\"cyan_800\">#00838f</color>\n    <color name=\"cyan_900\">#006064</color>\n    <color name=\"cyan_a100\">#84ffff</color>\n    <color name=\"cyan_a200\">#18ffff</color>\n    <color name=\"cyan_a400\">#00e5ff</color>\n    <color name=\"cyan_a700\">#00b8d4</color>\n    <color name=\"deep_orange_100\">#ffccbc</color>\n    <color name=\"deep_orange_200\">#ffab91</color>\n    <color name=\"deep_orange_300\">#ff8a65</color>\n    <color name=\"deep_orange_400\">#ff7043</color>\n    <color name=\"deep_orange_50\">#fbe9e7</color>\n    <color name=\"deep_orange_500\">#ff5722</color>\n    <color name=\"deep_orange_600\">#f4511e</color>\n    <color name=\"deep_orange_700\">#e64a19</color>\n    <color name=\"deep_orange_800\">#d84315</color>\n    <color name=\"deep_orange_900\">#bf360c</color>\n    <color name=\"deep_orange_a100\">#ff9e80</color>\n    <color name=\"deep_orange_a200\">#ff6e40</color>\n    <color name=\"deep_orange_a400\">#ff3d00</color>\n    <color name=\"deep_orange_a700\">#dd2c00</color>\n    <color name=\"deep_purple_100\">#d1c4e9</color>\n    <color name=\"deep_purple_200\">#b39ddb</color>\n    <color name=\"deep_purple_300\">#9575cd</color>\n    <color name=\"deep_purple_400\">#7e57c2</color>\n    <color name=\"deep_purple_50\">#ede7f6</color>\n    <color name=\"deep_purple_500\">#673ab7</color>\n    <color name=\"deep_purple_600\">#5e35b1</color>\n    <color name=\"deep_purple_700\">#512da8</color>\n    <color name=\"deep_purple_800\">#4527a0</color>\n    <color name=\"deep_purple_900\">#311b92</color>\n    <color name=\"deep_purple_a100\">#b388ff</color>\n    <color name=\"deep_purple_a200\">#7c4dff</color>\n    <color name=\"deep_purple_a400\">#651fff</color>\n    <color name=\"deep_purple_a700\">#6200ea</color>\n    <color name=\"green_100\">#a3e9a4</color>\n    <color name=\"green_200\">#72d572</color>\n    <color name=\"green_300\">#42bd41</color>\n    <color name=\"green_400\">#2baf2b</color>\n    <color name=\"green_50\">#d0f8ce</color>\n    <color name=\"green_500\">#259b24</color>\n    <color name=\"green_600\">#0a8f08</color>\n    <color name=\"green_700\">#0a7e07</color>\n    <color name=\"green_800\">#056f00</color>\n    <color name=\"green_900\">#0d5302</color>\n    <color name=\"green_a100\">#a2f78d</color>\n    <color name=\"green_a200\">#5af158</color>\n    <color name=\"green_a400\">#14e715</color>\n    <color name=\"green_a700\">#12c700</color>\n    <color name=\"grey_100\">#f5f5f5</color>\n    <color name=\"grey_200\">#eeeeee</color>\n    <color name=\"grey_300\">#e0e0e0</color>\n    <color name=\"grey_400\">#bdbdbd</color>\n    <color name=\"grey_50\">#fafafa</color>\n    <color name=\"grey_500\">#9e9e9e</color>\n    <color name=\"grey_600\">#757575</color>\n    <color name=\"grey_700\">#616161</color>\n    <color name=\"grey_800\">#424242</color>\n    <color name=\"grey_900\">#212121</color>\n    <color name=\"indigo_100\">#c5cae9</color>\n    <color name=\"indigo_200\">#9fa8da</color>\n    <color name=\"indigo_300\">#7986cb</color>\n    <color name=\"indigo_400\">#5c6bc0</color>\n    <color name=\"indigo_50\">#e8eaf6</color>\n    <color name=\"indigo_500\">#3f51b5</color>\n    <color name=\"indigo_600\">#3949ab</color>\n    <color name=\"indigo_700\">#303f9f</color>\n    <color name=\"indigo_800\">#283593</color>\n    <color name=\"indigo_900\">#1a237e</color>\n    <color name=\"indigo_a100\">#8c9eff</color>\n    <color name=\"indigo_a200\">#536dfe</color>\n    <color name=\"indigo_a400\">#3d5afe</color>\n    <color name=\"indigo_a700\">#304ffe</color>\n    <color name=\"light_blue_100\">#b3e5fc</color>\n    <color name=\"light_blue_200\">#81d4fa</color>\n    <color name=\"light_blue_300\">#4fc3f7</color>\n    <color name=\"light_blue_400\">#29b6f6</color>\n    <color name=\"light_blue_50\">#e1f5fe</color>\n    <color name=\"light_blue_500\">#03a9f4</color>\n    <color name=\"light_blue_600\">#039be5</color>\n    <color name=\"light_blue_700\">#0288d1</color>\n    <color name=\"light_blue_800\">#0277bd</color>\n    <color name=\"light_blue_900\">#01579b</color>\n    <color name=\"light_blue_a100\">#80d8ff</color>\n    <color name=\"light_blue_a200\">#40c4ff</color>\n    <color name=\"light_blue_a400\">#00b0ff</color>\n    <color name=\"light_blue_a700\">#0091ea</color>\n    <color name=\"light_green_100\">#dcedc8</color>\n    <color name=\"light_green_200\">#c5e1a5</color>\n    <color name=\"light_green_300\">#aed581</color>\n    <color name=\"light_green_400\">#9ccc65</color>\n    <color name=\"light_green_50\">#f1f8e9</color>\n    <color name=\"light_green_500\">#8bc34a</color>\n    <color name=\"light_green_600\">#7cb342</color>\n    <color name=\"light_green_700\">#689f38</color>\n    <color name=\"light_green_800\">#558b2f</color>\n    <color name=\"light_green_900\">#33691e</color>\n    <color name=\"light_green_a100\">#ccff90</color>\n    <color name=\"light_green_a200\">#b2ff59</color>\n    <color name=\"light_green_a400\">#76ff03</color>\n    <color name=\"light_green_a700\">#64dd17</color>\n    <color name=\"lime_100\">#f0f4c3</color>\n    <color name=\"lime_200\">#e6ee9c</color>\n    <color name=\"lime_300\">#dce775</color>\n    <color name=\"lime_400\">#d4e157</color>\n    <color name=\"lime_50\">#f9fbe7</color>\n    <color name=\"lime_500\">#cddc39</color>\n    <color name=\"lime_600\">#c0ca33</color>\n    <color name=\"lime_700\">#afb42b</color>\n    <color name=\"lime_800\">#9e9d24</color>\n    <color name=\"lime_900\">#827717</color>\n    <color name=\"lime_a100\">#f4ff81</color>\n    <color name=\"lime_a200\">#eeff41</color>\n    <color name=\"lime_a400\">#c6ff00</color>\n    <color name=\"lime_a700\">#aeea00</color>\n    <color name=\"orange_100\">#ffe0b2</color>\n    <color name=\"orange_200\">#ffcc80</color>\n    <color name=\"orange_300\">#ffb74d</color>\n    <color name=\"orange_400\">#ffa726</color>\n    <color name=\"orange_50\">#fff3e0</color>\n    <color name=\"orange_500\">#ff9800</color>\n    <color name=\"orange_600\">#fb8c00</color>\n    <color name=\"orange_700\">#f57c00</color>\n    <color name=\"orange_800\">#ef6c00</color>\n    <color name=\"orange_900\">#e65100</color>\n    <color name=\"orange_a100\">#ffd180</color>\n    <color name=\"orange_a200\">#ffab40</color>\n    <color name=\"orange_a400\">#ff9100</color>\n    <color name=\"orange_a700\">#ff6d00</color>\n    <color name=\"pink_800\">#ad1457</color>\n    <color name=\"pink_900\">#880e4f</color>\n    <color name=\"pink_a100\">#ff80ab</color>\n    <color name=\"pink_a200\">#ff4081</color>\n    <color name=\"pink_a400\">#f50057</color>\n    <color name=\"pink_a700\">#c51162</color>\n    <color name=\"purple_100\">#e1bee7</color>\n    <color name=\"purple_200\">#ce93d8</color>\n    <color name=\"purple_300\">#ba68c8</color>\n    <color name=\"purple_400\">#ab47bc</color>\n    <color name=\"purple_50\">#f3e5f5</color>\n    <color name=\"purple_500\">#9c27b0</color>\n    <color name=\"purple_600\">#8e24aa</color>\n    <color name=\"purple_700\">#7b1fa2</color>\n    <color name=\"purple_800\">#6a1b9a</color>\n    <color name=\"purple_900\">#4a148c</color>\n    <color name=\"purple_a100\">#ea80fc</color>\n    <color name=\"purple_a200\">#e040fb</color>\n    <color name=\"purple_a400\">#d500f9</color>\n    <color name=\"purple_a700\">#aa00ff</color>\n\n    <color name=\"red_800\">#c41411</color>\n    <color name=\"red_900\">#b0120a</color>\n    <color name=\"red_a100\">#ff7997</color>\n    <color name=\"red_a200\">#ff5177</color>\n    <color name=\"red_a400\">#ff2d6f</color>\n    <color name=\"red_a700\">#e00032</color>\n    <color name=\"teal_100\">#b2dfdb</color>\n    <color name=\"teal_200\">#80cbc4</color>\n    <color name=\"teal_300\">#4db6ac</color>\n    <color name=\"teal_400\">#26a69a</color>\n    <color name=\"teal_50\">#e0f2f1</color>\n    <color name=\"teal_500\">#009688</color>\n    <color name=\"teal_600\">#00897b</color>\n    <color name=\"teal_700\">#00796b</color>\n    <color name=\"teal_800\">#00695c</color>\n    <color name=\"teal_900\">#004d40</color>\n    <color name=\"teal_a100\">#a7ffeb</color>\n    <color name=\"teal_a200\">#64ffda</color>\n    <color name=\"teal_a400\">#1de9b6</color>\n    <color name=\"teal_a700\">#00bfa5</color>\n    <color name=\"trans\">#00000000</color>\n    <color name=\"white\">#ffffff</color>\n    <color name=\"white_alpha_112\">#70ffffff</color>\n    <color name=\"white_alpha_128\">#80ffffff</color>\n    <color name=\"white_alpha_144\">#90ffffff</color>\n    <color name=\"white_alpha_16\">#10ffffff</color>\n    <color name=\"white_alpha_160\">#a0ffffff</color>\n    <color name=\"white_alpha_176\">#b0ffffff</color>\n    <color name=\"white_alpha_192\">#c0ffffff</color>\n    <color name=\"white_alpha_208\">#d0ffffff</color>\n    <color name=\"white_alpha_224\">#e0ffffff</color>\n    <color name=\"white_alpha_240\">#f0ffffff</color>\n    <color name=\"white_alpha_32\">#20ffffff</color>\n    <color name=\"white_alpha_48\">#30ffffff</color>\n    <color name=\"white_alpha_64\">#40ffffff</color>\n    <color name=\"white_alpha_80\">#50ffffff</color>\n    <color name=\"white_alpha_96\">#60ffffff</color>\n    <color name=\"yellow_100\">#fff9c4</color>\n    <color name=\"yellow_200\">#fff59d</color>\n    <color name=\"yellow_300\">#fff176</color>\n    <color name=\"yellow_400\">#ffee58</color>\n    <color name=\"yellow_50\">#fffde7</color>\n    <color name=\"yellow_500\">#ffeb3b</color>\n    <color name=\"yellow_600\">#fdd835</color>\n    <color name=\"yellow_700\">#fbc02d</color>\n    <color name=\"yellow_800\">#f9a825</color>\n    <color name=\"yellow_900\">#f57f17</color>\n    <color name=\"yellow_a100\">#ffff8d</color>\n    <color name=\"yellow_a200\">#ffff00</color>\n    <color name=\"yellow_a400\">#ffea00</color>\n    <color name=\"yellow_a700\">#ffd600</color>\n    <dimen name=\"font_10\">10sp</dimen>\n    <dimen name=\"font_112\">112sp</dimen>\n    <dimen name=\"font_12\">12sp</dimen>\n    <dimen name=\"font_14\">14sp</dimen>\n    <dimen name=\"font_16\">16sp</dimen>\n    <dimen name=\"font_18\">18sp</dimen>\n    <dimen name=\"font_20\">20sp</dimen>\n    <dimen name=\"font_22\">22sp</dimen>\n    <dimen name=\"font_24\">24sp</dimen>\n    <dimen name=\"font_28\">28sp</dimen>\n    <dimen name=\"font_32\">32sp</dimen>\n    <dimen name=\"font_34\">34sp</dimen>\n    <dimen name=\"font_38\">38sp</dimen>\n    <dimen name=\"font_4\">4sp</dimen>\n    <dimen name=\"font_44\">44sp</dimen>\n    <dimen name=\"font_56\">56sp</dimen>\n    <dimen name=\"font_6\">6sp</dimen>\n    <dimen name=\"font_8\">8sp</dimen>\n    <dimen name=\"len_10\">10dp</dimen>\n    <dimen name=\"len_100\">100dp</dimen>\n    <dimen name=\"len_116\">116dp</dimen>\n    <dimen name=\"len_12\">12dp</dimen>\n    <dimen name=\"len_128\">128dp</dimen>\n    <dimen name=\"len_14\">14dp</dimen>\n    <dimen name=\"len_156\">156dp</dimen>\n    <dimen name=\"len_16\">16dp</dimen>\n    <dimen name=\"len_172\">172dp</dimen>\n    <dimen name=\"len_2\">2dp</dimen>\n    <dimen name=\"len_20\">20dp</dimen>\n    <dimen name=\"len_224\">224dp</dimen>\n    <dimen name=\"len_24\">24dp</dimen>\n    <dimen name=\"len_256\">256dp</dimen>\n    <dimen name=\"len_28\">28dp</dimen>\n    <dimen name=\"len_32\">32dp</dimen>\n    <dimen name=\"len_36\">36dp</dimen>\n    <dimen name=\"len_4\">4dp</dimen>\n    <dimen name=\"len_40\">40dp</dimen>\n    <dimen name=\"len_44\">44dp</dimen>\n    <dimen name=\"len_48\">48dp</dimen>\n    <dimen name=\"len_52\">52dp</dimen>\n    <dimen name=\"len_56\">56dp</dimen>\n    <dimen name=\"len_6\">6dp</dimen>\n    <dimen name=\"len_60\">60dp</dimen>\n    <dimen name=\"len_64\">64dp</dimen>\n    <dimen name=\"len_68\">68dp</dimen>\n    <dimen name=\"len_72\">72dp</dimen>\n    <dimen name=\"len_76\">76dp</dimen>\n    <dimen name=\"len_8\">8dp</dimen>\n    <dimen name=\"len_80\">80dp</dimen>\n    <dimen name=\"len_84\">84dp</dimen>\n    <dimen name=\"len_88\">88dp</dimen>\n    <dimen name=\"len_92\">92dp</dimen>\n    <dimen name=\"len_96\">96dp</dimen>\n</resources>"
  },
  {
    "path": "skinLibrary/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">SkinLibrary</string>\n    <string-array name=\"theme_name\">\n        <item>少女粉</item>\n        <item>夜间模式</item>\n        <item>姨妈红</item>\n        <item>咸蛋黄</item>\n        <item>早苗绿</item>\n        <item>胖次蓝</item>\n        <item>基佬紫</item>\n    </string-array>\n    <string-array name=\"theme_tag\">\n        <item>pink300</item>\n        <item>black</item>\n        <item>red300</item>\n        <item>orange300</item>\n        <item>green300</item>\n        <item>lightBlue300</item>\n        <item>deepPurple300</item>\n    </string-array>\n    <string-array name=\"theme_color\">\n        <item>@color/colorPrimary_default</item>\n        <item>@color/black</item>\n        <item>@color/colorPrimary_red300</item>\n        <item>@color/colorPrimary_orange300</item>\n        <item>@color/colorPrimary_green300</item>\n        <item>@color/colorPrimary_lightBlue300</item>\n        <item>@color/colorPrimary_deepPurple300</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "skinLibrary/src/test/java/com/lingxiao/skinlibrary/ExampleUnitTest.java",
    "content": "package com.lingxiao.skinlibrary;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() {\n        assertEquals(4, 2 + 2);\n    }\n}"
  }
]