Add adb_install action

I made this action as part of a talk on Fastlane for Android.
Is this interesting to anybody for submission to mainline ?
Note: It depends on the ruby_apk gem.
      def self.description
        "Install a specified APK (+ OBB) on the connected device"
      end

Example usage:
      adb_devices.each  do | device |
        install_info = adb_install(apk: File.expand_path(Dir["target/*.apk"].first),
                                   serial: device.serial)
        notification(subtitle: "Installed package #{install_info[:package_name]}",
                     message: "Onto #{device.serial}")
      end

Full code:
require 'ruby_apk'

module Fastlane
  module Actions
    module SharedValues
      ADB_INSTALL_INFO = :ADB_INSTALL_INFO
    end

    class AdbInstallAction < Action
      def self.run(params)
        @params = params

        find_first_device_serial

        info = install_apk

        UI.message("Installation complete: #{info}")

        Actions.lane_context[SharedValues::ADB_INSTALL_INFO] = info
      end

      #####################################################
      # @!group Documentation
      #####################################################

      def self.description
        "Install a specified APK (+ OBB) on the connected device"
      end

      def self.details
        "Installs the APK and places the OBB file under the expected location as to allow manual testing"
      end

      def self.available_options
        [
          FastlaneCore::ConfigItem.new(key: :apk,
                                       env_name: "FL_ADB_INSTALL_APK", # The name of the environment variable
                                       description: "The path to the APK", # a short description of this parameter
                                       verify_block: proc do |value|
                                         UI.user_error!("Could not find apk file at path '#{value}'") unless File.exist?(value)
                                         begin
                                           apk = Android::Apk.new(value)
                                         rescue => e
                                           UI.user_error!("apk file at '#{value}' couldn't be read: #{e.message}")
                                         end
                                       end),
          FastlaneCore::ConfigItem.new(key: :adb_path,
                                       env_name: "FL_ADB_PATH",
                                       description: "The path to your `adb` binary",
                                       is_string: true,
                                       optional: true,
                                       default_value: "adb"
                                      ),
          FastlaneCore::ConfigItem.new(key: :serial,
                                       env_name: "FL_ANDROID_SERIAL",
                                       description: "Android serial, which device should be used for this command",
                                       optional: true,
                                       is_string: true,
                                       default_value: nil),
        ]
      end

      def self.find_first_device_serial
        @serial = @params[:serial]
        return unless @serial.nil?

        UI.message("Device serial not set, searching for it...")
        devices = adb.load_all_devices
        UI.user_error!("No device connected") if devices.count == 0
        UI.warning("More than one device connected! Using 'first' one") if devices.count > 1
        @serial = devices.first.serial
      end

      def self.output
        [
          ['ADB_INSTALL_INFO', 'A Hash representation of the operation']
        ]
      end

      def self.return_value
        "a Hash representation of the package installation"
      end

      def self.authors
        ["lacostej"]
      end

      def self.is_supported?(platform)
        platform == :android
      end

      private

      def self.adb
        @adb ||= Helper::AdbHelper.new(adb_path: @params[:adb_path])
      end

      # inspired by https://github.com/fastlane/fastlane/blob/master/supply/lib/supply/uploader.rb
      def self.install_apk
        apk_path = @params[:apk]
        apk = Android::Apk.new(apk_path)
        manifest = apk.manifest
        package_name = manifest.package_name
        apk_version_code = manifest.version_code

        adb_run("install -r #{apk_path}")
        obbs = install_obbs(apk_path, package_name, apk_version_code)

        # the returned info
        {
          device_serial: @serial,
          package_name: package_name,
          package_path: apk_path,
          version_code: apk_version_code,
          obbs: obbs
        }
      end

      def self.install_obbs(apk_path, package_name, apk_version_code)
        adb_run("shell mkdir -p /sdcard/Android/obb/#{package_name}/")
        adb_run("shell rm -r /sdcard/Android/obb/#{package_name}/*")

        expansion_paths = find_obbs(apk_path)
        ['main', 'patch'].each do |type|
          if expansion_paths[type]
            install_obb(expansion_paths[type], package_name, type, apk_version_code)
          end
        end
        expansion_paths
      end

      # @return a map of the obb paths for that apk
      # keyed by their detected expansion file type
      # E.g.
      # { 'main' => 'path/to/main.obb', 'patch' => 'path/to/patch.obb' }
      def self.find_obbs(apk_path)
        search = File.join(File.dirname(apk_path), '*.obb')
        paths = Dir.glob(search, File::FNM_CASEFOLD)
        expansion_paths = {}
        paths.each do |path|
          type = obb_expansion_file_type(path)
          next unless type
          if expansion_paths[type]
            UI.important("Can only upload one '#{type}' apk expansion. Skipping obb upload entirely.")
            UI.important("If you'd like this to work differently, please submit an issue.")
            return {}
          end
          expansion_paths[type] = path
        end
        expansion_paths
      end

      def self.install_obb(obb_path, package_name, expansion_file_type, apk_version_code)
        obb_dir = "/sdcard/Android/obb/#{package_name}"
        obb_filename = "#{expansion_file_type}.#{apk_version_code}.#{package_name}.obb"
        obb_target_path = "#{obb_dir}/#{obb_filename}"

        UI.message("Instaling obb file to #{obb_target_path}...")
        adb_run("push #{obb_path} #{obb_target_path}")
      end

      def self.obb_expansion_file_type(obb_file_path)
        filename = File.basename(obb_file_path, ".obb")
        if filename.include?('main')
          'main'
        elsif filename.include?('patch')
          'patch'
        end
      end

      def self.adb_run(command)
        adb.trigger(command: command, serial: @serial)
      end
    end
  end
end

@lacostej Thanks for opening an issue to discuss this prior to implementation! I love that you're adding new Android tools! :heart_eyes:
I think we'd prefer to not add additional 3rd party dependencies if possible. ruby_apk looks like it hasn't been updated in 2.5 years which is a little worrisome. Can you enumerate what behavior it uses from ruby_apk? Is it possible to borrow the desired functionality and bring it directly into fastlane?
Also, it is possible to refactor some of the .obb aware code into something in fastlane_core that both this action and supply could be aware of?
I'd also love to hear from the rest of the fastlane Android community about how this could be integrated into their use cases :loudspeaker:

@asfalcone the reason I didn't submit it as a PR is because of the extra dependency. ruby_apk allows me to introspect the APK's manifest and identify information needed to install the obb in the correct location. I wouldn't feel to import its code into the action.
A for the obb aware, I would have to think about it.  2 methods can definitively be reused.
I'll try to think of a way to make this available in some way.

Hey @lacostej! I think this would be a great candidate for a plugin in the new infrastructure we are working on. If you don't mind, I am going to close this for now and we can discuss how to get it built as a plugin once those changes are released?!

The plugin system is ready to be used: Get started with plugins  🚀


Criteria idea: Accessible to those who understand English

I had a discussion with others today about the need to make sure that people can participate from a variety of places and cultures.  A criterion that just said, "don't create place/culture barriers" isn't very actionable or measurable.
However, it would be possible to include, "The project MUST be accessible to those who understand the English language."
It's difficult for people to work together without at least one common natural language, and in FLOSS projects today that common language is English.  Indeed, in technology circles English is the linga franca.  This doesn't require that anyone be a native speaker, just that if you know English you should be able to participate.  For an example, witness all the effort that the LibreOffice people have put in to translate the comments from German into English.  Supporting English enables more people worldwide to participate.
This potential criterion may be controversial.  That's okay, my goal is to get ideas out there for discussion.  Perhaps this is a bad idea, or one that should only be at higher levels.  Please discuss!

wow, this could be very controversial, especially is developing a project
that is specific to a particular country or ethnic group.  the first
theoretical problem that comes to mind is a project that is aiming to help
with indigenous languages having this requirement forced on them - ouch!
Here's my take:

maybe rather than focus on the languages creating barriers, we should
focus on the project having some type statement on how they create an
inclusive culture.

this could be provided as a URL
Maybe included in something like the CONTRIBUTING file
or maybe something like a CULTURE file at the root of each project
becomes the norm.
wouldn't that be lovely an MIT CULTURE standard, a GPLv2 CULTURE
standard......

if language is chosen as de-facto for culture then you're likely to
automatically exclude projects in non-english countries, maybe you'd want
to include "the project SHOULD define a primary
(spoken/written/non-programming) language for communicating about the
project".
That said, I'm not keen on defining language as the way to create an
inclusive culture

On a language-related I learned earlier about https://www.transifex.com which
can be used to help translate projects to other languages,  maybe it's
something that could be considered to internationalise our project in the
future - FLOSS projects don't have to pay.
Alton(ius)
On Fri, 26 Feb 2016 at 11:09 David A. Wheeler<EMAIL_ADDRESS>wrote:

