The document discusses features from Google I/O and Android Q, including:
- Kotlin and in-app updates
- Changes in Android Q like the new navigation system, scoped storage, location permissions, settings panel actions, and dark mode
- Implementing dark theme support using DayNight and setting different themes for light and dark modes
The document discusses how Yoha Labs built their VoIP app AHOY using React Native and various Facebook products. It describes integrating Facebook Account Kit, Login, Analytics, and Share into the app. It also discusses challenges faced like wake up notifications across platforms and building their solution as a SDK for other apps. React Native advantages like cross-platform development and large community are highlighted.
This document discusses using triggers to automate actions in Forge apps. It begins with an overview of triggers and then discusses:
- Product triggers that are triggered by events in Atlassian products like Jira, Confluence etc.
- Web triggers that are triggered by HTTP requests to a Forge function.
- How to authenticate and make requests to external services like Opsgenie from Forge functions in response to triggers.
- Demos of building a Forge app that responds to Jira issue creation by assigning the issue and notifying Opsgenie.
The document provides details on the event payload formats, making authenticated requests, and deploying/managing the Forge app lif
Technical Deep Dive Into Atlassian's New Apps Performance Testing FrameworkAtlassian
In this session, Oleksandr Metelytsa and Benjamin Magro will take a technical deep dive into Atlassian's new apps performance testing framework to see how it works, how it can be used to test your Data Center applications, where it is heading in the future, and what we will require for Data Center apps performance testing going forward.
Find out what has changed since PebbleKit iOS 2.0 and learn how to upgrade your projects. Discover how to take advantage of the new features of the new PebbleKit iOS with Marcel Jackwerth (iOS Developer).
Uncovering breaking changes behind UI on mobile applicationsKazuaki Matsuo
Capturing HTTP requests during automated tests using a proxy server can help uncover breaking changes in the non-UI layers of mobile applications. The author conducted a case study capturing requests over Appium test scenarios for a long-running app with multiple developers. This uncovered issues like logs being incorrectly reused between views. Placing logs in fragments posed problems if those fragments were used across views. Changes like moving to new programming languages could also inadvertently affect log behavior if not implemented carefully.
Trusted by Default: The Forge Security & Privacy ModelAtlassian
Security and trust have become increasingly important requirements for our customers in Cloud. We’re working to make it easier for you to build and maintain secure apps for Atlassian products.
In this session, Engineering Team Lead Dugald Morrow and Principal Product Manager Joël Kalmanowicz will explain how security and trust have been baked into the Forge framework and the benefits the platform can offer you and your users. Learn how much less work it can be to build trusted apps customers will love on Forge by going deep on the safeguards we’re putting in place.
Developers or attendees with some software security experience will get the most out of this session.
S01-01 Display dummy data from a hardcoded string array in a TextView.
S01-02 Add a scrolling view like RecyclerView to display the dummy data.
S01-03 Complete the basic layout and UI for the Sunshine app.
Introduction to Titanium and how to connect with a PHP backendJoseluis Laso
Introduction to Appcelerator Titanium with a full application developed and how to connect with a PHP backend (provided as well), all the sources are available in github.com/jlaso
The document discusses how Yoha Labs built their VoIP app AHOY using React Native and various Facebook products. It describes integrating Facebook Account Kit, Login, Analytics, and Share into the app. It also discusses challenges faced like wake up notifications across platforms and building their solution as a SDK for other apps. React Native advantages like cross-platform development and large community are highlighted.
This document discusses using triggers to automate actions in Forge apps. It begins with an overview of triggers and then discusses:
- Product triggers that are triggered by events in Atlassian products like Jira, Confluence etc.
- Web triggers that are triggered by HTTP requests to a Forge function.
- How to authenticate and make requests to external services like Opsgenie from Forge functions in response to triggers.
- Demos of building a Forge app that responds to Jira issue creation by assigning the issue and notifying Opsgenie.
The document provides details on the event payload formats, making authenticated requests, and deploying/managing the Forge app lif
Technical Deep Dive Into Atlassian's New Apps Performance Testing FrameworkAtlassian
In this session, Oleksandr Metelytsa and Benjamin Magro will take a technical deep dive into Atlassian's new apps performance testing framework to see how it works, how it can be used to test your Data Center applications, where it is heading in the future, and what we will require for Data Center apps performance testing going forward.
Find out what has changed since PebbleKit iOS 2.0 and learn how to upgrade your projects. Discover how to take advantage of the new features of the new PebbleKit iOS with Marcel Jackwerth (iOS Developer).
Uncovering breaking changes behind UI on mobile applicationsKazuaki Matsuo
Capturing HTTP requests during automated tests using a proxy server can help uncover breaking changes in the non-UI layers of mobile applications. The author conducted a case study capturing requests over Appium test scenarios for a long-running app with multiple developers. This uncovered issues like logs being incorrectly reused between views. Placing logs in fragments posed problems if those fragments were used across views. Changes like moving to new programming languages could also inadvertently affect log behavior if not implemented carefully.
Trusted by Default: The Forge Security & Privacy ModelAtlassian
Security and trust have become increasingly important requirements for our customers in Cloud. We’re working to make it easier for you to build and maintain secure apps for Atlassian products.
In this session, Engineering Team Lead Dugald Morrow and Principal Product Manager Joël Kalmanowicz will explain how security and trust have been baked into the Forge framework and the benefits the platform can offer you and your users. Learn how much less work it can be to build trusted apps customers will love on Forge by going deep on the safeguards we’re putting in place.
Developers or attendees with some software security experience will get the most out of this session.
S01-01 Display dummy data from a hardcoded string array in a TextView.
S01-02 Add a scrolling view like RecyclerView to display the dummy data.
S01-03 Complete the basic layout and UI for the Sunshine app.
Introduction to Titanium and how to connect with a PHP backendJoseluis Laso
Introduction to Appcelerator Titanium with a full application developed and how to connect with a PHP backend (provided as well), all the sources are available in github.com/jlaso
Manipulating Android tasks and back stackRan Nachmany
This is the presentation I gave in Google TLV office on Nov 2011. It talks about how Android manages tasks and the tools we have to manipulate and control the default behavior
Summit 2015: Mobile App Dev and Content Management with Adobe Experience Managerbrucelefebvre
Slides from my Summit 2015 talk on 'Mobile App Development and Content Management with Adobe Experience Manager.'
Blog post: http://blogs.adobe.com/experiencedelivers/experience-management/mobile-app-dev-content-management-aem/
Description: Building and maintaining effective mobile apps presents several challenges, from supporting multiple operating systems to managing frequently updated content. Learn about using Adobe Experience Manager and Adobe PhoneGap, and see how these solutions come together to help you manage apps using systems and interfaces that you’re already familiar with, like HTML5 and web-based content management applications.
Hassle-Free Continuous Integration with Real Device TestingBitbar
Watch a live presentation at http://offer.bitbar.com/hassle-free-continuous-integration-combined-with-a-real-device-testing
Thousands of mobile apps are developed and released every day. The fierce competition for attention of end-users has changed the way mobile developers build and test their apps – and how they utilize today’s mobile devops tools to gain advantage of productivity, effectiveness and speed.
Stay tuned and join our upcoming webinars at http://bitbar.com/testing/webinars/
Rohit android lab projects in suresh gyan viharRohit malav
Overview. 1.1. Labs v Projects. 1.2. Do As Many As You Can. 1.3. Local Lab Setup.
Getting Started.
Android Development.
Android Internals. 4.1. Project: Android OS Monitor. 4.2. Task: IGLearner.
Android Networking.
Build an Android ROM.
KeyLogger.
Malicious Apps.
Let's Build an Editor Macro with Forge UIAtlassian
Race out of the gate with Forge UI: a new way of building UI extensions for Atlassian products. In this session, Forge UI Developer Experience lead Peter Gleeson will demonstrate how build an Editor macro from scratch! Attendees will learn about Forge foundational concepts such as the FaaS dev loop, Forge CLI, and how to construct UIs from Forge UI components.
This session provides a great introduction to the Forge platform for any developer looking to get productive with editor apps and Forge UI.
Joget Workflow v6 Training Slides - 2 - Setting Up Joget WorkflowJoget Workflow
List of Modules
1-Introduction to Joget Workflow
2-Setting up Joget Workflow
3-Designing your first Process
4-Localizing your Joget Workflow
5-Designing your first Form
6-Using your first Process Tool
7-Designing your first Datalist
8-Designing your first Userview
9-Hash Variable
10-SLA and Deadlines
12-Version Control
13-Improving your Form design and Presentation
14-Introduction to Reporting
15-Introduction to Plugin Architecture
16-Preparing Development Environment
17-Building Plugins
18-Integrating with External System
19-Doing more with your Process Design
20-Basic System Administration
21-Best Practices on Application Building
How to fix a bug in production - Rollout.ioRollout.io
In today's mobile landscape, a lot of resources are directed towards building better quality apps - from beta testing platforms to distribution systems and even app performance monitoring solutions. But none of these solutions help developers while their app is in production. A critical bug can cause a lot of damage to an App company, resulting in lower appstore rating, bad reviews which are difficult to bounce back from, and financial damages of up to $12K/hour of downtime (for a medium sized company).
With Rollout.io, developers can quickly react to their users by remote-controlling their app's settings and parameters, as well as fix and contain errors and issues in real time - without waiting for a full release cycle.
Integrating GoogleFit into Android AppsGiles Payne
Giles Payne presented on integrating GoogleFit into Android apps. He discussed getting an API key from the Google API console, adding the Fitness API dependency to build.gradle, creating a GoogleApiClient and enabling auto-manage, subscribing to data sources like step count, and querying the data source to retrieve aggregated fitness data in buckets by time range. Common issues include not needing to specify an API key and needing to reconnect after 48 hours to continue querying data.
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...Robert Nyman
The document discusses the current state and future of the web. It notes that while native apps have gained popularity, especially on mobile, the web remains strong with over 1 billion active users. It outlines tools from Google like Service Workers that help the web compete with capabilities previously only available to native apps like push notifications, offline access, and background processing. The document advocates for continued progress to simplify the web development process and ensure the longevity of technologies, arguing this will help the web remain diverse and accessible across all platforms.
[Slide Deck] - Mobile Observability Internals at Gojekraditya gumay
Mobile Observability Internals is a deep dive into the mechanisms and tools that power observability in mobile applications. It focuses on strategies to effectively monitor and diagnose the health, performance, and reliability of mobile apps. This includes collecting and analyzing a vast array of data from various points within the application lifecycle, such as error reporting, user interactions, system events, network requests, and app performance metrics. The goal is to provide insights into the app’s operational aspects to ensure optimal user experience, identify bottlenecks, and continuously improve the app based on real-world usage. This knowledge base is crucial for developers, QA teams, and operation managers who aim to maintain high standards of app quality and performance.
Slide Deck - Shift Left Beyond App Performance Improvement at Gojek_.pptxraditya gumay
Learning from the expert for handling shift left and app performance improvement for mobile applications.
Recently, mobile applications have had more complexity than backend applications. To tackle such complexity, I present an experience from the mobile expert to address issues around app performance.
AI: Integrate Search Function into Your App Using Bing Search API.Marvin Heng
Learn how to integrate web search function into your mobile app using Bing Search API.
#xamarin #cognitiveservice #bingsearch #microsoft #appdevelopment #crossplatform #ios #android #uwp
Click here for viewing full tutorial @ www.techconnect.io
by Marvin, Heng
Twitter: @hmheng
Blog: www.techconnect.io
Introduction to React for Frontend DevelopersSergio Nakamura
The document provides an introduction to React for frontend developers. It discusses why React is useful, including its declarative style, automatic updates, use of a virtual DOM, and modular component structure. It then covers React basics like building functional components, what JSX is, and how to use JavaScript code within JSX.
The web - What it has, what it lacks and where it must go - IstanbulRobert Nyman
The document discusses the current state and future of the web. It describes how the web currently lacks capabilities that native mobile apps have like push notifications, background processing, and offline access. However, new web features being developed like Service Workers, Push Notifications, and Background Sync aim to address these gaps. The document argues that with these new features, the divide between native and web is diminishing and the web can provide an app-like experience without requiring users to download an app. The future of the web depends on further developing these capabilities and ensuring the web remains accessible, simple to use, and continues to work across all platforms.
This document provides information and instructions for developers interested in building applications for the hi5 social networking platform using OpenSocial. It outlines key integration points, distribution channels, and features of the hi5 platform. It also includes a step-by-step tutorial demonstrating how to build a basic gifts application on hi5 using OpenSocial, covering tasks like fetching friends data, adding and displaying app data, creating activities, and sending notifications.
Introduction to Service Workers, a new Web API that allows developers to build app-like Progressive Apps with features ranging from Offline first to real Push notifications and more.
The document summarizes the agenda for a lecture on maps, speech recognition, and other Android topics. It includes:
1) An overview of using the Google Maps API to display maps and get the user's location in an Android app.
2) A discussion of using speech recognition through an intent to enable voice input in an Android app.
3) Brief mentions of other topics covered like Kotlin stats, non-native development options, monetization, sensors, and VR/AR.
iOS 9 introduced 3D Touch, which allows users to peek and pop content using varying levels of pressure on supported devices. It also improved multitasking for iPad with features like split view and slide over. Other new features include updates to search, contacts, and transport security. Android Marshmallow focused on runtime permissions, voice interactions, and new APIs in areas like fingerprint authentication and direct sharing. Both platforms continue advancing their mobile testing and monitoring tools to help developers build high quality apps.
The document discusses Apple's search APIs and how they enable apps to provide rich content to Spotlight, Siri and Safari search results. It covers three APIs - NSUserActivity, App Search and CoreSpotlight - that allow indexing app content and activities to make them discoverable in searches. The document also discusses how to index web content to drive traffic to mobile apps and optimize search results through techniques like keywords, structured data and fast deep linking to improve an app's relevance ranking.
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0Frost
The document provides instructions for building an Angular application with a Golang API and PostgreSQL database. It includes steps to set up the Angular and API projects, configure services and routing in Angular, and build components for item purchase, display, and reporting. The Angular app uses the Golang API to perform CRUD operations on a PostgreSQL database and display the data.
Manipulating Android tasks and back stackRan Nachmany
This is the presentation I gave in Google TLV office on Nov 2011. It talks about how Android manages tasks and the tools we have to manipulate and control the default behavior
Summit 2015: Mobile App Dev and Content Management with Adobe Experience Managerbrucelefebvre
Slides from my Summit 2015 talk on 'Mobile App Development and Content Management with Adobe Experience Manager.'
Blog post: http://blogs.adobe.com/experiencedelivers/experience-management/mobile-app-dev-content-management-aem/
Description: Building and maintaining effective mobile apps presents several challenges, from supporting multiple operating systems to managing frequently updated content. Learn about using Adobe Experience Manager and Adobe PhoneGap, and see how these solutions come together to help you manage apps using systems and interfaces that you’re already familiar with, like HTML5 and web-based content management applications.
Hassle-Free Continuous Integration with Real Device TestingBitbar
Watch a live presentation at http://offer.bitbar.com/hassle-free-continuous-integration-combined-with-a-real-device-testing
Thousands of mobile apps are developed and released every day. The fierce competition for attention of end-users has changed the way mobile developers build and test their apps – and how they utilize today’s mobile devops tools to gain advantage of productivity, effectiveness and speed.
Stay tuned and join our upcoming webinars at http://bitbar.com/testing/webinars/
Rohit android lab projects in suresh gyan viharRohit malav
Overview. 1.1. Labs v Projects. 1.2. Do As Many As You Can. 1.3. Local Lab Setup.
Getting Started.
Android Development.
Android Internals. 4.1. Project: Android OS Monitor. 4.2. Task: IGLearner.
Android Networking.
Build an Android ROM.
KeyLogger.
Malicious Apps.
Let's Build an Editor Macro with Forge UIAtlassian
Race out of the gate with Forge UI: a new way of building UI extensions for Atlassian products. In this session, Forge UI Developer Experience lead Peter Gleeson will demonstrate how build an Editor macro from scratch! Attendees will learn about Forge foundational concepts such as the FaaS dev loop, Forge CLI, and how to construct UIs from Forge UI components.
This session provides a great introduction to the Forge platform for any developer looking to get productive with editor apps and Forge UI.
Joget Workflow v6 Training Slides - 2 - Setting Up Joget WorkflowJoget Workflow
List of Modules
1-Introduction to Joget Workflow
2-Setting up Joget Workflow
3-Designing your first Process
4-Localizing your Joget Workflow
5-Designing your first Form
6-Using your first Process Tool
7-Designing your first Datalist
8-Designing your first Userview
9-Hash Variable
10-SLA and Deadlines
12-Version Control
13-Improving your Form design and Presentation
14-Introduction to Reporting
15-Introduction to Plugin Architecture
16-Preparing Development Environment
17-Building Plugins
18-Integrating with External System
19-Doing more with your Process Design
20-Basic System Administration
21-Best Practices on Application Building
How to fix a bug in production - Rollout.ioRollout.io
In today's mobile landscape, a lot of resources are directed towards building better quality apps - from beta testing platforms to distribution systems and even app performance monitoring solutions. But none of these solutions help developers while their app is in production. A critical bug can cause a lot of damage to an App company, resulting in lower appstore rating, bad reviews which are difficult to bounce back from, and financial damages of up to $12K/hour of downtime (for a medium sized company).
With Rollout.io, developers can quickly react to their users by remote-controlling their app's settings and parameters, as well as fix and contain errors and issues in real time - without waiting for a full release cycle.
Integrating GoogleFit into Android AppsGiles Payne
Giles Payne presented on integrating GoogleFit into Android apps. He discussed getting an API key from the Google API console, adding the Fitness API dependency to build.gradle, creating a GoogleApiClient and enabling auto-manage, subscribing to data sources like step count, and querying the data source to retrieve aggregated fitness data in buckets by time range. Common issues include not needing to specify an API key and needing to reconnect after 48 hours to continue querying data.
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...Robert Nyman
The document discusses the current state and future of the web. It notes that while native apps have gained popularity, especially on mobile, the web remains strong with over 1 billion active users. It outlines tools from Google like Service Workers that help the web compete with capabilities previously only available to native apps like push notifications, offline access, and background processing. The document advocates for continued progress to simplify the web development process and ensure the longevity of technologies, arguing this will help the web remain diverse and accessible across all platforms.
[Slide Deck] - Mobile Observability Internals at Gojekraditya gumay
Mobile Observability Internals is a deep dive into the mechanisms and tools that power observability in mobile applications. It focuses on strategies to effectively monitor and diagnose the health, performance, and reliability of mobile apps. This includes collecting and analyzing a vast array of data from various points within the application lifecycle, such as error reporting, user interactions, system events, network requests, and app performance metrics. The goal is to provide insights into the app’s operational aspects to ensure optimal user experience, identify bottlenecks, and continuously improve the app based on real-world usage. This knowledge base is crucial for developers, QA teams, and operation managers who aim to maintain high standards of app quality and performance.
Slide Deck - Shift Left Beyond App Performance Improvement at Gojek_.pptxraditya gumay
Learning from the expert for handling shift left and app performance improvement for mobile applications.
Recently, mobile applications have had more complexity than backend applications. To tackle such complexity, I present an experience from the mobile expert to address issues around app performance.
AI: Integrate Search Function into Your App Using Bing Search API.Marvin Heng
Learn how to integrate web search function into your mobile app using Bing Search API.
#xamarin #cognitiveservice #bingsearch #microsoft #appdevelopment #crossplatform #ios #android #uwp
Click here for viewing full tutorial @ www.techconnect.io
by Marvin, Heng
Twitter: @hmheng
Blog: www.techconnect.io
Introduction to React for Frontend DevelopersSergio Nakamura
The document provides an introduction to React for frontend developers. It discusses why React is useful, including its declarative style, automatic updates, use of a virtual DOM, and modular component structure. It then covers React basics like building functional components, what JSX is, and how to use JavaScript code within JSX.
The web - What it has, what it lacks and where it must go - IstanbulRobert Nyman
The document discusses the current state and future of the web. It describes how the web currently lacks capabilities that native mobile apps have like push notifications, background processing, and offline access. However, new web features being developed like Service Workers, Push Notifications, and Background Sync aim to address these gaps. The document argues that with these new features, the divide between native and web is diminishing and the web can provide an app-like experience without requiring users to download an app. The future of the web depends on further developing these capabilities and ensuring the web remains accessible, simple to use, and continues to work across all platforms.
This document provides information and instructions for developers interested in building applications for the hi5 social networking platform using OpenSocial. It outlines key integration points, distribution channels, and features of the hi5 platform. It also includes a step-by-step tutorial demonstrating how to build a basic gifts application on hi5 using OpenSocial, covering tasks like fetching friends data, adding and displaying app data, creating activities, and sending notifications.
Introduction to Service Workers, a new Web API that allows developers to build app-like Progressive Apps with features ranging from Offline first to real Push notifications and more.
The document summarizes the agenda for a lecture on maps, speech recognition, and other Android topics. It includes:
1) An overview of using the Google Maps API to display maps and get the user's location in an Android app.
2) A discussion of using speech recognition through an intent to enable voice input in an Android app.
3) Brief mentions of other topics covered like Kotlin stats, non-native development options, monetization, sensors, and VR/AR.
iOS 9 introduced 3D Touch, which allows users to peek and pop content using varying levels of pressure on supported devices. It also improved multitasking for iPad with features like split view and slide over. Other new features include updates to search, contacts, and transport security. Android Marshmallow focused on runtime permissions, voice interactions, and new APIs in areas like fingerprint authentication and direct sharing. Both platforms continue advancing their mobile testing and monitoring tools to help developers build high quality apps.
The document discusses Apple's search APIs and how they enable apps to provide rich content to Spotlight, Siri and Safari search results. It covers three APIs - NSUserActivity, App Search and CoreSpotlight - that allow indexing app content and activities to make them discoverable in searches. The document also discusses how to index web content to drive traffic to mobile apps and optimize search results through techniques like keywords, structured data and fast deep linking to improve an app's relevance ranking.
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0Frost
The document provides instructions for building an Angular application with a Golang API and PostgreSQL database. It includes steps to set up the Angular and API projects, configure services and routing in Angular, and build components for item purchase, display, and reporting. The Angular app uses the Golang API to perform CRUD operations on a PostgreSQL database and display the data.
Google Plus SignIn : l'Authentification GoogleMathias Seguy
Cette conférence vous expliquera en détail pourquoi mettre en place cette authentification et surtout comment la mettre en place.
Vous découvrirez ainsi:
la console des GoogleService,
comment utiliser l’objet PlusClient et ConnectionResult pour gérer l’identification de votre utilisateur,
comment mettre en place la « magic connexion » et la « manual connexion »,
comment mettre en place cette authentification au sein du cycle de vie de votre application,
comment charger le graphe social de l’utilisateur, faire des posts interactifs et des « application activities »…
Un grand moment pour tous ceux qui se demandent encore quelle est la meilleure stratégie pour authentifier son utilisateur.
Cette conférence s’associe:
d’un tutorial que vous pouvez retrouver sur GitHub: SignInWithGoogleTutorial(https://github.com/MathiasSeguy-Android2EE/SignInWithGoogleTutorial) sur GitHub.
d’une application mettant en place cette authentification que vous pouvez retrouver sur GooglePlay: MyPublicGoogleProfile (https://play.google.com/store/apps/details?id=com.android2ee.project.gplus.signin.publicid&hl=fr).
Et bien sûr la conférence va être disponible sur Android2EE dès le Vendredi 20 au rayon OpenResource\Conférences.
Vous aussi, authentifiez vos utilisateurs, inter-agissez avec eux et simplifiez leur la vie:
En espérant que vous y découvrirez votre bonheur :) .
Skinning Android for Embedded ApplicationsVIA Embedded
This presentation given by Jack Liu, VIA Embedded Senior Software Manager, looks at some of the most commonly requested modifications we receive in order to make Android achieve the required behavior, look and feel for an embedded scenario, including changing the start-up screen image with a custom logo or animation, how to directly boot into an application, and removal of system bars to achieve full screen display mode behavior.
Orangescrum Mobile API Add on User ManualOrangescrum
Orangescrum Mobile API add-on user manual will help you to install the Mobile API add-on & guide you about the features of Mobile API.
With the Mobile API Orangescrum open source (community) users can generate a code to use the iOS & Android Mobile APP .
For more information about the Mobile API & APP, please visit: http://www.orangescrum.org/add-on/mobileapi
Explore the Mobile API demo at: http://newui.orangescrum.org/
The document discusses MotionLayout, a library that allows for animations and transitions between layouts in Android using ConstraintLayout. Key components of MotionLayout include MotionScene, ConstraintSet, and Transition. ConstraintSet defines start and end states, Transition defines the animation between them, and MotionScene ties it all together. Custom attributes can also be animated between states.
The document discusses MotionLayout in ConstraintLayout 2.0, which allows defining animations through ConstraintSets and transitions between them. It provides an example of a basic animation created by switching between start and end ConstraintSets defined in a MotionScene file. The animation can be triggered by a button click and handles moving a view from the left to the right of its parent layout over 1000 milliseconds.
This document summarizes a presentation on new features in Google I/O and Android Q. It discusses Kotlin, in-app updates, the new navigation system in Android Q including gestures, scoped storage, location changes, dark mode, and Jetpack improvements for security and compose. The navigation system in Android Q uses gestures for navigation rather than buttons. Developers need to account for the safe zone and can exclude areas from gestures. In-app updates allow flexible or immediate updates within an app.
The document discusses Clean Architecture and provides an example of implementing it using a Movie Night app. It describes separating the app into Presentation, Data, and Domain layers with specific responsibilities. The Domain layer contains entities, use cases, and interfaces. The Data layer encapsulates data sources and mappers. The Presentation layer connects everything using ViewModels, LiveData, and observing lifecycle changes. It demonstrates how data flows from the Data layer through UseCases to the Presentation layer and updates the UI.
This document provides information about an Android development community and courses. It includes details about course topics like fundamentals, UI/UX, and advanced topics. It lists mentors and their backgrounds. Event details are provided for courses in Moscow and a mentors program. Links are included to sign up for courses and view the community on Facebook.
The document discusses Retrofit, a type-safe HTTP client for Android. It describes how to initialize Retrofit by defining interfaces for APIs, creating a Retrofit instance, and making network calls. It also covers using interceptors to log requests/responses and add authentication headers to requests. Custom interceptors allow controlling the behavior of authentication based on internal request headers.
The document discusses threads and handlers in Android. It contains the following key points:
1. Threads allow for concurrent execution while the main thread is responsible for UI updates. Additional threads can be used for network requests and background tasks.
2. Handlers allow threads to communicate by posting messages and runnables to a message queue. This avoids direct method calls between threads.
3. The main thread has a looper by default while custom threads require adding a looper. Handlers are used to post tasks from a thread's looper queue back to the main thread for UI updates.
This document provides wifi login credentials for Samsung-Next-Guest with the password NEXT@tlv4ever. It then introduces the largest Android community in Israel and lists its staff, activities, and locations. It promotes an IDC entrepreneurship program and provides details on its structure, mentors, advisory board, and past alumni. Finally, it advertises upcoming Android advanced courses on UI, GPU, animations, clean architecture, CPU, memory, and threads.
All the support you need. Support libs in AndroidVitali Pekelis
The support library provides support for older Android versions by backporting new features and components. It includes libraries for app compatibility, fragments, cardview, recyclerview and more. The support library works by including shims that check the Android version and use the native implementation where available, or a support version as needed. It is important to use consistent support library versions and follow best practices around configuration, versioning and compatibility. The support library continues to be updated regularly with new features, bug fixes and improvements to support developers.
This document provides best practices for developing SDKs. It discusses defining the SDK's purpose and services, planning the public API with an easy to use builder pattern and exceptions, planning the internal architecture with minimal dependencies and permissions, writing code with unique prefixes and lifecycle considerations, including sample apps and documentation, packaging as an AAR file, and tools for testing like Battery Historian and Stetho.
The document provides an overview of dependency injection and how it can be implemented using Dagger2 in Android. It discusses dependency injection principles like constructor injection and how modules, components, and clients work together in Dagger2. Key points covered include defining module classes to provide dependencies, component classes to assemble modules and inject clients, and using dependency injection annotations like @Inject in client classes. The document emphasizes best practices like separating dependencies into multiple modules and avoiding direct instantiation in clients.
This document discusses an upcoming hackathon and provides an agenda for a session on design patterns. The session will cover topics like code smells, different categories of design patterns (creational, structural, behavioral), and examples from Android like the Observer pattern implemented in ViewTreeObserver and builder patterns like AlertDialog.Builder and NotificationCompat.Builder. The goals are to learn about and inspire the use of design patterns to improve code readability, writability, and communication.
The document discusses advanced Android threading concepts including:
1. The main thread is responsible for UI rendering and user interactions. Blocking it can cause app jank and ANRs.
2. Additional threads can be created using Thread or Runnable classes and started to offload work.
3. The Handler, Looper, and MessageQueue classes provide an asynchronous messaging system for communication between threads without blocking. A Looper dispatches messages that are sent via a Handler.
This document discusses best practices for designing mobile user experiences that transition between iOS and Android platforms. It emphasizes that iOS and Android have different design philosophies and patterns that must be understood. Specifically, it notes that iOS focuses on simplicity, clarity and depth while Android follows Material Design principles of bold graphics and intentional motion. Directly porting an iOS design to Android is discouraged as the two platforms have different navigation, buttons, notifications and other interface conventions. The document provides an overview of major Android design components and patterns to consider when adapting a mobile experience for both platforms.
Loaders are objects that abstract data retrieval and observation to simplify handling the activity lifecycle and data changes. CursorLoaders make it easy to access data from a content provider using a few simple steps. Loaders are initialized with a unique ID and callbacks handle the loading process, caching data between configuration changes. This prevents needing to reload data when a device rotates.
This lesson covers providing data correctly in Android applications using content providers and loaders. It discusses using SQLite databases to store structured data and querying the data using SQL statements like SELECT, UPDATE, INSERT, and DELETE. The document provides examples of creating a database table and performing CRUD operations on it. It also mentions challenges like avoiding SQL injection and handling database upgrades.
This document discusses the process of rendering views and pixels on the screen from a high level object to pixels. It covers the key steps of measure, layout, and draw and explains important concepts like double buffering, vsync, and avoiding overdraw. Key topics include how the GPU helps with rasterization, using viewtreeobserver for size changes, different root view types, and using constraint layout for a more optimized layout. It emphasizes best practices like minimizing unnecessary layout requests and using tools like hierarchy viewer and GPU profiling.
This document discusses building clean and flexible Android architecture using principles like separation of concerns, single responsibility, and dependency injection. It recommends patterns like MVVM and VIPER to separate an app's business logic from its UI framework. The key aspects are interfaces for Views, Presenters, Interactors and Repositories. Sample code shows how to implement these patterns using interfaces, dependency injection and testing. The goal is architecture that is easy to iterate on, collaborate with and test independently of Android frameworks and libraries.
This document summarizes an Android design workshop held by Britt Barak and Figure 8. The workshop covered topics like color, imagery, meaningful motion, and the Android design vision. Attendees learned about using color palettes and themes, different types of images like bitmaps and vectors, animation principles, and how to design intuitive and delightful experiences for Android users. The workshop provided practical tips and examples to help developers and designers create high-quality Android apps adhering to Material Design standards.
This document discusses an Android development community and resources for learning Android. It includes information about upcoming community events like fundamentals and UI/UX sessions, as well as mentoring resources and programs to help developers progress from junior to senior levels. Sample code is provided for building a movie browsing app using best practices like MVP and libraries like Retrofit, Glide and Butterknife.
When it is all about ERP solutions, companies typically meet their needs with common ERP solutions like SAP, Oracle, and Microsoft Dynamics. These big players have demonstrated that ERP systems can be either simple or highly comprehensive. This remains true today, but there are new factors to consider, including a promising new contender in the market that’s Odoo. This blog compares Odoo ERP with traditional ERP systems and explains why many companies now see Odoo ERP as the best choice.
What are ERP Systems?
An ERP, or Enterprise Resource Planning, system provides your company with valuable information to help you make better decisions and boost your ROI. You should choose an ERP system based on your company’s specific needs. For instance, if you run a manufacturing or retail business, you will need an ERP system that efficiently manages inventory. A consulting firm, on the other hand, would benefit from an ERP system that enhances daily operations. Similarly, eCommerce stores would select an ERP system tailored to their needs.
Because different businesses have different requirements, ERP system functionalities can vary. Among the various ERP systems available, Odoo ERP is considered one of the best in the ERp market with more than 12 million global users today.
Odoo is an open-source ERP system initially designed for small to medium-sized businesses but now suitable for a wide range of companies. Odoo offers a scalable and configurable point-of-sale management solution and allows you to create customised modules for specific industries. Odoo is gaining more popularity because it is built in a way that allows easy customisation, has a user-friendly interface, and is affordable. Here, you will cover the main differences and get to know why Odoo is gaining attention despite the many other ERP systems available in the market.
Top 9 Trends in Cybersecurity for 2024.pptxdevvsandy
Security and risk management (SRM) leaders face disruptions on technological, organizational, and human fronts. Preparation and pragmatic execution are key for dealing with these disruptions and providing the right cybersecurity program.
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Łukasz Chruściel
No one wants their application to drag like a car stuck in the slow lane! Yet it’s all too common to encounter bumpy, pothole-filled solutions that slow the speed of any application. Symfony apps are not an exception.
In this talk, I will take you for a spin around the performance racetrack. We’ll explore common pitfalls - those hidden potholes on your application that can cause unexpected slowdowns. Learn how to spot these performance bumps early, and more importantly, how to navigate around them to keep your application running at top speed.
We will focus in particular on tuning your engine at the application level, making the right adjustments to ensure that your system responds like a well-oiled, high-performance race car.
Transform Your Communication with Cloud-Based IVR SolutionsTheSMSPoint
Discover the power of Cloud-Based IVR Solutions to streamline communication processes. Embrace scalability and cost-efficiency while enhancing customer experiences with features like automated call routing and voice recognition. Accessible from anywhere, these solutions integrate seamlessly with existing systems, providing real-time analytics for continuous improvement. Revolutionize your communication strategy today with Cloud-Based IVR Solutions. Learn more at: https://thesmspoint.com/channel/cloud-telephony
8 Best Automated Android App Testing Tool and Framework in 2024.pdfkalichargn70th171
Regarding mobile operating systems, two major players dominate our thoughts: Android and iPhone. With Android leading the market, software development companies are focused on delivering apps compatible with this OS. Ensuring an app's functionality across various Android devices, OS versions, and hardware specifications is critical, making Android app testing essential.
What to do when you have a perfect model for your software but you are constrained by an imperfect business model?
This talk explores the challenges of bringing modelling rigour to the business and strategy levels, and talking to your non-technical counterparts in the process.
SMS API Integration in Saudi Arabia| Best SMS API ServiceYara Milbes
Discover the benefits and implementation of SMS API integration in the UAE and Middle East. This comprehensive guide covers the importance of SMS messaging APIs, the advantages of bulk SMS APIs, and real-world case studies. Learn how CEQUENS, a leader in communication solutions, can help your business enhance customer engagement and streamline operations with innovative CPaaS, reliable SMS APIs, and omnichannel solutions, including WhatsApp Business. Perfect for businesses seeking to optimize their communication strategies in the digital age.
59. Scoped Storage accessing files
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Api 29+
android Q and higher
API 28-
android Pie and earlier
60. Scoped Storage
accessing app files
readwrite
MyApp Accessing App Storage
Photos MediaStore.Images
Videos MediaStore.Video
Audio MediaStore.Audio
* No permission needed!
Other files No access
63. Scoped Storage supporting legacy storage
<manifest>
<application
android:requestLegacyExternalStorage="true">
...
</application>
</manifest>
* Android R will only work with scoped storage
70. Pre - Q
<manifest>
<!-- ACCESS_COARSE_LOCATION - city level -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- ACCESS_FINE_LOCATION - as best we can do -->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
...
</manifest>
71. Targets Q
<manifest>
<!-- ACCESS_COARSE_LOCATION - city level -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- ACCESS_FINE_LOCATION - as best we can do -->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission
android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
...
</manifest>
75. //Target Q only, request "while-in-use" first
ActivityCompat.requestPermissions(this, arrayOf(
android.Manifest.permission.ACCESS_COARSE_LOCATION // or FINE
), REQUEST_CODE)
76. //Target Q only, request "while-in-use" first
ActivityCompat.requestPermissions(this, arrayOf(
android.Manifest.permission.ACCESS_COARSE_LOCATION // or FINE
), REQUEST_CODE)
//Request "all-the-time" (only if needed)
ActivityCompat.requestPermissions(this, arrayOf(
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION
), REQUEST_CODE)
81. Foreground service requires location type
<service
android:name="MyNavigationService"
android:foregroundServiceType="location" ... >
...
</service>
82. If you didn’t declare type location
● Has permission to location ‘while-in-use’ -
The service has NO permission for location
<service
android:name="MyNavigationService" ... >
</service>
83. If you didn’t declare type location
● Has permission to location ‘while-in-use’ -
The service has NO permission for location
● Has permission to location ‘all-the-time’ -
The service has permission for location
<service
android:name="MyNavigationService" ... >
</service>
115. ModesDayNight
MODE_NIGHT_YES
//Always use the dark theme
MODE_NIGHT_NO
//Always use the light theme DEFAULT PRE-Q
MODE_NIGHT_FOLLOW_SYSTEM
//Follows the current system settings DEFAULT ON Q
116. ModesDayNight
MODE_NIGHT_YES
//Always use the dark theme
MODE_NIGHT_NO
//Always use the light theme DEFAULT PRE-Q
MODE_NIGHT_FOLLOW_SYSTEM
//Follows the current system settings DEFAULT ON Q
MODE_NIGHT_AUTO_BATTERY
//Dark when battery saver is enabled API 21+ AND AppCompat-v1.1.0
118. Support Night ModeDayNight
● AppCompatDelegate.setDefaultNightMode(mode : Int)
● getDelegate().setLocalNightMode(mode : Int)
119. Support Night ModeDayNight
● AppCompatDelegate.setDefaultNightMode(mode : Int)
● getDelegate().setLocalNightMode(mode : Int)
Note: the values are not persisted
133. Bubbles
● They float on top of other app
content and follow the user
● Can be expanded to reveal app
functionality and information
134. Bubbles
● They float on top of other app
content and follow the user
● Can be expanded to reveal app
functionality and information
● Built into the notification system
135. Build a Bubble
● Configure the activity shown in the bubble
● Construct BubbleMetadata
● Add the metadata to your notification and send
136. Configure the activity shown in the bubble
<!--Must be embeddable,documentLaunchMode always,and resizable-->
<activity
android:name=".bubbles.BubbleActivity"
...
/>
137. Configure the activity shown in the bubble
<!--Must be embeddable,documentLaunchMode always,and resizable-->
<activity
android:name=".bubbles.BubbleActivity"
android:allowEmbedded="true"
...
/>
138. Configure the activity shown in the bubble
<!--Must be embeddable,documentLaunchMode always,and resizable-->
<activity
android:name=".bubbles.BubbleActivity"
android:allowEmbedded="true"
android:documentLaunchMode="always"
...
/>
139. Configure the activity shown in the bubble
<!--Must be embeddable,documentLaunchMode always,and resizable-->
<activity
android:name=".bubbles.BubbleActivity"
android:allowEmbedded="true"
android:documentLaunchMode="always"
android:resizeableActivity="true"
...
/>
140. Construct BubbleMetadata
val intent = Intent(mContext, MainActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(
mContext, 0 /* requestCode */, intent, 0/* flags*/)
141. Construct BubbleMetadata
val intent = Intent(mContext, MainActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(
mContext, 0 /* requestCode */, intent, 0/* flags*/)
//Metadata to go on the notification
val metadata = Notification.BubbleMetadata.Builder()
142. Construct BubbleMetadata
val intent = Intent(mContext, MainActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(
mContext, 0 /* requestCode */, intent, 0/* flags*/)
//Metadata to go on the notification
val metadata = Notification.BubbleMetadata.Builder()
//Icon is not displayed in Beta Q
.setIcon(Icon.createWithResource(mContext,
R.drawable.ic_bubble))
143. Construct BubbleMetadata
val intent = Intent(mContext, MainActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(
mContext, 0 /* requestCode */, intent, 0/* flags*/)
//Metadata to go on the notification
val metadata = Notification.BubbleMetadata.Builder()
//Icon is not displayed in Beta Q
.setIcon(Icon.createWithResource(mContext,
R.drawable.ic_bubble))
.setIntent(bubbleIntent).build()
144. Add the BubbleMetadata to your
notification and send
var builder = Notification.Builder(mContext, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
...
.setBubbleMetadata(metadata)
145. Add the BubbleMetadata to your
notification and send
var builder = Notification.Builder(mContext, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
...
.setBubbleMetadata(metadata)
//Send the notification
mNotificationManager.notify(BUBBLE_ID, builder.build())
146. When to use Bubbles?
● Messaging
● Calling
● User initiated
150. Sharing
● Content preview - supports
images and text
● New sharing shortcut API -
Doesn’t need to start your app
151. Sharing
● Content preview - supports
images and text
● New sharing shortcut API -
Doesn’t need to start your app
● Copy to clipboard up top
152. Sharing
● Content preview - supports
images and text
● New sharing shortcut API -
Doesn’t need to start your app
● Copy to clipboard up top
● It’s really really fast
155. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
156. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
157. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
.setLongLabel("Chet Haase")
158. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
.setLongLabel("Chet Haase")
.setPerson(...)//Person can improve ranking
159. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
.setLongLabel("Chet Haase")
.setPerson(...)//Person can improve ranking
.setIcon(/* Icon */)
160. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
.setLongLabel("Chet Haase")
.setPerson(...)//Person can improve ranking
.setIcon(/* Icon */)
.setCategories(category)//required to be a Sharing Shortcut
161. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
.setLongLabel("Chet Haase")
.setPerson(...)//Person can improve ranking
.setIcon(/* Icon */)
.setCategories(category)//required to be a Sharing Shortcut
.setIntent(...).build())
162. Providing a sharing shortcut
val sic = mutableListOf<ShortcutInfoCompat>()
sic.add( ShortcutInfoCompat.Builder(context, personId)
.setShortLabel("Chet")
.setLongLabel("Chet Haase")
.setPerson(...)//Person can improve ranking
.setIcon(/* Icon */)
.setCategories(category)//required to be a Sharing Shortcut
.setIntent(...).build())
ShortcutManagerCompat.addDynamicShortcuts(context, sic)
164. Adding a rich preview content
var share = Intent(ACTION_SEND)
...
165. Adding a rich preview content
var share = Intent(ACTION_SEND)
...
//Metadata must be in intent before Intent#crateChooser
share.putExtra(EXTRA_TITLE,"Introducing Android Q Beta")
166. Adding a rich preview content
var share = Intent(ACTION_SEND)
...
//Metadata must be in intent before Intent#crateChooser
share.putExtra(EXTRA_TITLE,"Introducing Android Q Beta")
share.clipData = ClipData.newUri(contentResolver,
"thumbnail", myContentProviderUri)
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
167. Adding a rich preview content
var share = Intent(ACTION_SEND)
...
//Metadata must be in intent before Intent#crateChooser
share.putExtra(EXTRA_TITLE,"Introducing Android Q Beta")
share.clipData = ClipData.newUri(contentResolver,
"thumbnail", myContentProviderUri)
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
share = Intent.createChooser(share,null /* no longer used */)
189. Benchmark
● Makes it easy to benchmark your code
● Handles warmup and clock stability for you
● Gives you a accurate result
● Runs as instrumented test
190. What should I benchmark
● RecyclerView scrolling
● Data processing
● Pieces of code that get used repeatedly
206. Jetpack compose
UI is defined as a function
● Take data as input
● Emits UI hierarchy when invoked
@Composable
fun Greeting(name: String) {
Text("Hello: $name")
}
208. What is compose?
● A set of jetpack UI widgets
● A Kotlin compiler plugin
● Unbundled from platform release
● Uses canvas instead of Views
● Fully compatible with your existing app/code
231. Easy….
private val captureCallback = object : CameraCaptureSession.CaptureCallback() {
private fun process(result: CaptureResult) {
when (state) {
STATE_PREVIEW -> Unit // Do nothing when the camera preview is working normally.
STATE_WAITING_LOCK -> capturePicture(result)
STATE_WAITING_PRECAPTURE -> {
// CONTROL_AE_STATE can be null on some devices
val aeState = result.get(CaptureResult.CONTROL_AE_STATE)
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
state = STATE_WAITING_NON_PRECAPTURE
}
}
STATE_WAITING_NON_PRECAPTURE -> {
// CONTROL_AE_STATE can be null on some devices
val aeState = result.get(CaptureResult.CONTROL_AE_STATE)
if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
state = STATE_PICTURE_TAKEN
captureStillPicture()
}
}
}
}
private fun capturePicture(result: CaptureResult) {
val afState = result.get(CaptureResult.CONTROL_AF_STATE)
if (afState == null) {
captureStillPicture()
} else if (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
|| afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
// CONTROL_AE_STATE can be null on some devices
val aeState = result.get(CaptureResult.CONTROL_AE_STATE)
if (aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
state = STATE_PICTURE_TAKEN
captureStillPicture()
} else {
runPrecaptureSequence()
}
}
}
override fun onCaptureProgressed(session: CameraCaptureSession,
request: CaptureRequest,
partialResult: CaptureResult) {
process(partialResult)
}
override fun onCaptureCompleted(session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult) {
process(result)
}
}
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_camera2_basic, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<View>(R.id.picture).setOnClickListener(this)
view.findViewById<View>(R.id.info).setOnClickListener(this)
textureView = view.findViewById(R.id.texture)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
file = File(activity.getExternalFilesDir(null), PIC_FILE_NAME)
}
nsor coordinate
* @param maxWidth The maximum width that can be chosen
* @param maxHeight The maximum height that can be chosen
* @param aspectRatio The aspect ratio
* @return The optimal `Size`, or an arbitrary one if none were big enough
*/
@JvmStatic private fun chooseOptimalSize(
choices: Array<Size>,
textureViewWidth: Int,
textureViewHeight: Int,
maxWidth: Int,
maxHeight: Int,
aspectRatio: Size
): Size {
// Collect the supported resolutions that are at least as big as the preview Surface
val bigEnough = ArrayList<Size>()
// Collect the supported resolutions that are smaller than the preview Surface
val notBigEnough = ArrayList<Size>()
val w = aspectRatio.width
val h = aspectRatio.height
for (option in choices) {
if (option.width <= maxWidth && option.height <= maxHeight &&
option.height == option.width * h / w) {
if (option.width >= textureViewWidth && option.height >= textureViewHeight) {
bigEnough.add(option)
} else {
notBigEnough.add(option)
}
}
}
// Pick the smallest of those big enough. If there is no one big enough, pick the
// largest of those not big enough.
if (bigEnough.size > 0) {
return Collections.min(bigEnough, CompareSizesByArea())
} else if (notBigEnough.size > 0) {
return Collections.max(notBigEnough, CompareSizesByArea())
} else {
Log.e(TAG, "Couldn't find any suitable preview size")
return choices[0]
}
}
@JvmStatic fun newInstance(): Camera2BasicFragment = Camera2BasicFragment()
}
}
override fun onResume() {
super.onResume()
startBackgroundThread()
// When the screen is turned off and turned back on, the SurfaceTexture is already
// available, and "onSurfaceTextureAvailable" will not be called. In that case, we can open
// a camera and start preview from here (otherwise, we wait until the surface is ready in
// the SurfaceTextureListener).
if (textureView.isAvailable) {
openCamera(textureView.width, textureView.height)
} else {
textureView.surfaceTextureListener = surfaceTextureListener
}
}
override fun onPause() {
closeCamera()
stopBackgroundThread()
super.onPause()
}
private fun requestCameraPermission() {
if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
ConfirmationDialog().show(childFragmentManager, FRAGMENT_DIALOG)
} else {
requestPermissions(arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION)
}
}
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>,
grantResults: IntArray) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.size != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
ErrorDialog.newInstance(getString(R.string.request_permission))
.show(childFragmentManager, FRAGMENT_DIALOG)
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
/**
* Sets up member variables related to camera.
*
* @param width The width of available size for camera preview
* @param height The height of available size for camera preview
*/
private fun setUpCameraOutputs(width: Int, height: Int) {
val manager = activity.getSystemService(Context.CAMERA_SERVICE) as CameraManager
try {
for (cameraId in manager.cameraIdList) {
val characteristics = manager.getCameraCharacteristics(cameraId)
// We don't use a front facing camera in this sample.
val cameraDirection = characteristics.get(CameraCharacteristics.LENS_FACING)
if (cameraDirection != null &&
cameraDirection == CameraCharacteristics.LENS_FACING_FRONT) {
continue
}
val map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) ?: continue
// For still image captures, we use the largest available size.
val largest = Collections.max(
Arrays.asList(*map.getOutputSizes(ImageFormat.JPEG)),
CompareSizesByArea())
imageReader = ImageReader.newInstance(largest.width, largest.height,
ImageFormat.JPEG, /*maxImages*/ 2).apply {
setOnImageAvailableListener(onImageAvailableListener, backgroundHandler)
}
// Find out if we need to swap dimension to get the preview size relative to sensor
// coordinate.
val displayRotation = activity.windowManager.defaultDisplay.rotation
sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)
val swappedDimensions = areDimensionsSwapped(displayRotation)
val displaySize = Point()
activity.windowManager.defaultDisplay.getSize(displaySize)
val rotatedPreviewWidth = if (swappedDimensions) height else width
val rotatedPreviewHeight = if (swappedDimensions) width else height
var maxPreviewWidth = if (swappedDimensions) displaySize.y else displaySize.x
var maxPreviewHeight = if (swappedDimensions) displaySize.x else displaySize.y
if (maxPreviewWidth > MAX_PREVIEW_WIDTH) maxPreviewWidth = MAX_PREVIEW_WIDTH
if (maxPreviewHeight > MAX_PREVIEW_HEIGHT) maxPreviewHeight = MAX_PREVIEW_HEIGHT
// Danger, W.R.! Attempting to use too large a preview size could exceed the camera
// bus' bandwidth limitation, resulting in gorgeous previews but the storage of
// garbage capture data.
previewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture::class.java),
rotatedPreviewWidth, rotatedPreviewHeight,
maxPreviewWidth, maxPreviewHeight,
largest)
// We fit the aspect ratio of TextureView to the size of preview we picked.
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
textureView.setAspectRatio(previewSize.width, previewSize.height)
} else {
textureView.setAspectRatio(previewSize.height, previewSize.width)
}
// Check if the flash is supported.
flashSupported =
characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE) == true
val captureBuilder = cameraDevice?.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE)?.apply {
addTarget(imageReader?.surface)
// Sensor orientation is 90 for most devices, or 270 for some devices (eg. Nexus 5X)
// We have to take that into account and rotate JPEG properly.
// For devices with orientation of 90, we return our mapping from ORIENTATIONS.
// For devices with orientation of 270, we need to rotate the JPEG 180 degrees.
set(CaptureRequest.JPEG_ORIENTATION,
(ORIENTATIONS.get(rotation) + sensorOrientation + 270) % 360)
// Use the same AE and AF modes as the preview.
set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
}?.also { setAutoFlash(it) }
val captureCallback = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult) {
activity.showToast("Saved: $file")
Log.d(TAG, file.toString())
unlockFocus()
}
}
captureSession?.apply {
stopRepeating()
abortCaptures()
capture(captureBuilder?.build(), captureCallback, null)
}
} catch (e: CameraAccessException) {
Log.e(TAG, e.toString())
}
}
/**
* Unlock the focus. This method should be called when still image capture sequence is
* finished.
*/
private fun unlockFocus() {
try {
// Reset the auto-focus trigger
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_CANCEL)
setAutoFlash(previewRequestBuilder)
captureSession?.capture(previewRequestBuilder.build(), captureCallback,
backgroundHandler)
// After this, the camera will go back to the normal state of preview.
state = STATE_PREVIEW
captureSession?.setRepeatingRequest(previewRequest, captureCallback,
backgroundHandler)
} catch (e: CameraAccessException) {
Log.e(TAG, e.toString())
}
}
override fun onClick(view: View) {
when (view.id) {
R.id.picture -> lockFocus()
R.id.info -> {
if (activity != null) {
AlertDialog.Builder(activity)
.setMessage(R.string.intro_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}
}
}
private fun setAutoFlash(requestBuilder: CaptureRequest.Builder) {
if (flashSupported) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
}
}
companion object {
/**
* Conversion from screen rotation to JPEG orientation.
*/
private val ORIENTATIONS = SparseIntArray()
private val FRAGMENT_DIALOG = "dialog"
init {
ORIENTATIONS.append(Surface.ROTATION_0, 90)
ORIENTATIONS.append(Surface.ROTATION_90, 0)
ORIENTATIONS.append(Surface.ROTATION_180, 270)
ORIENTATIONS.append(Surface.ROTATION_270, 180)
}
/**
* Tag for the [Log].
*/
private val TAG = "Camera2BasicFragment"
/**
* Camera state: Showing camera preview.
*/
private val STATE_PREVIEW = 0
/**
* Camera state: Waiting for the focus to be locked.
*/
private val STATE_WAITING_LOCK = 1
/**
* Camera state: Waiting for the exposure to be precapture state.
*/
private val STATE_WAITING_PRECAPTURE = 2
/**
* Camera state: Waiting for the exposure state to be something other than precapture.
*/
private val STATE_WAITING_NON_PRECAPTURE = 3
/**
* Camera state: Picture was taken.
*/
private val STATE_PICTURE_TAKEN = 4
/**
* Max preview width that is guaranteed by Camera2 API
*/
private val MAX_PREVIEW_WIDTH = 1920
/**
* Max preview height that is guaranteed by Camera2 API
*/
private val MAX_PREVIEW_HEIGHT = 1080
/**
this.cameraId = cameraId
// We've found a viable camera and finished setting up member variables,
// so we don't need to iterate through other available cameras.
return
}
} catch (e: CameraAccessException) {
Log.e(TAG, e.toString())
} catch (e: NullPointerException) {
// Currently an NPE is thrown when the Camera2API is used but not supported on the
// device this code runs.
ErrorDialog.newInstance(getString(R.string.camera_error))
.show(childFragmentManager, FRAGMENT_DIALOG)
}
}
/**
* Determines if the dimensions are swapped given the phone's current rotation.
*
* @param displayRotation The current rotation of the display
*
* @return true if the dimensions are swapped, false otherwise.
*/
private fun areDimensionsSwapped(displayRotation: Int): Boolean {
var swappedDimensions = false
when (displayRotation) {
Surface.ROTATION_0, Surface.ROTATION_180 -> {
if (sensorOrientation == 90 || sensorOrientation == 270) {
swappedDimensions = true
}
}
Surface.ROTATION_90, Surface.ROTATION_270 -> {
if (sensorOrientation == 0 || sensorOrientation == 180) {
swappedDimensions = true
}
}
else -> {
Log.e(TAG, "Display rotation is invalid: $displayRotation")
}
}
return swappedDimensions
}
/**
* Opens the camera specified by [Camera2BasicFragment.cameraId].
*/
private fun openCamera(width: Int, height: Int) {
val permission = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA)
if (permission != PackageManager.PERMISSION_GRANTED) {
requestCameraPermission()
return
}
setUpCameraOutputs(width, height)
configureTransform(width, height)
val manager = activity.getSystemService(Context.CAMERA_SERVICE) as CameraManager
try {
// Wait for camera to open - 2.5 seconds is sufficient
if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
throw RuntimeException("Time out waiting to lock camera opening.")
}
manager.openCamera(cameraId, stateCallback, backgroundHandler)
} catch (e: CameraAccessException) {
Log.e(TAG, e.toString())
} catch (e: InterruptedException) {
throw RuntimeException("Interrupted while trying to lock camera opening.", e)
}
}
/**
* Closes the current [CameraDevice].
*/
private fun closeCamera() {
try {
cameraOpenCloseLock.acquire()
captureSession?.close()
captureSession = null
cameraDevice?.close()
cameraDevice = null
imageReader?.close()
imageReader = null
} catch (e: InterruptedException) {
throw RuntimeException("Interrupted while trying to lock camera closing.", e)
} finally {
cameraOpenCloseLock.release()
}
}
/**
* Starts a background thread and its [Handler].
*/
private fun startBackgroundThread() {
backgroundThread = HandlerThread("CameraBackground").also { it.start() }
backgroundHandler = Handler(backgroundThread?.looper)
}
/**
* Stops the background thread and its [Handler].
hen we get a response in
* [.captureCallback] from both [.lockFocus].
*/
private fun captureStillPicture() {
try {
if (activity == null || cameraDevice == null) return
val rotation = activity.windowManager.defaultDisplay.rotation
// This is the CaptureRequest.Builder that we use to take a picture.
e
238. Preview
val previewConfig = PreviewConfig.Builder().build()
val preview = Preview(previewConfig)
preview.setOnPreviewOutputUpdateListener {
previewOutput: Preview.PreviewOutput? ->
/* Your code here.
* For example, use previewOutput?.getSurfaceTexture()
* and post to a GL renderer.
*/
}
239. Preview
val previewConfig = PreviewConfig.Builder().build()
val preview = Preview(previewConfig)
preview.setOnPreviewOutputUpdateListener {
previewOutput: Preview.PreviewOutput? ->
/* Your code here.
* For example, use previewOutput?.getSurfaceTexture()
* and post to a GL renderer.
*/
}
CameraX.bindToLifecycle(this as LifecycleOwner, preview)
256. fun onClick() {
val file = File(...)
imageCapture.takePicture(
)
}
Save an Image on user action
257. fun onClick() {
val file = File(...)
imageCapture.takePicture(file,
)
}
Save an Image on user action
258. fun onClick() {
val file = File(...)
imageCapture.takePicture(file,
object : ImageCapture.OnImageSavedListener {
override fun onError(error: ImageCapture.UseCaseError,
message: String, exc: Throwable?) {
// insert your code here.
}
override fun onImageSaved(file: File) {
// insert your code here.
}
})
}
Listen to save result
261. Extensions
val builder = ImageCaptureConfig.Builder()
val bokehImageCapture = BokehImageCaptureExtender.create(builder)
262. Extensions
val builder = ImageCaptureConfig.Builder()
val bokehImageCapture = BokehImageCaptureExtender.create(builder)
if (bokehImageCapture.isExtensionAvailable()) {
bokehImageCapture.enableExtension()
}
מידע על מיקום נותן את התכנים השימושיים, המעשירים והמרגשים ביותר למשתמשים - עזרה בניווט ממקום למקום, מציאת מסעדות וחנויות ועוד. .
לפני אנדרואיד קיו הרשאת מיקום היה בעל ערך בינארי -או שכן או שלא. אם יוזר מסכים לתת לאפליקציה הרשאה למיקום, האפליקציה יכולה לעקוב אחר המיקום גם כשהיוזר משתמש באפליקציה וגם כשהוא לא.
באנדרואיד קיו נוספת ליוזר אופציה חדשה - אשר רק כשאני משתמש באפליקציה. אם היוזר בוחר באופציה הזאת - האפליקציה רשאית לגשת למיקום רק כשהאפליקציה בפורגראונד.
אז מתי האפליקצייה שלי נחשבת בפורגראונד
אוקי, אז ישנם שני מקרים : המקרה הראשון הוא כשהאפליקציה פתוחה והיוזר רואה אותה על המסך, פורגראונד אקטיביטי, והשני הוא כשהאפליקציה מריצה פורגראונד סרויס. בגדול פורגראונד סרוויס זה סרוויס רגיל, אבל במידה והאפליקציה סגורה או לא מוצגת במסך נוצרת נוטיפיקציה כך שהיוזר יודע שעדיין מתרחש איזשהו תהליך באפליקציה. דוגמה לשימוש בפורגראונד סרוויס - ניווט באפליקציית גוגל מפס, אם היוזר יוצא מהאפליקציה או סוגר אותה במהלך ניווט, האפליקציה ממשיכה להכווין את המשתמש דרך נוטיפיקציה. אוקיי, אז במהלך הדיבור על הרשאות מיקום כל פעם שאגיד , אפליקצייה בפורגראונד, הכוונה היא או שיש אקטיביטי בפורגראונד או שיש פורגראונד סרוויס, אחרת האפליקציה באקגראונד.
.באנדרואיד קיו, אם האפליקציה שלכם מוכוונת לקיו אס די קיי, צריך להוסיף הצהרה לשימוש בלוקשיין בבאקגראונד. אקסס קורס לוקשיין ופיין לוקשיין יאפשרו לאפליקציה לגשת למיקום רק כשהיא בפורגראונד.
.באנדרואיד קיו, אם האפליקציה שלכם מוכוונת לקיו אס די קיי, צריך להוסיף הצהרה לשימוש בלוקשיין בבאקגראונד. אקסס קורס לוקשיין ופיין לוקשיין יאפשרו לאפליקציה לגשת למיקום רק כשהיא בפורגראונד.
אם האפליקצייה לא מוכוונת לקיו אס די קיי אבל רצה על אנדראויד קיו - המערכת מוסיפה את הבאקגראונד פרמישיין אוטומטית,.
אחד היתרונות לטרגט את אנדרואיד קיו , הוא ההפרדה בין בקשות לפורגראונד ולבאקגראונד. ככה ליוזר יהיה קל יותר להבין למה הוא צריך לאפשר שימוש במיקום והסיכוי שהוא יתן לכם את האישור יגדל. בתמונה ניתן לראות דוגמה לדיאלוג לבקשת שימוש במיקום בבאקגראונד אחרי שהיוזר כבר אישר שימוש בפורגראונד.
אם האפליקצייה לא מוכוונת לקיו אס די קיי אבל רצה על אנדראויד קיו - המערכת מוסיפה את הבאקגראונד פרמישיין אוטומטית,.
.לבקשת הרשאת מיקום בבאקגראונד, מומלץ קודם לבדוק אם קיים אישור לשימוש בפורגראונד ואם יש אז לבקש רק את ההרשאה הנוספת
.לבקשת הרשאת מיקום בבאקגראונד, מומלץ קודם לבדוק אם קיים אישור לשימוש בפורגראונד ואם יש אז לבקש רק את ההרשאה הנוספת
בדיקת הרשאה למיקום בבאקגראונד מאד דומה, פשוט צריך לבדוק אם יש פרמישיין לאקסס באקגראונד לוקשיין
בדיקת הרשאה למיקום בבאקגראונד מאד דומה, פשוט צריך לבדוק אם יש פרמישיין לאקסס באקגראונד לוקשיין
מה קורה אם יוזר הוריד את האפליקצייה על אנדרואיד פיי ואחר כך עדכן לאנדרואיד קיו? אם היוזר נתן הרשאות למיקום אז באופן אוטומטי יהיה לאפליקציה גם הרשאה למיקום בבאקגראונד, כך שלא יהיה שינוי התנהגות באפליקציה.
מה קורה אם יוזר הוריד את האפליקצייה על אנדרואיד פיי ואחר כך עדכן לאנדרואיד קיו? אם היוזר נתן הרשאות למיקום אז באופן אוטומטי יהיה לאפליקציה גם הרשאה למיקום בבאקגראונד, כך שלא יהיה שינוי התנהגות באפליקציה.
מאנדרואיד קיו אפליקציות שצריכות לקבל מיקום מתוך פורגראונד סרוויס צריכות להצהיר שזהו סרוויס מסוג לוקשיין במניפסט.
אם לאפליקצייה יש אישור לשימוש במיקום בבאדגראונד לסרוויס יהיה גישה למיקום. השינויים האלה הם עבור כל האפליקציות ללא התחשבות בטרגט אס די קיי. במילים אחרות - אפליקצייה צריכה להצהיר לוקיישן טייפ אם היא רוצה להשתמש במיקום בפורגאונדסרויס וגם לבקש מהיוזר שימוש במיקום פורגראונד בלבד
אם לאפליקצייה יש אישור לשימוש במיקום בבאדגראונד לסרוויס יהיה גישה למיקום. השינויים האלה הם עבור כל האפליקציות ללא התחשבות בטרגט אס די קיי. במילים אחרות - אפליקצייה צריכה להצהיר לוקיישן טייפ אם היא רוצה להשתמש במיקום בפורגאונדסרויס וגם לבקש מהיוזר שימוש במיקום פורגראונד בלבד
יוזר יקבל באופן חד-פעמי פר-אפליקציה כשהיוזר מעניק לאפליקציה הרשאה לבאקגראטנד יחד עם פיין לוקישיין. עם הוא עושה שינויים בהרשאות הוא יוכל לקבל את הנוטיפיקציה הזאת שוב
כשיוזר לוחץ על הנוטיפיקציה יפתח מסך הרשאות המיקום של האפליקציה שם הוא יוכל לשנות את ההרשאות למיקום רק בפורגראונד או לחסום לגמרי את האפליקציה ממידע על המיקום.
לפני אנדראויד קיו, אם יוזר במצב טיסה פותח אפליקציה שצריכה אינטרנט, המקסימום שהאפליקציה יכלה לעשות זה להציג לו דיאלוג שלחיצה עליו תפתח את הסטינגנס של המכשיר.
היוזר יכול לשנות הגדרות מבלי לעזוב את האפליקציה, להפעיל וויפי ולבחור רשת..
הגדרות שמע
הגדרות שמע
הגדרות שמע
הגדרות שמע
הגדרות שמע
הגדרות שמע
ובעתיד גוגל מתכוונים לעשות ווראפר לכל זה שיפתח את העמוד בסטיגנס המתאים ביותר. ועכשיו נעבור לדבר על דארק ט’ים
דארק ט’ים
אז למה דארק ט’ים חשוב?
אז דבר ראשון תמיכה בשימוש באפליקציה במקומות חשוכים, כמה פעמים יצא לכם להשתמש בפלאפון בחדר חשוך ולהסתנוור מהמסך?
בנוסף, הארת פחות פיקסלים במסך מפחית את צריכת הסוללה משמעותית.למעשה בדיקות בגוגל מצאו כי דארק ט’ים חוסך עד 60% מצריכת הסוללה כשהאפליקציה בפורגראונד.
ואחרון, נגישות, דארק ט’ים פחות מאמץ את העיניים ולהרבה אנשים שיותר נוח
אז יש כמה דרכים להפעיל דארק ט’ים באנדרואיד קיו - האופציה הראשונה היא דרך הדיספליי סטינגס
אופציה שנייה דרך הקוייק סטינגס
והאופציה השלישית דרך מצב בטרי סייבר במכשירי פיקסל .
חשוב להבין כי מעבר לדארק ט’ים זה לא רק מעבר של המערכת ליו איי תואם אלה זה נוגע בכל האפליקציות. יוזרים יצפו שהאפליקציה שלכם תתנהג בהתאם ולכן חשוב לתמוך בדארק ט’ים
דיינייט הוא פיצ’ר באפקומפט שעוזר לנו ליישם בקלות דארקט’ים באפליקציה. הוא יקח רסורסים מהנייט קווליפייר בדארק ט’ם. עובד מאנדרואיד 4.0. ושופר אפקומפט 1.1
דיינייט הוא פיצ’ר באפקומפט שעוזר לנו ליישם בקלות דארקט’ים באפליקציה. הוא יקח רסורסים מהנייט קווליפייר בדארק ט’ם. עובד מאנדרואיד 4.0. ושופר אפקומפט 1.1
בשביל להשתמש בדיינייט הדבר הראשון שצריך לעשות הוא לשנות את הפרנט של הט’ים שלכם לאחד הט’ימים של דיינייט
Google recommend using Material Design Components, since its color theming system (such as the theme attributes ?attr/colorSurface and ?attr/colorOnSurface) provides easy access to suitable colors.
כפי שציינתי קודם אפקומפט מאפשרת ליצור ריסורס קווליפייר של נייט. ככה בדיוק הט’ים מיושם, בלייט ט’ים יש דוט לייט ובנייט ט’ים ייושם הט’ים הכהה..
כפי שציינתי קודם אפקומפט מאפשרת ליצור ריסורס קווליפייר של נייט. ככה בדיוק הט’ים מיושם, בלייט ט’ים יש דוט לייט ובנייט ט’ים ייושם הט’ים הכהה..
כפי שציינתי קודם אפקומפט מאפשרת ליצור ריסורס קווליפייר של נייט. ככה בדיוק הט’ים מיושם, בלייט ט’ים יש דוט לייט ובנייט ט’ים ייושם הט’ים הכהה..
נייט אוטו- באטרי -דארקמוד מופעל בכל פעם שבטרי סייבר פועל מאייפיאי 21
נייט אוטו- באטרי -דארקמוד מופעל בכל פעם שבטרי סייבר פועל מאייפיאי 21
נייט אוטו- באטרי -דארקמוד מופעל בכל פעם שבטרי סייבר פועל מאייפיאי 21
נייט אוטו- באטרי -דארקמוד מופעל בכל פעם שבטרי סייבר פועל מאייפיאי 21
הדבר הבא שצריך לעשות הוא להגיד לאפקומפט באיזה מוד להשתמש. יש לנו שני אייפיי’ס לזה, הראשון סטדיפולט נייט מוד. הוא משמש כשרוצים להגדיר מוד עבור כל האפליקציה, כל האקטיביטיס. אם רוצים להגדיר מוד עבור אקטיביטי מסויים ניתן להשתמש בסט לוקל נייט מוד
הדבר הבא שצריך לעשות הוא להגיד לאפקומפט באיזה מוד להשתמש. יש לנו שני אייפיי’ס לזה, הראשון סטדיפולט נייט מוד. הוא משמש כשרוצים להגדיר מוד עבור כל האפליקציה, כל האקטיביטיס. אם רוצים להגדיר מוד עבור אקטיביטי מסויים ניתן להשתמש בסט לוקל נייט מוד
In activity - call prior to super() in onCreate()
דארק ט’ים זה אחלה.. אבל נשמע כמו ימבה עבודה
We won’t know exactly how this feature works until the source code for Android Q is released or Google publishes documentation for it, though.
בשביל להפעיל פורס דארק צריך להוסיף פורס דארק לטרו. בדוגמה כאן אני מפעילה פורס דארק בט’ים של האפליקציה ככה הוא יופעל בכל מקום באפליקציה. אבל אפשר לבחור איפה להפעיל אותו, ככה שאפשר להפעיל אותו רק עבור אקטיבי אחד או שניים.
כדאי לבדוק טוב טוב את האפליקציה לפני שמפעילים פורס דארק על כל האפליקציה. אם רואים דברים מוזרים אז פשוט משתמשים בפונקציות האלה וזה יסדר אתכם.
כדאי לבדוק טוב טוב את האפליקציה לפני שמפעילים פורס דארק על כל האפליקציה. אם רואים דברים מוזרים אז פשוט משתמשים בפונקציות האלה וזה יסדר אתכם.
הבאסה היא שפורסדארק עובד רק מאנדרואיד קיו. לכן כדאי לתמוך בדארק ט’ים ע”י יצירת קוסטום ט’ים. סיבה נוספת לייצירת קוסטום ט’ים היא שעם פורסדארק אין לנו שליטה איך המסך יראה
הדבר הבא שצריך לעשות הוא להגיד לאפקומפט באיזה מוד להשתמש. יש לנו שני אייפיי’ס לזה, הראשון סטדיפולט נייט מוד. הוא משמש כשרוצים להגדיר מוד עבור כל האפליקציה, כל האקטיביטיס. אם רוצים להגדיר מוד עבור אקטיביטי מסויים ניתן להשתמש בסט לוקל נייט מוד
בבלס הוא אלטרנטיבה לסיסטם אלרט ווינדו. הוא חדש בקיו כדבלופר פרויו, ניתן למצוא את זה בדוולופר אופשיינס. בגרסת בטה זה יפעל אוטומטית..
יכולים להתרחב ולחשוף פונקציונליות ומידע, ולהתכווץ חזרה. המסך המורחב זה בעצם אקטיביטי
יכולים להתרחב ולחשוף פונקציונליות ומידע, ולהתכווץ חזרה. המסך המורחב זה בעצם אקטיביטי
יכולים להתרחב ולחשוף פונקציונליות ומידע, ולהתכווץ חזרה. המסך המורחב זה בעצם אקטיביטי
אז בשביל בניית בבל צריך :
אחד, לבנות את האקטיביטי שמוצגת בבבל.
שתיים לבנות בבלמטאדאטה
שלוש, להוסיף את המטאדאטה לנוטיפיקציה ולשלוח
אז דבר ראשון צריך אקטיביטי שתהיה המצב האקספנדד של הבבל. ישנם שלושה דברים שחייבים להיות לאקטיביטי בשביל שהיא תהיה בבל - אמבדבל, דוקומנטלונצ’ מוד תמיד ורסייזאבל. אם אחד מאלה חסר אז הבבל יהיה פשוט נוטיפיקציה רגילה.
אז דבר ראשון צריך אקטיביטי שתהיה המצב האקספנדד של הבבל. ישנם שלושה דברים שחייבים להיות לאקטיביטי בשביל שהיא תהיה בבל - אמבדבל, דוקומנטלונצ’ מוד תמיד ורסייזאבל. אם אחד מאלה חסר אז הבבל יהיה פשוט נוטיפיקציה רגילה.
אז דבר ראשון צריך אקטיביטי שתהיה המצב האקספנדד של הבבל. ישנם שלושה דברים שחייבים להיות לאקטיביטי בשביל שהיא תהיה בבל - אמבדבל, דוקומנטלונצ’ מוד תמיד ורסייזאבל. אם אחד מאלה חסר אז הבבל יהיה פשוט נוטיפיקציה רגילה.
אז דבר ראשון צריך אקטיביטי שתהיה המצב האקספנדד של הבבל. ישנם שלושה דברים שחייבים להיות לאקטיביטי בשביל שהיא תהיה בבל - אמבדבל, דוקומנטלונצ’ מוד תמיד ורסייזאבל. אם אחד מאלה חסר אז הבבל יהיה פשוט נוטיפיקציה רגילה.
ואז יוצרים בבל מטאדאטה עם האייפיאי החדש. כל מה שצריך זה אייקון ואת הפנדינג אינטנט.
ואז יוצרים בבל מטאדאטה עם האייפיאי החדש. כל מה שצריך זה אייקון ואת הפנדינג אינטנט.
ואז יוצרים בבל מטאדאטה עם האייפיאי החדש. כל מה שצריך זה אייקון ואת הפנדינג אינטנט.
ואז יוצרים בבל מטאדאטה עם האייפיאי החדש. כל מה שצריך זה אייקון ואת הפנדינג אינטנט.
ואז בונים נוטיפיקציה כרגיל ורק מוסיפים את הבבל מטאדטה
ואז בונים נוטיפיקציה כרגיל ורק מוסיפים את הבבל מטאדטה
Q BETA 2
קצת פירוט על הכללים -
קצת פירוט על הכללים -
When a bubble is expanded, the content activity goes through the normal process lifecycle, resulting in the application becoming a foreground process (if not already).
When the bubble is collapsed or dismissed the activity will be destroyed. This may result in the process being cached and later killed, depending on whether the app has any other foreground components running.
.אז אני רוצה לנצל עכשיו רגע בשביל לשתף אתכם בחוויה להיות בגוגל איי או, פסטיבל ענק עם האנשים שלימדו אותי אנדרואיד בישראל, ועם האנשים שלימדו אותי אנדרואיד באינטרנט. היה פשוט אדיר.השנה בגוגל איי או גוגל שמו דגש מיוחד על הצורך והחשיבות בשיתוף .
גוגל מציגים שיירים שיט חדש. המכיל קונטנטפרוי - מידע על התוכן אותו רוצים לשתף, אפשר להוסיף תמונה ו/או טקסט
איי פי איי חדש שיירינג שורטקאטטס
העתק לקליפבורד
ושיפור ביצועים
אז קודם כל נדבר על האייפי איי החדש לשיירינג שורטקאט, בדוגמה כאן רואים 4 קיצורים אבל השרייניג שיט החדש תומך בעד 8 קיצורים חדשים
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
בשביל ליצור שיירינגשורטקאט צריך לבנות קישור דינאמי כרגיל, עם תוספת של שדה קטגוריה (חובה), וכדאי גם להוסיף שדה של פרסן. שיירינג שורטקאט חייב להיות מקושר עם אקטיביטי שתואמת את הקטגוריה , והאקטיביטי חייבת להיות בעלת אקשיין סנד אינטנט פילטר(מה שכבר קיים אם האקטיביטי שלכם כבר בשייר שיט)
ואיך מוסיפים מידע על התוכן שאנחנו רוצים לשתף
בשביל להוסיף תוכן משמעותי לשיירינג שיט צריך לעשות שיירינג אינטנט כרגיל.
ואז מוסיפים את המטאדאטה לפני הקריאה לקרייטצ’וזר.
שימו לב לתת את ההרשאות המתאימות בשביל שהמערכת תקרא את הט’מבנייל, אחרת התמונה לא תופיעה
בשביל להוסיף תוכן משמעותי לשיירינג שיט צריך לעשות שיירינג אינטנט כרגיל.
ואז מוסיפים את המטאדאטה לפני הקריאה לקרייטצ’וזר.
שימו לב לתת את ההרשאות המתאימות בשביל שהמערכת תקרא את הט’מבנייל, אחרת התמונה לא תופיעה
בשביל להוסיף תוכן משמעותי לשיירינג שיט צריך לעשות שיירינג אינטנט כרגיל.
ואז מוסיפים את המטאדאטה לפני הקריאה לקרייטצ’וזר.
שימו לב לתת את ההרשאות המתאימות בשביל שהמערכת תקרא את הט’מבנייל, אחרת התמונה לא תופיעה
בשביל להוסיף תוכן משמעותי לשיירינג שיט צריך לעשות שיירינג אינטנט כרגיל.
ואז מוסיפים את המטאדאטה לפני הקריאה לקרייטצ’וזר.
שימו לב לתת את ההרשאות המתאימות בשביל שהמערכת תקרא את הט’מבנייל, אחרת התמונה לא תופיעה