I had a discussion with others today about the need to make sure that
people can participate from a variety of places and cultures. A criterion
that just said, "don't create place/culture barriers" isn't very actionable
or measurable.
However, it would be possible to include, "The project MUST be
accessible to those who understand the English language."
It's difficult for people to work together without at least one common
natural language, and in FLOSS projects today that common language is
English. Indeed, in technology circles English is the linga franca. This
doesn't require that anyone be a native speaker, just that if you know
English you should be able to participate. For an example, witness all the
effort that the LibreOffice people have put in to translate the comments
from German into English. Supporting English enables more people worldwide
to participate.
This potential criterion may be controversial. That's okay, my goal is to
get ideas out there for discussion. Perhaps this is a bad idea, or one
that should only be at higher levels. Please discuss!
—
Reply to this email directly or view it on GitHub
https://github.com/linuxfoundation/cii-best-practices-badge/issues/230.

The goal would be to absolutely not prevent participation or support for a particular language group - it would be to enable others to participate.  But it's a fair point that some projects only apply to a particular language group, and thus, imposing such a criterion might inhibit appropriate contributions.  You noted that you're "not keen on defining language...", got it.
I did note that this "may be controversial".  However, I'd rather have that controversy out in the open.  I'm a big believer in brainstorming - put out ideas, even if there are problems.  Maybe the problems can be solved, and maybe the problems make the idea unworkable.  But we're more likely to get a better list if we can more openly discuss ideas.
You mentioned some alternatives, but I don't think they help.  First, there's no need to ask organizations to "define a primary (spoken/written/non-programming) language for communicating about the project"."  One look at a project's website will tell you that :-).
I'm hesitant of trying to make some sort of general statement about how a project creates "an inclusive culture".  There are projects and organizations that formally document how they do this, but I don't think there's consensus about it, what it means, or even that it's necessarily a good thing (whatever "it" is).  In general the "best practices" criteria try to identify generally-accepted criteria, and I'm skeptical we can get truly generally-accepted general criteria that would be worth it.  Pretty much no one today has a CULTURE file, so it's hard to argue that this is a generally-accepted practice today.  Many projects simply focus on the code and documentation, and how to contribute to them, and in many respects that kind of focus solves a lot.  If you focus on the problem, then it's not hard to be grateful for help (when it's actually help).  But it's not clear that can be put into a useful criterion.
I'd really like to focus on specific criteria we can measure relatively unambiguously and that are currently generally accepted as good things.  "Presence of English" is relatively easy to measure unambiguously.  Of course, if it's not generally accepted as a good thing, then let's drop it.  There are lots of ideas that get dropped after discussion :-).
I guess I'm currently leaning against this criterion now, but I can be swayed...!

I will register in support of the criterion. We could modify it to say,
"Whatever the primary language of the core developers may be, the project
should include documentation and be able to accept bug reports and code
comments in English, since English is currently the lingua franca of
technology." I would also make lingua franca a link:
https://en.wikipedia.org/wiki/Lingua_franca
--
Dan Kohn<EMAIL_ADDRESS>Senior Advisor, Core Infrastructure Initiative
tel:+1-415-233-1000
On Fri, Feb 26, 2016 at 10:12 AM, David A. Wheeler<EMAIL_ADDRESS>
wrote:

The goal would be to absolutely not prevent participation or support
for a particular language group - it would be to enable others to
participate. But it's a fair point that some projects only apply to a
particular language group, and thus, imposing such a criterion might
inhibit appropriate contributions. You noted that you're "not keen on
defining language...", got it.
I did note that this "may be controversial". However, I'd rather have that
controversy out in the open. I'm a big believer in brainstorming - put out
ideas, even if there are problems. Maybe the problems can be solved, and
maybe the problems make the idea unworkable. But we're more likely to get a
better list if we can more openly discuss ideas.
You mentioned some alternatives, but I don't think they help. First,
there's no need to ask organizations to "define a primary
(spoken/written/non-programming) language for communicating about the
project"." One look at a project's website will tell you that :-).
I'm hesitant of trying to make some sort of general statement about how a
project creates "an inclusive culture". There are projects and
organizations that formally document how they do this, but I don't think
there's consensus about it, what it means, or even that it's necessarily a
good thing (whatever "it" is). In general the "best practices" criteria try
to identify generally-accepted criteria, and I'm skeptical we can get truly
generally-accepted general criteria that would be worth it. Pretty much no
one today has a CULTURE file, so it's hard to argue that this is a
generally-accepted practice today. Many projects simply focus on the code
and documentation, and how to contribute to them, and in many respects that
kind of focus solves a lot. If you focus on the problem, then it's not hard
to be grateful for help (when it's actually help). But it's not clear that
can be put into a useful criterion.
I'd really like to focus on specific criteria we can measure relatively
unambiguously and that are currently generally accepted as good
things. "Presence of English" is relatively easy to measure unambiguously.
Of course, if it's not generally accepted as a good thing, then let's drop
it. There are lots of ideas that get dropped after discussion :-).
I guess I'm currently leaning against this criterion now, but I can be
swayed...!
—
Reply to this email directly or view it on GitHub
https://github.com/linuxfoundation/cii-best-practices-badge/issues/230#issuecomment-189317917
.

Ok, dropping it down to SHOULD makes sense. The MUST and SHOULD criteria are normally worded as "The project MUST|SHOULD...", so let's use that consistent pattern unless there's a reason we shouldn't.  Also, we should put details and rationale in later sentences, so that people can hide them.  Finally, instead of "code comments" how about "comments about code"; while I think it's wisest to have comments embedded in code use English, I think the bigger point is that comments about code should be accepted if they're in English.
How about this?:
The project SHOULD include documentation in English and be able to accept bug reports and comments about code in English.  English is currently the lingua franca of computer technology; supporting English increases the number of different potential developers and reviewers.  A project can meet this criterion even if its core developers' primary language is not English.

I like this but I think we should move it back to MUST. I'm not aware of
projects that would even be close to qualifying for the badge but wouldn't
because of this requirement.
--
Dan Kohn<EMAIL_ADDRESS>Senior Advisor, Core Infrastructure Initiative
tel:+1-415-233-1000
On Fri, Feb 26, 2016 at 1:16 PM, David A. Wheeler<EMAIL_ADDRESS>wrote:

Ok, dropping it down to SHOULD makes sense. The MUST and SHOULD criteria
are normally worded as "The project MUST|SHOULD...", so let's use that
consistent pattern unless there's a reason we shouldn't. Also, we should
put details and rationale in later sentences, so that people can hide them.
Finally, instead of "code comments" how about "comments about code"; while
I think it's wisest to have comments embedded in code use English, I
think the bigger point is that comments about code should be accepted
if they're in English.
How about this?:
The project SHOULD include documentation in English and be able to accept
bug reports and comments about code in English. English is currently the lingua
franca https://en.wikipedia.org/wiki/Lingua_franca of computer
technology; supporting English increases the number of different potential
developers and reviewers. A project can meet this criterion even if its
core developers' primary language is not English.
—
Reply to this email directly or view it on GitHub
https://github.com/linuxfoundation/cii-best-practices-badge/issues/230#issuecomment-189407509
.

I was agreeing with you that it could be controversial and was playing
devils advocate.  like you, I'm a fan of having the discussion openly
(though we possibly have some self-selection bias with this criteria as
anyone who can't communicate in english is already excluded from this
discussion :-) )
Back to reality now (instead of my own overly lofty hypotheticals) - I like
the proposed criteria and the rationale behind the criteria, and I'm voting
for it being a SHOULD criteria, it gives current and future projects that
we may not be aware of the opportunity to provide the rationale and still
meet best-practices.
I'd much rather a project fail to achieve a badge due to bad coding or
security practices instead of the language(s) it uses for communicating.
Alton(ius)
On Sat, 27 Feb 2016 at 05:28 Dan Kohn<EMAIL_ADDRESS>wrote:

I like this but I think we should move it back to MUST. I'm not aware of
projects that would even be close to qualifying for the badge but wouldn't
because of this requirement.
--
Dan Kohn<EMAIL_ADDRESS>Senior Advisor, Core Infrastructure Initiative
tel:+1-415-233-1000
On Fri, Feb 26, 2016 at 1:16 PM, David A. Wheeler <
<EMAIL_ADDRESS>wrote:

Ok, dropping it down to SHOULD makes sense. The MUST and SHOULD criteria
are normally worded as "The project MUST|SHOULD...", so let's use that
consistent pattern unless there's a reason we shouldn't. Also, we should
put details and rationale in later sentences, so that people can hide
them.
Finally, instead of "code comments" how about "comments about code";
while
I think it's wisest to have comments embedded in code use English, I
think the bigger point is that comments about code should be accepted
if they're in English.
How about this?:
The project SHOULD include documentation in English and be able to accept
bug reports and comments about code in English. English is currently the
lingua
franca https://en.wikipedia.org/wiki/Lingua_franca of computer
technology; supporting English increases the number of different
potential
developers and reviewers. A project can meet this criterion even if its
core developers' primary language is not English.
—
Reply to this email directly or view it on GitHub
<
https://github.com/linuxfoundation/cii-best-practices-badge/issues/230#issuecomment-189407509
.

—
Reply to this email directly or view it on GitHub
https://github.com/linuxfoundation/cii-best-practices-badge/issues/230#issuecomment-189413152
.

Let's add this as a SHOULD to start.  We can change the category later, and putting it in the main text will get more visibility.  In general I've tried to emphasize best practices that an individual developer could do with some non-Herculean effort.  Learning an entire natural language is a big step higher.  We could say for the latter (or at least English with a restricted vocabulary).   See special english or the xkcd stuff with the top ten hundred words.

Here's a tweaked version, currently SHOULD, but mentioning use of a Simple English and adding the word "worldwide" (which hopefully helps readers realize the issue is simply that English is known around the world).
The project SHOULD include documentation in English and be able to accept bug reports and comments about code in English (at least some form of Simple English).  English is currently the lingua franca of computer technology; supporting English increases the number of different potential developers and reviewers worldwide.  A project can meet this criterion even if its core developers' primary language is not English.

I would remove the Simple English parenthetical, since it doesn't lead to a
clear Wikipedia page.
--
Dan Kohn<EMAIL_ADDRESS>Senior Advisor, Core Infrastructure Initiative
tel:+1-415-233-1000
On Sat, Feb 27, 2016 at 2:49 PM, David A. Wheeler<EMAIL_ADDRESS>wrote:

Here's a tweaked version, currently SHOULD, but mentioning use of a Simple
English and adding the word "worldwide" (which hopefully helps readers
realize the issue is simply that English is known around the world).
The project SHOULD include documentation in English and be able to accept
bug reports and comments about code in English (at least some form of Simple
English https://en.wikipedia.org/wiki/Simple_English). English is
currently the lingua franca https://en.wikipedia.org/wiki/Lingua_franca
of computer technology; supporting English increases the number of
different potential developers and reviewers worldwide. A project can meet
this criterion even if its core developers' primary language is not English.
—
Reply to this email directly or view it on GitHub
https://github.com/linuxfoundation/cii-best-practices-badge/issues/230#issuecomment-189713867
.

Ok, will remove parenthetical about Simple English.

This is resolved by commit b7dd4f2f39ee8545ce002d5b2cd6584b33e3f484

Requiring English may work in practice, but is discriminatory and leaves a bad taste. English is not the only vehicular language used in practice by online communities (for instance there are groups of speakers of Italian, Portuguese and Spanish who interact each using their own language) and English monolinguals should not be favoured over other monolinguals.
If non-native speakers of English are forced to make an effort to speak English, an equal effort should be required from native speakers, e.g. by mandating the existence of (open) processes to translate software and documentation.

This is very much worth discussing, thanks for your comments. I do think the current criterion makes sense, but dialogue is always an excellent idea.  Please allow me to expand further (beyond the text above).
English is no better nor worse than any other natural language.  I'm all for people learning and using many natural languages.  I studied French (and can still read technical French), when I was young I spoke German (I lived there for years), and I've also studied Greek, Portuguese, and American Sign Language.  I think it's sad that so many languages around the world are disappearing.
However, if people across the world are going to work together, they need to have some way to communicate.  It's not reasonable to require that all people learn all languages. If there's a group of developers that can only communicate in Spanish, they will exclude the larger community of people who cannot speak Spanish.  Any language decision will exclude someone - so how can we minimize those who are excluded?
Today, it's typically a given that the language for international communication is English.  For example,  The International Civil Aviation Organisation (ICAO) has established English language proficiency requirements (LPRs) for all pilots operating on international routes, and all air traffic controllers who communicate with foreign pilots.; "These standards require pilots and air traffic controllers to be able to communicate proficiently using both ICAO phraseology and plain English."
Wikipedia's list of languages by total number of speakers makes it clear why this is the case.  The languages with the most number of speakers (at either L1 or L2 levels) are:
Language Total
English 1,500 million
Mandarin Chinese 1,090 million
Spanish 560 million
Hindustani (Hindi-Urdu) 541 million
Arabic 395 million
Russian 260 million
Malay 250 million
Portuguese 250 million
French 220 million
German 210 million
The EU officially supports 24 languages, but even with hundreds of millions of Euros spent on translation the EU can't keep up. In practice, most EU institutions use English as their working language. If a group only speaks Spanish, they can only reach 1/3 as many people as English (and in practice even less, since it's typically easy to find at least some English speakers in nearly every city in the world).
OSS projects typically don't have the EU's translation budget, so English is an even more common feature in the OSS community.  LibreOffice, for example, has been working hard to translate its comments from German to English:
https://wiki.documentfoundation.org/Development/Easy_Hacks/Translation_Of_Comments
https://bugs.documentfoundation.org/show_bug.cgi?id=39468
Linus Torvalds' native language is Swedish, and he also knows Finnish and English - but kernel development has always been in English.

an equal effort should be required from native speakers, e.g. by mandating the existence of (open) processes to translate software and documentation.

Do you have specific criteria text to propose?  One challenge is that projects handle this in different ways; in some cases the documentation is actually a separate project, so that might be hard to mandate.
I certainly agree that software intended primary for end-users should be internationalized and support localization.  However, if the software's primary purpose is to be a library for other developers, many library developers would expect that the software developers will learn English.  Then nobody has to translate billions of pages into thousands of languages.  After all, anyone can learn English; it's not proprietary.  Clearly that is not an outcome that would make monolinguists of other languages happy, but the economics of trying to translate everything for everyone is difficult to justify in many cases.  Indeed, for a number of projects, development velocity is the most important factor to optimize for; anything that slows development (like requiring translations or copyright transfers) is dangerous to the project since it would make the project uncompetitive.
There is a potential radical change: Continued improvements in freely-available machine translation.  I'm quite aware that current machine translations leave a lot to be desired.  That said, if you limit yourself to simple grammatical structures, and avoid slang and idiomatic phrases, they are already good enough for very simple constructs.  If machine translation continues to improve, to the point where people are happy to turn on "auto translate" (or whatever) in their browser and text editor, then there may be no need for a common language.  The goal isn't 1 language, it's simply to enable widespread communication.
So, what do you suggest?  Adding something?  Dropping it?

If we were talking about a company, it makes total sense to agree on a common language to increase productivity, because that is what earns them money and that's what companies do.
But open source is not a company and I highly contest producing code at highest possible rate is what should be optimized.
English does not need any more help to stay as the lingua franca of technology. The other languages do need support so that software development does not become more of a monoculture. What I think we should be looking for is an inclusive culture. This partially overlaps with Code of Conduct and similar constructs that disallow bad behavior and discrimination.
In practice this would mean, for example, that if someone posts a bug report in Russian, they developers would try to  understand it via machine translation before telling the reporter just to go away; or not ignoring the message of a person who writes in really bad English. Some larger projects can have volunteers that can help in translating, but of course smaller projects do not have this luxury.
Having code comments in English or at least in one language only would in my opinion fall in the category of having a coding style guideline and enforcing it.
I believe we are not actually disagreeing on the goal of widespread communication. But there seems to be an unmentioned assumption whether the focus should be on making if easier for those already inside in the ecosystem, or whether the focus should be to accommodate the people who we are currently inadvertently excluding.
The (possibility of) localisation of open source projects has been their strength, and can be considered as a best practice. It would be weird then if we had the opposite best practice for developmental activity. In conclusion, I think enforcing English is not the way we should take and I propose dropping this criteria until we find something better.

Another way to look at what I said earlier, i.e. that being a native or near-native English speaker doesn't mean one speaks effective English. https://medium.com/@mollyclare/taming-the-steamroller-how-to-communicate-compassionately-with-non-native-english-speakers-d95d8d1845a0
A multilingual mindset, if not actual multilingualism, is required from anyone to communicate effectively in an online community. A monolingual English speaker can make online written conversation harder than someone with a very bad English.

I LOVE the idea of requiring English for any OSS project that doesn't pertain to a specific language, and it boggles my mind how people continue to post in Russian or German or whatever the language of some of the contributors happens to be :-1:

The other languages do need support so that software development does not become more of a monoculture.

A culture comprises much more than language. Language, here, is just a means of communicating ideas. A standard like TCP or HTTP. Let's be specific. Having all sorts of weirdo networking standards (anyone remember IPX/SPX?) has not helped progress in sharing knowledge. Using more than one language doesn't help either:

having multiple languages in one project draws artificial language barriers
it encourages those who believe* they don't speak English well, to continue to stay silo-ed in their language
it massively increases the risk of duplicating questions (e.g. on support forums) because those who search for the question likely won't find answers written in other languages
it reduces the pool of people who could help the question asker to those who understand their language, or who bother to machine translate it

if someone posts a bug report in Russian, they developers would try to understand it via machine translation before telling the reporter just to go away

How about suggesting to the Russian speaker to use machine translation in the first place? That way, they spend time translating once, instead of each person who reads the bug report translating it.

It is quite well-known that the vast majority of Germans speak English very well, but many are afraid to do so for fear of committing some mistake. They thus favor German, which leads to the consequences I've mentioned above.

For more on this topic, please refer to this extensive essay I wrote on sticking to one language as a standard for communication. Jeff Atwood also wrote an excellent essay about English and programming specifically.

Dan Dascalescu, 09/08/2018 08:31:

it boggles my mind how people continue to post in Russian or German or
whatever the language of some of the contributors happens to be 👎

I don't understand, was this sarcastic?

I don't understand, was this sarcastic?

It was not. I'm genuinely puzzled by programmers who just seem to not notice what the prevalent language used in an online programming community (a repo, forum etc.) is.
That's like showing up to a meeting at someone's house, ignoring the fact that all attendees have left their shoes at the door, and walking in wearing your favorite shoes. Might be a form of dyslexia? I have no idea. Today I saw a Chinese user posting a question in an English repo, just like that. Not even with an apology that they don't speak English, or weren't able to use Google Translate (which is available in China. :confused:

Dan Dascalescu, 12/08/2018 03:48:

It was not. I'm genuinely puzzled by programmers who just seem to not
notice what the prevalent language used in an online programming
community (a repo, forum etc.) is.

It's extremely discriminatory to think that everyone must talk English
and that if they don't they must have problems grasping reality. Someone
can be good at doing what they do even without having a good knowledge
of English.
The most appropriate language in which to develop a software is that
which works best for most of its developers and target users, which
cannot be blindly assumed to be English.

@simontseng

I do suspect maybe this guy entered the Chinese title while browsing under some kind page translation program, think everything is in Chinese
I wouldn’t be surprised

I really doubt that, for two reasons:

Every web page translation software I've seen is pretty obvious, through a UI affordance (translation bar, pop-up prompt etc), and through the slightly broken translation it provides.

The repo where I saw that user post a question in Chinese, is a private one. It requires registration involving sending a signed PDF form, in English. Everything about the repo, its site, wiki (which is required reading before posting an issue) is in English.

@nemobis

It's extremely discriminatory to think that everyone must talk English
and that if they don't they must have problems grasping reality.

Pleas re-read my post, because that's not what I said. Let me further clarify what I'm saying:
If you want help from an online community that predominantly uses a particular language, then it is in your best interest to use that language. It will not only show respect, but will maximize the chances of getting help.
Note that this is vastly followed in practice. Moreover, many of the most prolific contributors on GitHub are not native English speakers, yet they publish in English, I guess in order to get the widest exposure and PRs, but also to not discriminate by using their native tongue. Whether you like it or not, English is the lingua franca of software development.
Anyway, let's have a look at https://git.io/top:

out of the top 10 contributors, half are likely non-native Speakers
every single pinned repo of the top 10 contributors is in English
@egoist is Chinese and @HugoGiraudel is a diversity advocate. Both publish in English.

I'm all for being inclusive. But when I'm on a mostly-English software forum or repo and I see threads in a language I don't understand, I feel excluded (if not discriminated against). It may be cute to post a question in the language of one of the contributors, but it's immature. I know I've been tempted to do the same, but I've limited myself to replacing "Hi" with the Romanian "Salut" as a head nod to a compadre, because posting the entire issue in Romanian wouldn't help anyone else. We're on GitHub to share code and knowledge.
I also see posting the question in the language of the repo as a sign of respect. FLOSS authors put considerable effort into providing free software. if you want help, the least you can do is to ask your question in the language of that community. @nemobis, would you go post an issue in Italian or Finnish in one of @IonicaBizau's repos? If not, why not?
Also, there's a finer note on this language/respect thing: in my 9+ years or using and contributing to OSS projects on GitHub, I have never, not once, seen a PR to an English repo authored in a non-English language. I have only seen questions asked in other languages. That says something.
We want to be inclusive. Upon whom should the burden of translating such questions fall? Do we wait for contributors who speak that language to answer the question? What if none of them speak it? Do we use machine translation and answer back in the original language? Why exactly shouldn't the asker spend that bit of effort and use the translation software? Is it too much for us providers of free software and free consultations to ask for one minute of the asker's time to make their question (and our answer) intelligible to all? We want to be inclusive after all. Shouldn't that "we" include the asker?
Keep in mind that time is money. Apples to apples, support for, say, a charting library can be valued at $175/hour, or can be provided for free, as is the case with Highcharts, whose Norway-based team has been doing so since 2009. If you think about the costs involved, demanding that a FLOSS developer answer your question in your mother tongue, is the equivalent of both begging for money, and hoarding, because your question isn't searchable by speakers of any other language, so the developer will have to provide the answer again when the same question gets asked.
I hope this makes my point clearer. And just to be extra clear, I'm not advocating for any particular language to be the lingua franca of all repos. Just as we use one prettyfying standard or another, the point is to stick to it. If you want help with some Chinese-only widget, by all means, use Chinese. But pick one most appropriate language for the repo, and have that be as standard as the coding language(s) used. Would you accept a PR in Python to a C repo?

Someone can be good at doing what they do even without having a good knowledge of English.

That's true for many fields, but less often the case for programming. StackOverflow founder Jeff Atwood wrote an excellent essay about this topic.


Can't Delete Posts

Right now the only way to delete a post is via the Django admin. It would be nice to have a button in the posting interface to delete posts.

Is the IndieWeb portion of this implemented already -- just a case of adding a new button for admins?

@hirusi No the IndieWeb portion of this is not implemented yet. I had forgotten about that aspect of it. Thank you for the reminder.
From the specs:

3.1.5 Sending Webmentions for deleted posts
If the source URL was deleted, the sender SHOULD return an HTTP 410 Gone status code for the URL, and SHOULD display a "tombstone" representation of the deleted post, typically by blanking out the values of any properties in the post, and/or replacing the primary content of the post (e.g. the name and/or content of [h-entry]) with "Deleted". The sender SHOULD then re-send Webmentions for every previously sent Webmention for that document.
This allows receivers which may have displayed a previously received Webmention as a comment or other interaction to remove it from view if they support deletes, while providing a reasonable fallback for receivers which only support updates.

There is a base delete view in entry.views.pystatus_delete that just needs a button hooked up to it. It should also only work on Post (so maybe worth converting from a function based view to django's DeleteView, so we'd also get the confirmation step for free).
To handle the webmention sends, I think I need to add a nullable deleted_at timestamp to TPost. Then I can modify the views in public/views to return a 410 GONE status code for deleted posts. Also need to confirm that these deleted posts wouldn't appear in RSS feeds any longer, too.

Also need to confirm that these deleted posts wouldn't appear in RSS feeds any longer, too.

Most likely we have no control over it? If someone has the feed item content, they have it. Doubt feed readers are fetching updates. (?)
As for when someone new subscribes to the RSS feed, I think IndieWeb is not prescriptive on that. Keep in mind RSS is a separate standard that technically has nothing to do with the IndieWeb specs that we are using. We can just remove it from the feed altogether imo for new subscribers.

Usually the RSS part is completely separate and is generated from what is published/everyone.
so if an item gets removed, it should be removed from RSS directly.


Create a 'Matrix' question type in edsl

Qualtrics has the notion of a 'Matrix' question. It's essentially a collection of multiple choice questions with the same question options. It looks like this:

Here is what this kind of question looks like in QSF format:
{
    'SurveyID': 'SV_0d42inEvO5IX7gi',
    'Element': 'SQ',
    'PrimaryAttribute': 'QID88',
    'SecondaryAttribute': 'In general when you are shopping for products, to what extent do you agree with the following sta...',
    'TertiaryAttribute': None,
    'Payload': {
        'QuestionText': 'In general when you are shopping for products, to what extent do you agree with the following statements?',
        'DefaultChoices': False,
        'DataExportTag': 'PriceSensitivity',
        'QuestionType': 'Matrix',
        'Selector': 'Likert',
        'SubSelector': 'SingleAnswer',
        'DataVisibility': {
            'Private': False,
            'Hidden': False
        },
        'Configuration': {
            'QuestionDescriptionOption': 'UseText',
            'TextPosition': 'inline',
            'ChoiceColumnWidthPixels': 328,
            'RepeatHeaders': 'none',
            'WhiteSpace': 'OFF',
            'MobileFirst': True
        },
        'QuestionDescription': 'In general when you are shopping for products, to what extent do you agree with the following sta...',
        'Choices': {
            '1': {'Display': 'I will only buy products when they are on sale.'},
            '2': {'Display': 'I buy the lowest priced products that will suit my needs.'},
            '3': {'Display': 'When it comes to choosing products for myself, I rely heavily on price.'}
        },
        'ChoiceOrder': ['1', '2', '3'],
        'Validation': {
            'Settings': {
                'ForceResponse': 'ON',
                'ForceResponseType': 'ON',
                'Type': 'None'
            }
        },
        'GradingData': [],
        'Language': [],
        'NextChoiceId': 4,
        'NextAnswerId': 8,
        'Answers': {
            '1': {'Display': 'Strongly disagree
1'},
            '2': {'Display': 'Disagree
2'},
            '3': {'Display': 'Somewhat disagree
3'},
            '4': {'Display': 'Neither agree nor disagree
4'},
            '5': {'Display': 'Somewhat agree
5'},
            '6': {'Display': 'Agree
6'},
            '7': {'Display': 'Strongly agree
7'}
        },
        'AnswerOrder': [1, 2, 3, 4, 5, 6, 7],
        'ChoiceDataExportTags': False,
        'QuestionID': 'QID88'
    }
}

The CES data has "grid" questions which are equivalent. They can be reconstructed as individual multiple choice questions, which may be more convenient in working with results anyways. We should gather input on actual benefits of grid/matrix.

In my opinion it would be a huge gift from a user experience point of view, as at the moment I doing the following and its quite annoying adding each item in manually to the survey.
psqi_5_options = ["Not during the past month", "Less than once a week", "Once or twice a week", "Three or more times a week"]
psqi_5_subquestions = [
    "Cannot get to sleep within 30 minutes",
    "Wake up in the middle of the night or early morning",
    "Have to get up to use the bathroom",
    "Cannot breathe comfortably",
    "Cough or snore loudly",
    "Feel too cold",
    "Feel too hot",
    "Had bad dreams",
    "Have pain",
]
psqi_5_subquestions_list = []
for subquestion in psqi_5_subquestions:
    valid_name = f"q_psqi_5_{subquestion.replace(' ', '_').lower()}"
    psqi_5_subquestions_list.append(valid_name)
    exec(f"{valid_name} = QuestionMultipleChoice(question_name='{valid_name}', question_text=f'During the past month, how often have you had trouble sleeping because you . . . {subquestion}', question_options=psqi_5_options)")

A lot of standardized surveys are using matrix format in psychology...

@andreifoldes
I have new feature (not yet released) that makes it easier to create a series of questions, like so---every question has a "loop" method that takes a ScenarioList as a parameter:

Feedback / comments welcome!  cc: @rbyh

@andreifoldes Thanks! We are totally aligned on the benefit in creating the survey, and hope @johnjosephhorton 's loop feature will completely address that. But once created, would you agree results in the form of individual multiple choice questions will be easily to work with?

(I mean several multiple choice questions in lieu of a grid question. The loop feature will handle other question types as well.)

NB showing use of "loop" functionality: https://www.expectedparrot.com/content/9fee0c5c-6f4f-4a4d-be43-8207e9c0bcec

@andreifoldes Thanks! We are totally aligned on the benefit in creating the survey, and hope @johnjosephhorton 's loop feature will completely address that. But once created, would you agree results in the form of individual multiple choice questions will be easily to work with?

Absolutely. I think it should just be an interface..

@andreifoldes I have new feature (not yet released) that makes it easier to create a series of questions, like so---every question has a "loop" method that takes a ScenarioList as a parameter:

Feedback / comments welcome! cc: @rbyh

Cool stuff! Very elegant solution. So this would then work with all the existing question types? One thing to be mindful of will be stripping all the special characters from {{subquestions}} that could lead to problems in terms of "identifier_names".


Cant compile after upgrade to 2.8

Hi, i'm getting this issue since i upgrade from 2.5.x to 2.8 and i'm unable to compile any apps even a blank app, i have tried to re-download the SDK, switch the channel, update all packages but still getting this issue. I have upgraded the Gradle version to 7 but not have changed since.
Thanks

Logs
flutter run --verbose
[ +109 ms] executing: [C:\FlutterSDK/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +592 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[   +1 ms] 262b70ece1aebf84f132c51ec4cf90be605ce61b
[   +1 ms] executing: [C:\FlutterSDK/] git tag --points-at 262b70ece1aebf84f132c51ec4cf90be605ce61b
[  +71 ms] Exit code 0 from: git tag --points-at 262b70ece1aebf84f132c51ec4cf90be605ce61b
[        ] 2.8.0-3.3.pre
[  +14 ms] executing: [C:\FlutterSDK/] git rev-parse --abbrev-ref --symbolic @{u}
[  +56 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{u}
[        ] origin/beta
[        ] executing: [C:\FlutterSDK/] git ls-remote --get-url origin
[  +54 ms] Exit code 0 from: git ls-remote --get-url origin
[        ] https://github.com/flutter/flutter.git
[ +161 ms] executing: [C:\FlutterSDK/] git rev-parse --abbrev-ref HEAD
[  +58 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[        ] beta
[ +100 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[   +5 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'WindowsUwpEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[  +91 ms] executing: C:\Users\Lero-\AppData\Local\Android\Sdk\platform-tools\adb.exe devices -l
[  +81 ms] List of devices attached
           emulator-5554          device product:sdk_phone_x86 model:Android_SDK_built_for_x86 device:generic_x86 transport_id:1
[  +15 ms] C:\Users\Lero-\AppData\Local\Android\Sdk\platform-tools\adb.exe -s emulator-5554 shell getprop
[  +57 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[   +5 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'WindowsUwpEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ +145 ms] Skipping pub get: version match.
[  +46 ms] Found plugin awesome_notifications at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\awesome_notifications-0.6.19\
[  +44 ms] Found plugin cloud_firestore at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\cloud_firestore-3.1.4\
[   +7 ms] Found plugin cloud_firestore_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\cloud_firestore_web-2.6.4\
[  +14 ms] Found plugin connectivity_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus-2.1.0\
[  +13 ms] Found plugin connectivity_plus_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_linux-1.1.1\
[   +3 ms] Found plugin connectivity_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_macos-1.2.1\
[   +3 ms] Found plugin connectivity_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_web-1.1.0+1\
[   +1 ms] Found plugin connectivity_plus_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_windows-1.2.0\
[   +2 ms] Found plugin contacts_service at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\contacts_service-0.6.3\
[  +26 ms] Found plugin facebook_app_events at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\facebook_app_events-0.14.7\
[   +5 ms] Found plugin firebase_analytics at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_analytics-9.0.2\
[   +3 ms] Found plugin firebase_analytics_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_analytics_web-0.4.0+2\
[   +3 ms] Found plugin firebase_auth at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_auth-3.3.3\
[   +6 ms] Found plugin firebase_auth_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_auth_web-3.3.4\
[   +3 ms] Found plugin firebase_core at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_core-1.10.5\
[   +3 ms] Found plugin firebase_core_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_core_web-1.5.2\
[   +3 ms] Found plugin firebase_crashlytics at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_crashlytics-2.4.3\
[   +2 ms] Found plugin firebase_messaging at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_messaging-11.2.3\
[   +3 ms] Found plugin firebase_messaging_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_messaging_web-2.2.4\
[   +2 ms] Found plugin firebase_storage at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_storage-10.2.3\
[   +2 ms] Found plugin firebase_storage_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_storage_web-3.2.4\
[  +21 ms] Found plugin flutter_keyboard_visibility at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_keyboard_visibility-5.1.0\
[   +3 ms] Found plugin flutter_keyboard_visibility_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_keyboard_visibility_web-2.0.0\
[   +9 ms] Found plugin flutter_plugin_android_lifecycle at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_plugin_android_lifecycle-2.0.5\
[  +24 ms] Found plugin geocoding at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geocoding-2.0.1\
[   +3 ms] Found plugin geolocator at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator-8.0.0\
[   +1 ms] Found plugin geolocator_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_android-3.0.0+4\
[   +1 ms] Found plugin geolocator_apple at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_apple-2.0.0+2\
[   +5 ms] Found plugin geolocator_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_web-2.1.0\
[   +9 ms] Found plugin google_mobile_ads at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_mobile_ads-1.0.1\
[   +2 ms] Found plugin google_sign_in at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_sign_in-5.2.1\
[   +4 ms] Found plugin google_sign_in_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_sign_in_web-0.10.0+3\
[   +9 ms] Found plugin image_cropper at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_cropper-1.4.1\
[   +1 ms] Found plugin image_picker at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_picker-0.8.4+4\
[   +7 ms] Found plugin image_picker_for_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_picker_for_web-2.1.4\
[   +4 ms] Found plugin in_app_purchase at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase-2.0.0\
[   +2 ms] Found plugin in_app_purchase_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase_android-0.1.4+6\
[   +2 ms] Found plugin in_app_purchase_storekit at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase_storekit-0.2.1\
[  +13 ms] Found plugin package_info_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus-1.3.0\
[   +2 ms] Found plugin package_info_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus_macos-1.3.0\
[   +2 ms] Found plugin package_info_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus_web-1.0.4\
[   +5 ms] Found plugin path_provider at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider-2.0.8\
[   +3 ms] Found plugin path_provider_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_android-2.0.9\
[   +2 ms] Found plugin path_provider_ios at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_ios-2.0.7\
[   +1 ms] Found plugin path_provider_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_linux-2.1.2\
[   +1 ms] Found plugin path_provider_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_macos-2.0.4\
[   +2 ms] Found plugin path_provider_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_windows-2.0.4\
[   +2 ms] Found plugin permission_handler at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\permission_handler-8.3.0\
[   +9 ms] Found plugin share_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus-3.0.4\
[   +2 ms] Found plugin share_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus_macos-2.0.2\
[   +3 ms] Found plugin share_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus_web-2.0.4\
[  +13 ms] Found plugin sqlite3_flutter_libs at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\sqlite3_flutter_libs-0.5.2\
[   +9 ms] Found plugin url_launcher at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher-6.0.17\
[   +1 ms] Found plugin url_launcher_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_android-6.0.13\
[   +1 ms] Found plugin url_launcher_ios at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_ios-6.0.13\
[   +1 ms] Found plugin url_launcher_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_linux-2.0.2\
[   +2 ms] Found plugin url_launcher_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_macos-2.0.2\
[   +2 ms] Found plugin url_launcher_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_web-2.0.5\
[   +3 ms] Found plugin url_launcher_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_windows-2.0.2\
[   +6 ms] Found plugin vibration at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\vibration-1.7.4-nullsafety.0\
[   +2 ms] Found plugin vibration_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\vibration_web-1.6.3-nullsafety.0\
[ +132 ms] Found plugin awesome_notifications at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\awesome_notifications-0.6.19\
[  +10 ms] Found plugin cloud_firestore at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\cloud_firestore-3.1.4\
[   +3 ms] Found plugin cloud_firestore_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\cloud_firestore_web-2.6.4\
[   +3 ms] Found plugin connectivity_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus-2.1.0\
[   +1 ms] Found plugin connectivity_plus_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_linux-1.1.1\
[   +1 ms] Found plugin connectivity_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_macos-1.2.1\
[   +2 ms] Found plugin connectivity_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_web-1.1.0+1\
[   +2 ms] Found plugin connectivity_plus_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_windows-1.2.0\
[   +3 ms] Found plugin contacts_service at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\contacts_service-0.6.3\
[  +11 ms] Found plugin facebook_app_events at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\facebook_app_events-0.14.7\
[   +3 ms] Found plugin firebase_analytics at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_analytics-9.0.2\
[   +2 ms] Found plugin firebase_analytics_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_analytics_web-0.4.0+2\
[   +1 ms] Found plugin firebase_auth at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_auth-3.3.3\
[   +1 ms] Found plugin firebase_auth_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_auth_web-3.3.4\
[   +1 ms] Found plugin firebase_core at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_core-1.10.5\
[   +1 ms] Found plugin firebase_core_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_core_web-1.5.2\
[   +1 ms] Found plugin firebase_crashlytics at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_crashlytics-2.4.3\
[   +2 ms] Found plugin firebase_messaging at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_messaging-11.2.3\
[   +1 ms] Found plugin firebase_messaging_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_messaging_web-2.2.4\
[   +1 ms] Found plugin firebase_storage at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_storage-10.2.3\
[   +3 ms] Found plugin firebase_storage_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_storage_web-3.2.4\
[  +10 ms] Found plugin flutter_keyboard_visibility at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_keyboard_visibility-5.1.0\
[   +2 ms] Found plugin flutter_keyboard_visibility_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_keyboard_visibility_web-2.0.0\
[   +4 ms] Found plugin flutter_plugin_android_lifecycle at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_plugin_android_lifecycle-2.0.5\
[   +7 ms] Found plugin geocoding at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geocoding-2.0.1\
[   +2 ms] Found plugin geolocator at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator-8.0.0\
[   +1 ms] Found plugin geolocator_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_android-3.0.0+4\
[   +3 ms] Found plugin geolocator_apple at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_apple-2.0.0+2\
[   +3 ms] Found plugin geolocator_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_web-2.1.0\
[   +4 ms] Found plugin google_mobile_ads at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_mobile_ads-1.0.1\
[   +1 ms] Found plugin google_sign_in at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_sign_in-5.2.1\
[   +1 ms] Found plugin google_sign_in_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_sign_in_web-0.10.0+3\
[   +6 ms] Found plugin image_cropper at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_cropper-1.4.1\
[   +1 ms] Found plugin image_picker at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_picker-0.8.4+4\
[   +1 ms] Found plugin image_picker_for_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_picker_for_web-2.1.4\
[   +1 ms] Found plugin in_app_purchase at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase-2.0.0\
[   +1 ms] Found plugin in_app_purchase_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase_android-0.1.4+6\
[   +1 ms] Found plugin in_app_purchase_storekit at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase_storekit-0.2.1\
[  +11 ms] Found plugin package_info_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus-1.3.0\
[   +3 ms] Found plugin package_info_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus_macos-1.3.0\
[   +2 ms] Found plugin package_info_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus_web-1.0.4\
[   +2 ms] Found plugin path_provider at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider-2.0.8\
[   +1 ms] Found plugin path_provider_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_android-2.0.9\
[   +1 ms] Found plugin path_provider_ios at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_ios-2.0.7\
[   +1 ms] Found plugin path_provider_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_linux-2.1.2\
[   +1 ms] Found plugin path_provider_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_macos-2.0.4\
[   +1 ms] Found plugin path_provider_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_windows-2.0.4\
[   +1 ms] Found plugin permission_handler at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\permission_handler-8.3.0\
[   +7 ms] Found plugin share_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus-3.0.4\
[   +1 ms] Found plugin share_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus_macos-2.0.2\
[   +2 ms] Found plugin share_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus_web-2.0.4\
[  +11 ms] Found plugin sqlite3_flutter_libs at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\sqlite3_flutter_libs-0.5.2\
[   +7 ms] Found plugin url_launcher at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher-6.0.17\
[   +1 ms] Found plugin url_launcher_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_android-6.0.13\
[   +1 ms] Found plugin url_launcher_ios at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_ios-6.0.13\
[   +1 ms] Found plugin url_launcher_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_linux-2.0.2\
[   +1 ms] Found plugin url_launcher_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_macos-2.0.2\
[   +1 ms] Found plugin url_launcher_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_web-2.0.5\
[   +1 ms] Found plugin url_launcher_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_windows-2.0.2\
[   +1 ms] Found plugin vibration at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\vibration-1.7.4-nullsafety.0\
[   +1 ms] Found plugin vibration_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\vibration_web-1.6.3-nullsafety.0\
[  +31 ms] Generating C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\android\app\src\main\java\io\flutter\plugins\GeneratedPluginRegistrant.java
[ +102 ms] ro.hardware = ranchu
[  +37 ms] Using hardware rendering with device Android SDK built for x86. If you notice graphics artifacts, consider enabling software rendering with
           "--enable-software-rendering".
[  +49 ms] Initializing file store
[  +17 ms] Skipping target: gen_localizations
[   +9 ms] gen_dart_plugin_registrant: Starting due to {InvalidatedReasonKind.inputChanged: The following inputs have updated contents:
C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\.dart_tool\package_config_subset,C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\.dart_tool\flutter_build\generated_main.dart}
[  +31 ms] Found plugin awesome_notifications at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\awesome_notifications-0.6.19\
[   +8 ms] Found plugin cloud_firestore at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\cloud_firestore-3.1.4\
[   +1 ms] Found plugin cloud_firestore_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\cloud_firestore_web-2.6.4\
[   +2 ms] Found plugin connectivity_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus-2.1.0\
[   +1 ms] Found plugin connectivity_plus_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_linux-1.1.1\
[   +1 ms] Found plugin connectivity_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_macos-1.2.1\
[   +1 ms] Found plugin connectivity_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_web-1.1.0+1\
[   +1 ms] Found plugin connectivity_plus_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\connectivity_plus_windows-1.2.0\
[   +1 ms] Found plugin contacts_service at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\contacts_service-0.6.3\
[  +10 ms] Found plugin facebook_app_events at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\facebook_app_events-0.14.7\
[   +4 ms] Found plugin firebase_analytics at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_analytics-9.0.2\
[   +2 ms] Found plugin firebase_analytics_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_analytics_web-0.4.0+2\
[   +1 ms] Found plugin firebase_auth at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_auth-3.3.3\
[   +1 ms] Found plugin firebase_auth_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_auth_web-3.3.4\
[   +1 ms] Found plugin firebase_core at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_core-1.10.5\
[   +2 ms] Found plugin firebase_core_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_core_web-1.5.2\
[   +1 ms] Found plugin firebase_crashlytics at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_crashlytics-2.4.3\
[   +1 ms] Found plugin firebase_messaging at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_messaging-11.2.3\
[   +1 ms] Found plugin firebase_messaging_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_messaging_web-2.2.4\
[   +1 ms] Found plugin firebase_storage at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_storage-10.2.3\
[   +1 ms] Found plugin firebase_storage_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\firebase_storage_web-3.2.4\
[   +8 ms] Found plugin flutter_keyboard_visibility at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_keyboard_visibility-5.1.0\
[   +2 ms] Found plugin flutter_keyboard_visibility_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_keyboard_visibility_web-2.0.0\
[   +5 ms] Found plugin flutter_plugin_android_lifecycle at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\flutter_plugin_android_lifecycle-2.0.5\
[   +9 ms] Found plugin geocoding at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geocoding-2.0.1\
[   +1 ms] Found plugin geolocator at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator-8.0.0\
[   +1 ms] Found plugin geolocator_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_android-3.0.0+4\
[   +1 ms] Found plugin geolocator_apple at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_apple-2.0.0+2\
[   +1 ms] Found plugin geolocator_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\geolocator_web-2.1.0\
[   +3 ms] Found plugin google_mobile_ads at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_mobile_ads-1.0.1\
[   +1 ms] Found plugin google_sign_in at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_sign_in-5.2.1\
[   +1 ms] Found plugin google_sign_in_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\google_sign_in_web-0.10.0+3\
[   +6 ms] Found plugin image_cropper at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_cropper-1.4.1\
[   +2 ms] Found plugin image_picker at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_picker-0.8.4+4\
[   +1 ms] Found plugin image_picker_for_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\image_picker_for_web-2.1.4\
[   +2 ms] Found plugin in_app_purchase at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase-2.0.0\
[   +1 ms] Found plugin in_app_purchase_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase_android-0.1.4+6\
[   +1 ms] Found plugin in_app_purchase_storekit at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\in_app_purchase_storekit-0.2.1\
[   +7 ms] Found plugin package_info_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus-1.3.0\
[   +1 ms] Found plugin package_info_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus_macos-1.3.0\
[   +2 ms] Found plugin package_info_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\package_info_plus_web-1.0.4\
[   +2 ms] Found plugin path_provider at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider-2.0.8\
[   +1 ms] Found plugin path_provider_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_android-2.0.9\
[   +1 ms] Found plugin path_provider_ios at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_ios-2.0.7\
[   +2 ms] Found plugin path_provider_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_linux-2.1.2\
[   +5 ms] Found plugin path_provider_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_macos-2.0.4\
[   +3 ms] Found plugin path_provider_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\path_provider_windows-2.0.4\
[   +1 ms] Found plugin permission_handler at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\permission_handler-8.3.0\
[   +8 ms] Found plugin share_plus at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus-3.0.4\
[   +1 ms] Found plugin share_plus_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus_macos-2.0.2\
[   +1 ms] Found plugin share_plus_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\share_plus_web-2.0.4\
[   +6 ms] Found plugin sqlite3_flutter_libs at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\sqlite3_flutter_libs-0.5.2\
[  +11 ms] Found plugin url_launcher at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher-6.0.17\
[   +1 ms] Found plugin url_launcher_android at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_android-6.0.13\
[   +2 ms] Found plugin url_launcher_ios at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_ios-6.0.13\
[   +2 ms] Found plugin url_launcher_linux at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_linux-2.0.2\
[   +1 ms] Found plugin url_launcher_macos at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_macos-2.0.2\
[   +1 ms] Found plugin url_launcher_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_web-2.0.5\
[   +1 ms] Found plugin url_launcher_windows at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\url_launcher_windows-2.0.2\
[   +2 ms] Found plugin vibration at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\vibration-1.7.4-nullsafety.0\
[   +1 ms] Found plugin vibration_web at C:\FlutterSDK\.pub-cache\hosted\pub.dartlang.org\vibration_web-1.6.3-nullsafety.0\
[  +14 ms] gen_dart_plugin_registrant: Complete
[   +5 ms] Skipping target: _composite
[   +4 ms] complete
[   +7 ms] Launching lib\main.dart on Android SDK built for x86 in debug mode...
[   +8 ms] C:\FlutterSDK\bin\cache\dart-sdk\bin\dart.exe --disable-dart-dev C:\FlutterSDK\bin\cache\artifacts\engine\windows-x64\frontend_server.dart.snapshot
--sdk-root C:\FlutterSDK\bin\cache\artifacts\engine\common\flutter_patched_sdk/ --incremental --target=flutter --debugger-module-names
--experimental-emit-debug-metadata -DFLUTTER_WEB_AUTO_DETECT=true --output-dill C:\Users\Lero-\AppData\Local\Temp\flutter_tools.3cce2b13\flutter_tool.e661169\app.dill
--packages C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\.dart_tool\package_config.json -Ddart.vm.profile=false -Ddart.vm.product=false --enable-asserts
--track-widget-creation --filesystem-scheme org-dartlang-root --initialize-from-dill build\c075001b96339384a97db4862b8ab8db.cache.dill.track.dill
--enable-experiment=alternative-invalidation-strategy
[  +25 ms] executing: C:\Users\Lero-\AppData\Local\Android\Sdk\platform-tools\adb.exe -s emulator-5554 shell -x logcat -v time -t 1
[  +24 ms] <- compile file:///C:/Users/Lero-/Documents/Projets/MaokaiApps/Aman/app/.dart_tool/flutter_build/generated_main.dart
[  +75 ms] --------- beginning of main
           12-10 09:58:12.002 W/Binder:184_1(  184): type=1400 audit(0.0:269): avc: denied { read } for name="wakeup35" dev="sysfs" ino=18845
           scontext=u:r:system_suspend:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0
[  +14 ms] executing: C:\Users\Lero-\AppData\Local\Android\Sdk\platform-tools\adb.exe version
[  +51 ms] Android Debug Bridge version 1.0.41
           Version 31.0.3-7562133
           Installed as C:\Users\Lero-\AppData\Local\Android\Sdk\platform-tools\adb.exe
[   +3 ms] executing: C:\Users\Lero-\AppData\Local\Android\Sdk\platform-tools\adb.exe start-server
[  +67 ms] Building APK
[  +42 ms] Running Gradle task 'assembleDebug'...
[   +9 ms] Using gradle from C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\android\gradlew.bat.
[  +27 ms] executing: C:\Program Files\Android\Android Studio\jre\bin\java -version
[ +176 ms] Exit code 0 from: C:\Program Files\Android\Android Studio\jre\bin\java -version
[   +1 ms] openjdk version "11.0.10" 2021-01-19
           OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
           OpenJDK 64-Bit Server VM (build 11.0.10+0-b96-7249189, mixed mode)
[   +2 ms] executing: C:\Program Files\Android\Android Studio\jre\bin\java -version
[ +224 ms] Exit code 0 from: C:\Program Files\Android\Android Studio\jre\bin\java -version
[   +1 ms] openjdk version "11.0.10" 2021-01-19
           OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
           OpenJDK 64-Bit Server VM (build 11.0.10+0-b96-7249189, mixed mode)
[   +3 ms] executing: C:\Program Files\Android\Android Studio\jre\bin\java -version
[ +181 ms] Exit code 0 from: C:\Program Files\Android\Android Studio\jre\bin\java -version
[        ] openjdk version "11.0.10" 2021-01-19
           OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
           OpenJDK 64-Bit Server VM (build 11.0.10+0-b96-7249189, mixed mode)
[   +2 ms] executing: [C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\android/] C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\android\gradlew.bat
-Pverbose=true -Ptarget-platform=android-x86 -Ptarget=C:\Users\Lero-\Documents\Projets\MaokaiApps\Aman\app\lib\main.dart
-Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ== -Pdart-obfuscation=false -Ptrack-widget-creation=true
-Ptree-shake-icons=false -Pfilesystem-scheme=org-dartlang-root assembleDebug
[+20289 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/flutter_datetime_picker-1.5.1/lib/flutter_datetime_picker.dart:311:32: Warning: Operand of null-aware
operation '??' has type 'Color' which excludes null.
[  +18 ms]  - 'Color' is from 'dart:ui'.
[        ]                   color: theme.backgroundColor ?? Colors.white,
[   +3 ms]                                ^
[+1133 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/scale.dart:32:11: Error: No named parameter with the name
'delta'.
[   +1 ms]           delta: delta,
[   +2 ms]           ^^^^^
[  +12 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/scale.dart:339:43: Error: Too few positional arguments: 2
required, 1 given.
[   +1 ms]           focalPointDelta > computePanSlop(pointerDeviceKind))
[   +1 ms]                                           ^
[        ] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2116:8: Context: Found this candidate, but the arguments don't match.
[        ] double computePanSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +1 ms]        ^^^^^^^^^^^^^^
[        ] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:46:66: Error: Too few positional arguments: 2
required, 1 given.
[   +8 ms]     final double minDistance = minFlingDistance ?? computeHitSlop(kind);
[   +1 ms]                                                                  ^
[   +1 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[   +1 ms] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[        ]        ^^^^^^^^^^^^^^
[        ] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:54:55: Error: Too few positional arguments: 2
required, 1 given.
[   +1 ms]     return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind);
[  +12 ms]                                                       ^
[   +1 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[   +1 ms] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[        ]        ^^^^^^^^^^^^^^
[        ] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:101:66: Error: Too few positional arguments: 2
required, 1 given.
[   +1 ms]     final double minDistance = minFlingDistance ?? computeHitSlop(kind);
[        ]                                                                  ^
[   +1 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[   +1 ms] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +4 ms]        ^^^^^^^^^^^^^^
[   +3 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:109:55: Error: Too few positional arguments: 2
required, 1 given.
[   +1 ms]     return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind);
[   +8 ms]                                                       ^
[   +4 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[        ] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +1 ms]        ^^^^^^^^^^^^^^
[+7981 ms] > Task :app:compileFlutterBuildDebug
[   +3 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/flutter_datetime_picker-1.5.1/lib/flutter_datetime_picker.dart:311:32: Warning: Operand of null-aware
operation '??' has type 'Color' which excludes null.
[  +31 ms]  - 'Color' is from 'dart:ui'.
[  +14 ms]                   color: theme.backgroundColor ?? Colors.white,
[  +27 ms]                                ^
[+1425 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/scale.dart:32:11: Error: No named parameter with the name
'delta'.
[   +1 ms]           delta: delta,
[   +1 ms]           ^^^^^
[  +56 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/scale.dart:339:43: Error: Too few positional arguments: 2
required, 1 given.
[  +67 ms]           focalPointDelta > computePanSlop(pointerDeviceKind))
[   +2 ms]                                           ^
[   +1 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2116:8: Context: Found this candidate, but the arguments don't match.
[   +1 ms] double computePanSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +2 ms]        ^^^^^^^^^^^^^^
[  +16 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:46:66: Error: Too few positional arguments: 2
required, 1 given.
[   +3 ms]     final double minDistance = minFlingDistance ?? computeHitSlop(kind);
[   +1 ms]                                                                  ^
[   +5 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[   +2 ms] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +1 ms]        ^^^^^^^^^^^^^^
[  +13 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:54:55: Error: Too few positional arguments: 2
required, 1 given.
[  +12 ms]     return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind);
[  +66 ms]                                                       ^
[   +1 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[   +2 ms] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +1 ms]        ^^^^^^^^^^^^^^
[  +36 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:101:66: Error: Too few positional arguments: 2
required, 1 given.
[  +93 ms]     final double minDistance = minFlingDistance ?? computeHitSlop(kind);
[   +1 ms]                                                                  ^
[        ] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[        ] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[        ]        ^^^^^^^^^^^^^^
[   +1 ms] /C:/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/extended_image-5.1.3/lib/src/gesture_detector/drag.dart:109:55: Error: Too few positional arguments: 2
required, 1 given.
[   +1 ms]     return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind);
[        ]                                                       ^
[   +1 ms] /C:/FlutterSDK/packages/flutter/lib/src/gestures/events.dart:2103:8: Context: Found this candidate, but the arguments don't match.
[   +1 ms] double computeHitSlop(PointerDeviceKind kind, DeviceGestureSettings? settings) {
[   +2 ms]        ^^^^^^^^^^^^^^
[+11378 ms] > Task :app:compileFlutterBuildDebug FAILED
[   +1 ms] Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
[        ] Use '--warning-mode all' to show the individual deprecation warnings.
[        ] See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings
[        ] 1 actionable task: 1 executed
[   +1 ms] FAILURE: Build failed with an exception.
[        ] * Where:
[        ] Script 'C:\FlutterSDK\packages\flutter_tools\gradle\flutter.gradle' line: 1070
[        ] * What went wrong:
[        ] Execution failed for task ':app:compileFlutterBuildDebug'.
[        ] > Process 'command 'C:\FlutterSDK\bin\flutter.bat'' finished with non-zero exit value 1
[        ] * Try:
[        ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[        ] * Get more help at https://help.gradle.org
[        ] BUILD FAILED in 42s
[ +616 ms] Running Gradle task 'assembleDebug'... (completed in 44,0s)
[   +5 ms] Exception: Gradle task assembleDebug failed with exit code 1
[   +2 ms] "flutter run" took 46 071ms.
[   +5 ms]
           #0      throwToolExit (package:flutter_tools/src/base/common.dart:10:3)
           #1      RunCommand.runCommand (package:flutter_tools/src/commands/run.dart:674:9)
           <asynchronous suspension>
           #2      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1140:27)
           <asynchronous suspension>
           #3      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
           <asynchronous suspension>
           #4      CommandRunner.runCommand (package:args/command_runner.dart:209:13)
           <asynchronous suspension>
           #5      FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:288:9)
           <asynchronous suspension>
           #6      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
           <asynchronous suspension>
           #7      FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:236:5)
           <asynchronous suspension>
           #8      run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9)
           <asynchronous suspension>
           #9      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
           <asynchronous suspension>
           #10     main (package:flutter_tools/executable.dart:94:3)
           <asynchronous suspension>

[ +260 ms] ensureAnalyticsSent: 255ms
[   +2 ms] Running shutdown hooks
[        ] Shutdown hooks complete
[        ] exiting with code 1

Why is this issue closed, how did you solve the problem? I have a similar issue. @Domzak

Why is this issue closed, how did you solve the problem? I have a similar issue. @Domzak

Hi! This issue was fixed in new version of extended_image.


SSH: support encoding/decoding armored signatures

Armored signatures are used by Git for signing commits.  Support reading writing these signatures by implementing a new trait to read and write to the SSH format.

Thanks @cloudhead @FintanH :+1: the comments should be addressed in the code or replied too.

Nice, this is 99% there I think.


MAC signature not correct

I have a test written that accesses Azure's Blob service and it works locally just fine.
However, when I run it on Jenkins it fails with the following message:
The MAC signature found in the HTTP request 'XXXXXX' is not the same as any computed signature. Server used following string to sign

more
azure.common.AzureHttpError: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
<?xml version="1.0" encoding="utf-8"?><Error>AuthenticationFailed<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:fc3b5142-0001-0026-5321-73555a000000
Time:2017-01-20T13:34:53.0623043Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request 'PR5//xx=' is not the same as any computed signature. Server used following string to sign: 'PUT

31800

application/x-www-form-urlencoded

x-ms-blob-type:BlockBlob
x-ms-client-request-id:3522da8c-df15-11e6-bf69-000d3a229a4b
x-ms-date:Fri, 20 Jan 2017 13:34:46 GMT
x-ms-version:2015-07-08
/xx/xx/588211f5e13823375ca62ef8'.</AuthenticationErrorDetail></Error>

But as I said - I can do the request just fine on the local machine.

Apparently, I was using requests-2.3.0 . After updating to requests-2.12.5, the problem went away

I found this to work as well.. But why? This seems like an odd fix.

Hello there,
I'm experiencing the same error now with quite newer versions.
ClientAuthenticationError: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:a31e07b3-601e-0036-0bd3-2d8a04000000
Time:2020-05-19T11:47:10.0584325Z
ErrorCode:AuthenticationFailed
Error:None
AuthenticationErrorDetail:The MAC signature found in the HTTP request 'MAC' is not the same as any computed signature. Server used following string to sign: 'PUT

222

application/octet-stream

x-ms-blob-type:BlockBlob
x-ms-client-request-id:78f39cfe-99c6-11ea-ac26-9c305b300dd6
x-ms-date:Tue, 19 May 2020 11:47:10 GMT
x-ms-version:2019-07-07
/xyz/a-b-c/configuration.json'.

The versions of azure and requests that I have:
azure-common==1.1.25
azure-core==1.5.0
azure-storage-blob==12.3.1
azure-storage-common==2.1.0
requests==2.23.0
requests-oauthlib==1.2.0
requests-toolbelt==0.9.1

Any idea what could be related to?

Problem solved.
The issue was actually that I was not sending the data in bytes so I just had to add .encode('utf-8')
In case this helps anybody.

I had a similar issue. I was trying to send a dictionary; converting to a string worked. The error message is quite misleading IMHO.

If someone else finds this useful, see my comment here: https://stackoverflow.com/questions/58164698/azure-server-failed-to-authenticate-the-request/67679100#67679100


CVV can key in up to 4 digit

Hi , currently cvv can key in up to 4 digit. For cvv it supposed to be 3 digit aite ?

@livintan American Express cards do support 4 digit CVV code.
PS: Closing this issue for now, please feel free to reopen if further information is required.


LGraph: Viable open source timing analysis backend for CoreIR

https://github.com/masc-ucsc/lgraph

Another: https://github.com/jinwookjungs/datc_robust_design_flow

https://github.com/lsils/lstools-showcase


Create checklist for demo day presentation and finish slides

User story

As a team member
I want / need a checklist/notes under each slide, what should be said
So that another team member can also present our projects

Acceptance criteria

Finish each slide from the draft
For each slide, the talking points are noted
It is clear and understandable what should be said
For the life demo there is a checklist with steps that should be shown
the time limit for the presentation is respected

Definition of done (DoD)

All acceptance criteria are met.
Work products are uploaded to the GitHub repository.
A pull request is created for each related branch.
The work products in the pull requests are reviewed.
GitHub CI Workflow passes for the branches
The corresponding branches are merged and closed.
The bill of materials section of the planning documents is updated.
Tests are written for the added features, if suitable

DoD general criteria

Feature has been fully implemented
Feature has been merged into the mainline
All acceptance criteria were met
Product owner approved features
All tests are passing
Developers agreed to release

Looking at the current status of the Presentation. Can you maybe try to put the important points from the recap also a bit more before, the recap adds new information, that seems odd to me.

See updated version here: https://docs.google.com/presentation/d/1SaIfabefqpyIHblUmDb_miVd-CRxM89SciDsWsSFN-8/edit#slide=id.p

Did you also do a test run. Really test it out that it is 10 minutes and for the showcasing part, please write concrete classes, where there is some stuff to show.

Yes, we tested it. The first part takes about 5-6 minutes and the demo about 3-4 minutes.


Allow searching by language

Add a parameter to either explicitly filter or strongly bias a language or set of languages. Language parameter would be the same code that appears on the claim itself.

We'll be allowing language filters on the app soon, so this would be a nice feature to go along with it.

We should do this soon since people are getting recommended videos and search results outside of their language. We added a new setting to only show results in a particular language and have no way to filter these.

This feature is available, but it needs to be added to the app.
@tiger5226 the last thing we can do to match what the SDK does is for En, also return results with null language since many old publishes before language was added to YT sync are blank.


Document/test city option in formatterPattern

Added the city pattern "%c" to the README and added a usage of it in the string formatter test.

Sorry for the late review


[ROCm] Hipsparse version of Sparse Add Operation

Bringing hipsparseXcsrgeam to Tensorflow for sparse add operations on ROCm enabled devices.
Builds on https://github.com/tensorflow/tensorflow/pull/49108 to flesh out Hipsparse functionality for Tensorflow.

@cheshire this is now ready for review.

@stevenireeves  Can you please resolve conflicts? Thanks!

@stevenireeves  Can you please resolve conflicts? Thanks!

@gbaned, some of the functions needed from https://github.com/tensorflow/tensorflow/pull/49108 were reverted. These need to be addressed before this can move forward.

@gbaned looks like the cancellation of the rollback removed the conflict. It should be ready to proceed.


report: Type Analysis (part of Literature Review)

Prerequisite of #22.

Marked as future ambition, closing for now.