├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── ic_launcher-web.png
│ │ ├── res
│ │ │ ├── drawable
│ │ │ │ ├── build.png
│ │ │ │ ├── push.png
│ │ │ │ ├── test.png
│ │ │ │ ├── crashes.png
│ │ │ │ ├── mclogo.png
│ │ │ │ ├── analytics.png
│ │ │ │ └── distribute.png
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── values
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── styles.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── strings.xml
│ │ │ ├── values-w820dp
│ │ │ │ └── dimens.xml
│ │ │ └── layout
│ │ │ │ ├── activity_root.xml
│ │ │ │ ├── push_root.xml
│ │ │ │ ├── distribute_root.xml
│ │ │ │ ├── test_root.xml
│ │ │ │ ├── build_root.xml
│ │ │ │ ├── welcome_root.xml
│ │ │ │ ├── crashes_root.xml
│ │ │ │ └── analytics_root.xml
│ │ ├── java
│ │ │ └── ms
│ │ │ │ └── appcenter
│ │ │ │ └── sampleapp
│ │ │ │ └── android
│ │ │ │ ├── PushActivity.java
│ │ │ │ ├── TestActivity.java
│ │ │ │ ├── BuildActivity.java
│ │ │ │ ├── WelcomeActivity.java
│ │ │ │ ├── DistributeActivity.java
│ │ │ │ ├── CrashesActivity.java
│ │ │ │ ├── AnalyticsActivity.java
│ │ │ │ └── MainActivity.java
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── ms
│ │ │ └── appcenter
│ │ │ └── sampleapp
│ │ │ └── android
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── ms
│ │ └── appcenter
│ │ └── sampleapp
│ │ └── android
│ │ └── ExampleInstrumentedTest.java
├── appcenter-post-build.sh
├── appcenter-post-clone.sh
├── appcenter-pre-build.sh
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── fastlane
├── Pluginfile
├── Appfile
└── Fastfile
├── Gemfile
├── azure-pipelines.yml
├── gradle.properties
├── .gitignore
├── gradlew.bat
├── SECURITY.md
├── README.md
├── Gemfile.lock
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/ic_launcher-web.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/build.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/build.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/push.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/push.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/test.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/drawable/crashes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/crashes.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/mclogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/mclogo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/analytics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/analytics.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/distribute.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/drawable/distribute.png
--------------------------------------------------------------------------------
/fastlane/Pluginfile:
--------------------------------------------------------------------------------
1 | # Autogenerated by fastlane
2 | #
3 | # Ensure this file is checked in to source control!
4 |
5 | gem 'fastlane-plugin-appcenter'
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/appcenter-sampleapp-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/appcenter-post-build.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | echo "This is an App Center Post-Build script. For more information on how to use App Center build scripts vist: https://docs.microsoft.com/en-us/appcenter/build/custom/scripts"
4 |
--------------------------------------------------------------------------------
/app/appcenter-post-clone.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | echo "This is an App Center Post-Clone script. For more information on how to use App Center build scripts vist: https://docs.microsoft.com/en-us/appcenter/build/custom/scripts"
4 |
--------------------------------------------------------------------------------
/app/appcenter-pre-build.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | echo "This is an App Center Pre-Build script. For more information on how to use App Center build scripts vist: https://docs.microsoft.com/en-us/appcenter/build/custom/scripts"
4 |
--------------------------------------------------------------------------------
/fastlane/Appfile:
--------------------------------------------------------------------------------
1 | package_name("ms.appcenter.sampleapp.android") # e.g. com.krausefx.app
2 |
3 | ## If you want to configure fastlane to upload to the Google Play Store
4 | # json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
5 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Apr 27 12:02:06 MSK 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 | 8dp
7 |
8 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | source "https://rubygems.org"
4 |
5 | git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6 |
7 | # gem "rails"
8 |
9 | gem "fastlane", "~> 2.137"
10 |
11 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
12 | eval_gemfile(plugins_path) if File.exist?(plugins_path)
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/test/java/ms/appcenter/sampleapp/android/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.assertEquals;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/PushActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import androidx.fragment.app.Fragment;
9 |
10 | public class PushActivity extends Fragment {
11 | @Override
12 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
13 | Bundle savedInstanceState) {
14 | ViewGroup rootView = (ViewGroup) inflater.inflate(
15 | R.layout.push_root, container, false);
16 | return rootView;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/TestActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import androidx.fragment.app.Fragment;
9 |
10 | public class TestActivity extends Fragment {
11 | @Override
12 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
13 | Bundle savedInstanceState) {
14 | ViewGroup rootView = (ViewGroup) inflater.inflate(
15 | R.layout.test_root, container, false);
16 | return rootView;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/BuildActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import androidx.fragment.app.Fragment;
9 |
10 | public class BuildActivity extends Fragment {
11 |
12 | @Override
13 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
14 | Bundle savedInstanceState) {
15 | ViewGroup rootView = (ViewGroup) inflater.inflate(
16 | R.layout.build_root, container, false);
17 | return rootView;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/WelcomeActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import androidx.fragment.app.Fragment;
9 |
10 | public class WelcomeActivity extends Fragment {
11 | @Override
12 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
13 | Bundle savedInstanceState) {
14 | ViewGroup rootView = (ViewGroup) inflater.inflate(
15 | R.layout.welcome_root, container, false);
16 | return rootView;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/DistributeActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.os.Bundle;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import androidx.fragment.app.Fragment;
9 |
10 | public class DistributeActivity extends Fragment {
11 |
12 | @Override
13 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
14 | Bundle savedInstanceState) {
15 | ViewGroup rootView = (ViewGroup) inflater.inflate(
16 | R.layout.distribute_root, container, false);
17 | return rootView;
18 | }
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/azure-pipelines.yml:
--------------------------------------------------------------------------------
1 | # Android
2 | # Build your Android project with Gradle.
3 | # Add steps that test, sign, and distribute the APK, save build artifacts, and more:
4 | # https://docs.microsoft.com/azure/devops/pipelines/languages/android
5 |
6 | trigger:
7 | branches:
8 | include:
9 | - master
10 | pr:
11 | - master
12 |
13 | pool:
14 | vmImage: 'macos-latest'
15 |
16 | steps:
17 | - task: Gradle@2
18 | inputs:
19 | gradleWrapperFile: '$(Build.Repository.LocalPath)/gradlew'
20 | workingDirectory: '$(Build.Repository.LocalPath)'
21 | tasks: 'clean build test assembleRelease assembleDebug assembleAndroidTest'
22 | publishJUnitResults: true
23 | testResultsFiles: '**/TEST-*.xml'
24 | javaHomeOption: 'JDKVersion'
25 | jdkVersionOption: '1.8'
26 | gradleOptions: '-Xmx3072m'
27 | sonarQubeRunAnalysis: false
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | android.enableJetifier=true
13 | android.useAndroidX=true
14 | org.gradle.jvmargs=-Xmx1536m
15 |
16 | # When configured, Gradle will run in incubating parallel mode.
17 | # This option should only be used with decoupled projects. More details, visit
18 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
19 | # org.gradle.parallel=true
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | lt application files
2 | *.apk
3 | *.ap_
4 |
5 | # Files for the ART/Dalvik VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # Generated files
12 | bin/
13 | gen/
14 | out/
15 |
16 | # Gradle files
17 | .gradle/
18 | build/
19 | /*/build/
20 |
21 | # Local configuration file (sdk path, etc)
22 | local.properties
23 |
24 | # Proguard folder generated by Eclipse
25 | proguard/
26 |
27 | # Log Files
28 | *.log
29 |
30 | # Android Studio Navigation editor temp files
31 | .navigation/
32 |
33 | # Android Studio captures folder
34 | captures/
35 |
36 | # Intellij
37 | *.iml
38 | .idea/
39 |
40 | # Keystore files
41 | *.jks
42 |
43 | # Mac files
44 | .DS_Store
45 |
46 | # Google credentials files
47 | google-services.json*.iml
48 |
49 | fastlane/.env
50 |
51 | app/release/
52 |
53 | fastlane/README.md
54 |
55 | fastlane/report.xml
56 |
57 | .project
58 |
59 | .settings/
60 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/tina/Library/Android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # Uncomment this to preserve the line number information for
20 | # debugging stack traces.
21 | #-keepattributes SourceFile,LineNumberTable
22 |
23 | # If you keep the line number information, uncomment this to
24 | # hide the original source file name.
25 | #-renamesourcefileattribute SourceFile
26 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #252525
5 | #282828
6 |
7 | #ffc326
8 | #F56D4F
9 | #91CA47
10 | #44B8A8
11 | #24B8D4
12 | #0078d7
13 | #252525
14 |
15 | #fdad00
16 | #e2553d
17 | #6FA22E
18 | #38A495
19 | #3192B3
20 | #0064c3
21 | #CB2E62
22 |
23 |
24 |
--------------------------------------------------------------------------------
/fastlane/Fastfile:
--------------------------------------------------------------------------------
1 | default_platform(:android)
2 |
3 | platform :android do
4 | desc "Runs all the tests"
5 | lane :test do
6 | gradle(task: "test")
7 | end
8 |
9 | desc "Deploy to AppCenter"
10 | lane :deployAppCenter do
11 | gradle(
12 | task: "clean assembleRelease"
13 | )
14 |
15 | api_token = ENV["APPCENTER_API_TOKEN"]
16 | owner_name = ENV["APPCENTER_OWNER_NAME"]
17 | app_name = ENV["APPCENTER_APP_NAME"]
18 | ## You can use the following line to provide a default value if the environment variable doesn't exist
19 | # app_name ||= "appcenter-sampleapp-android"
20 |
21 | appcenter_upload(
22 | api_token: api_token,
23 | owner_name: owner_name,
24 | owner_type: "organization", # Default is user - set to organization for appcenter organizations
25 | destinations: "*", # Default is 'Collaborators', use '*' for all distribution groups
26 | app_name: app_name,
27 | file: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH],
28 | mapping: Actions.lane_context[SharedValues::GRADLE_MAPPING_TXT_OUTPUT_PATH],
29 | notify_testers: false # Set to false if you don't want to notify testers of your new release or true if you do (default: `false`)
30 | )
31 | end
32 | end
33 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/ms/appcenter/sampleapp/android/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.ext.junit.runners.AndroidJUnit4;
6 | import androidx.test.platform.app.InstrumentationRegistry;
7 |
8 | import org.junit.Rule;
9 | import org.junit.After;
10 | import com.microsoft.appcenter.espresso.Factory;
11 | import com.microsoft.appcenter.espresso.ReportHelper;
12 |
13 | import org.junit.Test;
14 | import org.junit.runner.RunWith;
15 |
16 | import static org.junit.Assert.assertEquals;
17 |
18 | /**
19 | * Instrumentation test, which will execute on an Android device.
20 | *
21 | * @see Testing documentation
22 | */
23 | @RunWith(AndroidJUnit4.class)
24 | public class ExampleInstrumentedTest {
25 | @Rule
26 | public ReportHelper reportHelper = Factory.getReportHelper();
27 |
28 | @After
29 | public void TearDown() {
30 | reportHelper.label("Stopping App");
31 | }
32 |
33 | @Test
34 | public void useAppContext() {
35 | // Context of the app under test.
36 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
37 |
38 | assertEquals("ms.appcenter.sampleapp.android", appContext.getPackageName());
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
17 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/push_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
20 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/distribute_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
20 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/test_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
21 |
22 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/build_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
21 |
22 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/welcome_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
21 |
22 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/CrashesActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.app.Dialog;
4 | import android.os.Bundle;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.Button;
9 |
10 | import androidx.appcompat.app.AlertDialog;
11 | import androidx.fragment.app.DialogFragment;
12 | import androidx.fragment.app.Fragment;
13 |
14 | public class CrashesActivity extends Fragment {
15 |
16 | @Override
17 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
18 | Bundle savedInstanceState) {
19 | ViewGroup rootView = (ViewGroup) inflater.inflate(
20 | R.layout.crashes_root, container, false);
21 |
22 | Button crashButton = rootView.findViewById(R.id.crashButton);
23 | crashButton.setOnClickListener(view -> {
24 | DialogFragment crashDialog = new CrashDialog();
25 | crashDialog.show(getFragmentManager(), "crashDialog");
26 | });
27 |
28 | return rootView;
29 | }
30 |
31 | public static class CrashDialog extends DialogFragment {
32 | public Dialog onCreateDialog(Bundle savedInstanceState) {
33 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
34 | builder.setMessage("A crash report will be sent when you reopen the app.")
35 | .setPositiveButton("Crash app", (dialog, id) -> {
36 | throw new RuntimeException("crashing");
37 | }).setNegativeButton("Cancel", (dialog, id) -> {
38 | // Add any code you'd like to execute when users click "Cancel"
39 | });
40 | return builder.create();
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | AC Sample App
3 |
4 | "Get information about the number of daily, weekly, and monthly users, session duration, the top devices and more. Use events to collect rich behavioral analytics data."
5 | "Engage your users by sending them targeted messages to specific sets of users at exactly the right time.Create segments of users based on device and custom properties."
6 | "Create an installable app package automatically with every push to your repository. Supports GitHub, or Git repos on Bitbucket and Visual Studio Team Services (VSTS).\n\nNo additional build hardware required."
7 | "Run your tests on more than 400 unique device configurations. Tests can be written for iOS and Android apps with Xamarin.UITest, Appium, Espresso (Android), and XCUITest (iOS).\n\nBacked by Xamarin Test Cloud."
8 | "Users can install the app via email distribution lists for testing, much as they\'d download an app from the app store.\n\nBacked by HockeyApp."
9 | "Collect crashes from all devices, prioritize them based on the number of users seeing the crash, and get the full stack traces to help you fix them.\n\nBacked by HockeyApp."
10 | "Visual Studio App Center is mission control for apps. It brings together multiple services, commonly used for mobile developers, into a single, integrated product.\n\n\nSwipe right to learn about our services"
11 |
12 | "Send a sample crash"
13 | "Send a sample event"
14 | "Send event with color property"
15 |
16 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 29
5 | buildToolsVersion "29.0.2"
6 | defaultConfig {
7 | applicationId "ms.appcenter.sampleapp.android"
8 | minSdkVersion 16
9 | targetSdkVersion 29
10 | versionCode 1
11 | versionName "1.0"
12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
13 | // Obtain the value of APPCENTER_APP_SECRET environment variable from Build time.
14 | buildConfigField("String", "APPCENTER_APP_SECRET", "\"\"")
15 | if (System.getenv("APPCENTER_APP_SECRET") != null) {
16 | buildConfigField("String", "APPCENTER_APP_SECRET", "\"${System.getenv("APPCENTER_APP_SECRET")}\"")
17 | }
18 | }
19 | buildTypes {
20 | release {
21 | minifyEnabled true
22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 | compileOptions {
26 | sourceCompatibility = 1.8
27 | targetCompatibility = 1.8
28 | }
29 | }
30 |
31 | dependencies {
32 | implementation fileTree(include: ['*.jar'], dir: 'libs')
33 | implementation 'androidx.appcompat:appcompat:1.1.0'
34 | implementation 'com.google.android.material:material:1.1.0'
35 |
36 | def appCenterSdkVersion = '2.5.1'
37 | implementation "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}"
38 | implementation "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}"
39 | implementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
40 |
41 | // Unit Testing
42 | testImplementation 'androidx.test.ext:junit:1.1.1'
43 |
44 | // Espresso UI Testing
45 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
46 | androidTestImplementation('androidx.test.espresso:espresso-core:3.2.0', {
47 | exclude group: 'com.android.support', module: 'support-annotations'
48 | })
49 |
50 | androidTestImplementation('com.microsoft.appcenter:espresso-test-extension:1.4')
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/crashes_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
20 |
21 |
32 |
33 |
50 |
51 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/analytics_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
20 |
21 |
34 |
35 |
46 |
47 |
63 |
64 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | ## Security
4 |
5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
6 |
7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
8 |
9 | ## Reporting Security Issues
10 |
11 | **Please do not report security vulnerabilities through public GitHub issues.**
12 |
13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
14 |
15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
16 |
17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
18 |
19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
20 |
21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
22 | * Full paths of source file(s) related to the manifestation of the issue
23 | * The location of the affected source code (tag/branch/commit or direct URL)
24 | * Any special configuration required to reproduce the issue
25 | * Step-by-step instructions to reproduce the issue
26 | * Proof-of-concept or exploit code (if possible)
27 | * Impact of the issue, including how an attacker might exploit the issue
28 |
29 | This information will help us triage your report more quickly.
30 |
31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
32 |
33 | ## Preferred Languages
34 |
35 | We prefer all communications to be in English.
36 |
37 | ## Policy
38 |
39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
40 |
41 |
42 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/AnalyticsActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.app.Dialog;
4 | import android.os.Bundle;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.Button;
9 |
10 | import androidx.appcompat.app.AlertDialog;
11 | import androidx.fragment.app.DialogFragment;
12 | import androidx.fragment.app.Fragment;
13 |
14 | import com.microsoft.appcenter.analytics.Analytics;
15 |
16 | import java.util.HashMap;
17 | import java.util.Map;
18 |
19 | public class AnalyticsActivity extends Fragment {
20 |
21 | @Override
22 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
23 | Bundle savedInstanceState) {
24 | ViewGroup rootView = (ViewGroup) inflater.inflate(
25 | R.layout.analytics_root, container, false);
26 |
27 | Button eventButton = rootView.findViewById(R.id.customEventButton);
28 | eventButton.setOnClickListener(view -> {
29 | DialogFragment eventDialog = new EventDialog();
30 | eventDialog.show(getFragmentManager(), "eventDialog");
31 | });
32 |
33 | Button colorButton = rootView.findViewById(R.id.customColorButton);
34 | colorButton.setOnClickListener(view -> {
35 | DialogFragment colorDialog = new ColorDialog();
36 | colorDialog.show(getFragmentManager(), "colorDialog");
37 | });
38 | return rootView;
39 | }
40 |
41 | public static class EventDialog extends DialogFragment {
42 | public Dialog onCreateDialog(Bundle savedInstanceState) {
43 | Analytics.trackEvent("Sample event");
44 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
45 | builder.setMessage("Event sent").setPositiveButton("OK", (dialog, id) -> {
46 | // Insert any code here that you want triggered by the Click Event
47 | });
48 | return builder.create();
49 | }
50 | }
51 |
52 | public static class ColorDialog extends DialogFragment {
53 | public Dialog onCreateDialog(Bundle savedInstanceState) {
54 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
55 | CharSequence[] colors = {"Yellow", "Blue", "Red"};
56 | builder.setTitle("Pick a color").setItems(colors, (dialog, index) -> {
57 | Map properties = new HashMap<>();
58 | switch (index) {
59 | case 0:
60 | properties.put("Color", "Yellow");
61 | break;
62 | case 1:
63 | properties.put("Color", "Blue");
64 | break;
65 | case 2:
66 | properties.put("Color", "Red");
67 | break;
68 | }
69 | Analytics.trackEvent("Color event", properties);
70 |
71 | });
72 | return builder.create();
73 | }
74 | }
75 | }
76 |
77 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Visual Studio App Center Sample App for Android
2 |
3 | The Android application in this repository and its corresponding tutorials will help you quickly and easily onboard to Visual Studio App Center.
4 |
5 | ## About this repository
6 |
7 | The App Center SDK modules are already integrated within the application. Simply follow the tutorials to learn how to use each service.
8 |
9 | ### Build status (master branch)
10 |
11 | | Build Service | Status |
12 | | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
13 | | App Center | [](https://appcenter.ms) |
14 | | Azure Pipelines | [](https://dev.azure.com/msmobilecenter/Mobile-Center/_build/latest?definitionId=3725&branchName=master) |
15 |
16 | ## Tutorials
17 |
18 | First navigate to the **Getting Started** tutorial linked below. After following that tutorial, you can choose which App Center service to explore.
19 |
20 | ## Contents
21 |
22 | | Tutorial | Description |
23 | | ------------------------------------------------------------------------------------------------- | ------------------------------------------ |
24 | | [Getting Started](https://docs.microsoft.com/en-us/appcenter/quickstarts/android/getting-started) | Set up the app |
25 | | [Build](https://docs.microsoft.com/en-us/appcenter/quickstarts/android/build) | Build the app |
26 | | [Test](https://docs.microsoft.com/en-us/appcenter/quickstarts/android/test) | Run automated UI tests on real devices |
27 | | [Distribute](https://docs.microsoft.com/en-us/appcenter/quickstarts/android/distribute) | Distribute application to a group of users |
28 | | [Crashes](https://docs.microsoft.com/en-us/appcenter/quickstarts/android/crashes) | Monitor application crashes |
29 | | [Analytics](https://docs.microsoft.com/en-us/appcenter/quickstarts/android/analytics) | View user analytics |
30 |
31 | ### Added functionality
32 |
33 | Using Gradle you can pass environment variables into your Build Configuration and use them as variables within your application.
34 |
35 | For more information on how to do so, visit our docs here: [Build time environment variables using Gradle](https://docs.microsoft.com/en-us/appcenter/build/custom/variables/#buildgradle-for-android)
36 |
37 | And if you want to try it out, you can fork this repository and add your App Secret by adding the APPCENTER_APP_SECRET environment variable in hte App Center Build configuration.
38 |
--------------------------------------------------------------------------------
/app/src/main/java/ms/appcenter/sampleapp/android/MainActivity.java:
--------------------------------------------------------------------------------
1 | package ms.appcenter.sampleapp.android;
2 |
3 | import android.os.Bundle;
4 | import android.util.Log;
5 |
6 | import androidx.annotation.IntRange;
7 | import androidx.annotation.NonNull;
8 | import androidx.appcompat.app.AppCompatActivity;
9 | import androidx.fragment.app.Fragment;
10 | import androidx.fragment.app.FragmentManager;
11 | import androidx.fragment.app.FragmentPagerAdapter;
12 | import androidx.viewpager.widget.ViewPager;
13 |
14 | import com.microsoft.appcenter.AppCenter;
15 | import com.microsoft.appcenter.analytics.Analytics;
16 | import com.microsoft.appcenter.crashes.Crashes;
17 | import com.microsoft.appcenter.distribute.Distribute;
18 |
19 |
20 | public class MainActivity extends AppCompatActivity {
21 |
22 | private SectionsPagerAdapter mSectionsPagerAdapter;
23 | private ViewPager mViewPager;
24 |
25 | private final Fragment[] views = {
26 | new WelcomeActivity(),
27 | new BuildActivity(),
28 | new TestActivity(),
29 | new DistributeActivity(),
30 | new CrashesActivity(),
31 | new AnalyticsActivity(),
32 | new PushActivity()
33 | };
34 |
35 | @Override
36 | protected void onCreate(Bundle savedInstanceState) {
37 | super.onCreate(savedInstanceState);
38 | setContentView(R.layout.activity_root);
39 |
40 | // Initialize SDK
41 | if (!BuildConfig.APPCENTER_APP_SECRET.equals("")) {
42 | // Use APPCENTER_APP_SECRET environment variable if it exists
43 | AppCenter.start(getApplication(), BuildConfig.APPCENTER_APP_SECRET,
44 | Analytics.class, Crashes.class, Distribute.class);
45 | } else {
46 | // Otherwise use the hardcoded string value here
47 | AppCenter.start(getApplication(), "",
48 | Analytics.class, Crashes.class, Distribute.class);
49 | }
50 |
51 |
52 | if (BuildConfig.DEBUG) {
53 | AppCenter.setLogLevel(Log.VERBOSE);
54 | }
55 |
56 | // UI Elements
57 | mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
58 |
59 | mViewPager = findViewById(R.id.container);
60 | mViewPager.setAdapter(mSectionsPagerAdapter);
61 | }
62 |
63 | public class SectionsPagerAdapter extends FragmentPagerAdapter {
64 |
65 | public SectionsPagerAdapter(FragmentManager fm) {
66 | super(fm);
67 | }
68 |
69 | @NonNull
70 | @Override
71 | public Fragment getItem(@IntRange(from = 0, to = 6) final int position) {
72 | return views[position];
73 | }
74 |
75 | @Override
76 | public int getCount() {
77 | return views.length;
78 | }
79 |
80 | @Override
81 | public CharSequence getPageTitle(@IntRange(from = 0, to = 6) final int position) {
82 | if (views[position] instanceof WelcomeActivity) {
83 | return "Welcome";
84 | } else if (views[position] instanceof BuildActivity) {
85 | return "Build";
86 | } else if (views[position] instanceof TestActivity) {
87 | return "Test";
88 | } else if (views[position] instanceof DistributeActivity) {
89 | return "Distribute";
90 | } else if (views[position] instanceof CrashesActivity) {
91 | return "Crashes";
92 | } else if (views[position] instanceof AnalyticsActivity) {
93 | return "Analytics";
94 | } else if (views[position] instanceof PushActivity) {
95 | return "Push";
96 | }
97 |
98 | return views[position].getClass().getSimpleName().trim().replace("Activity", "");
99 | }
100 | }
101 | }
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | CFPropertyList (3.0.2)
5 | addressable (2.8.0)
6 | public_suffix (>= 2.0.2, < 5.0)
7 | atomos (0.1.3)
8 | babosa (1.0.3)
9 | claide (1.0.3)
10 | colored (1.2)
11 | colored2 (3.1.2)
12 | commander-fastlane (4.4.6)
13 | highline (~> 1.7.2)
14 | declarative (0.0.10)
15 | declarative-option (0.1.0)
16 | digest-crc (0.4.1)
17 | domain_name (0.5.20190701)
18 | unf (>= 0.0.5, < 1.0.0)
19 | dotenv (2.7.5)
20 | emoji_regex (1.0.1)
21 | excon (0.71.0)
22 | faraday (0.17.1)
23 | multipart-post (>= 1.2, < 3)
24 | faraday-cookie_jar (0.0.6)
25 | faraday (>= 0.7.4)
26 | http-cookie (~> 1.0.0)
27 | faraday_middleware (0.13.1)
28 | faraday (>= 0.7.4, < 1.0)
29 | fastimage (2.1.7)
30 | fastlane (2.137.0)
31 | CFPropertyList (>= 2.3, < 4.0.0)
32 | addressable (>= 2.3, < 3.0.0)
33 | babosa (>= 1.0.2, < 2.0.0)
34 | bundler (>= 1.12.0, < 3.0.0)
35 | colored
36 | commander-fastlane (>= 4.4.6, < 5.0.0)
37 | dotenv (>= 2.1.1, < 3.0.0)
38 | emoji_regex (>= 0.1, < 2.0)
39 | excon (>= 0.45.0, < 1.0.0)
40 | faraday (~> 0.17)
41 | faraday-cookie_jar (~> 0.0.6)
42 | faraday_middleware (~> 0.13.1)
43 | fastimage (>= 2.1.0, < 3.0.0)
44 | gh_inspector (>= 1.1.2, < 2.0.0)
45 | google-api-client (>= 0.21.2, < 0.24.0)
46 | google-cloud-storage (>= 1.15.0, < 2.0.0)
47 | highline (>= 1.7.2, < 2.0.0)
48 | json (< 3.0.0)
49 | jwt (~> 2.1.0)
50 | mini_magick (>= 4.9.4, < 5.0.0)
51 | multi_xml (~> 0.5)
52 | multipart-post (~> 2.0.0)
53 | plist (>= 3.1.0, < 4.0.0)
54 | public_suffix (~> 2.0.0)
55 | rubyzip (>= 1.3.0, < 2.0.0)
56 | security (= 0.1.3)
57 | simctl (~> 1.6.3)
58 | slack-notifier (>= 2.0.0, < 3.0.0)
59 | terminal-notifier (>= 2.0.0, < 3.0.0)
60 | terminal-table (>= 1.4.5, < 2.0.0)
61 | tty-screen (>= 0.6.3, < 1.0.0)
62 | tty-spinner (>= 0.8.0, < 1.0.0)
63 | word_wrap (~> 1.0.0)
64 | xcodeproj (>= 1.8.1, < 2.0.0)
65 | xcpretty (~> 0.3.0)
66 | xcpretty-travis-formatter (>= 0.0.3)
67 | fastlane-plugin-appcenter (1.7.1)
68 | gh_inspector (1.1.3)
69 | google-api-client (0.23.9)
70 | addressable (~> 2.5, >= 2.5.1)
71 | googleauth (>= 0.5, < 0.7.0)
72 | httpclient (>= 2.8.1, < 3.0)
73 | mime-types (~> 3.0)
74 | representable (~> 3.0)
75 | retriable (>= 2.0, < 4.0)
76 | signet (~> 0.9)
77 | google-cloud-core (1.4.1)
78 | google-cloud-env (~> 1.0)
79 | google-cloud-env (1.3.0)
80 | faraday (~> 0.11)
81 | google-cloud-storage (1.16.0)
82 | digest-crc (~> 0.4)
83 | google-api-client (~> 0.23)
84 | google-cloud-core (~> 1.2)
85 | googleauth (>= 0.6.2, < 0.10.0)
86 | googleauth (0.6.7)
87 | faraday (~> 0.12)
88 | jwt (>= 1.4, < 3.0)
89 | memoist (~> 0.16)
90 | multi_json (~> 1.11)
91 | os (>= 0.9, < 2.0)
92 | signet (~> 0.7)
93 | highline (1.7.10)
94 | http-cookie (1.0.3)
95 | domain_name (~> 0.5)
96 | httpclient (2.8.3)
97 | json (2.3.0)
98 | jwt (2.1.0)
99 | memoist (0.16.2)
100 | mime-types (3.3)
101 | mime-types-data (~> 3.2015)
102 | mime-types-data (3.2019.1009)
103 | mini_magick (4.9.5)
104 | multi_json (1.14.1)
105 | multi_xml (0.6.0)
106 | multipart-post (2.0.0)
107 | nanaimo (0.2.6)
108 | naturally (2.2.0)
109 | os (1.0.1)
110 | plist (3.5.0)
111 | public_suffix (2.0.5)
112 | representable (3.0.4)
113 | declarative (< 0.1.0)
114 | declarative-option (< 0.2.0)
115 | uber (< 0.2.0)
116 | retriable (3.1.2)
117 | rouge (2.0.7)
118 | rubyzip (1.3.0)
119 | security (0.1.3)
120 | signet (0.12.0)
121 | addressable (~> 2.3)
122 | faraday (~> 0.9)
123 | jwt (>= 1.5, < 3.0)
124 | multi_json (~> 1.10)
125 | simctl (1.6.6)
126 | CFPropertyList
127 | naturally
128 | slack-notifier (2.3.2)
129 | terminal-notifier (2.0.0)
130 | terminal-table (1.8.0)
131 | unicode-display_width (~> 1.1, >= 1.1.1)
132 | tty-cursor (0.7.0)
133 | tty-screen (0.7.0)
134 | tty-spinner (0.9.2)
135 | tty-cursor (~> 0.7)
136 | uber (0.1.0)
137 | unf (0.1.4)
138 | unf_ext
139 | unf_ext (0.0.7.6)
140 | unicode-display_width (1.6.0)
141 | word_wrap (1.0.0)
142 | xcodeproj (1.13.0)
143 | CFPropertyList (>= 2.3.3, < 4.0)
144 | atomos (~> 0.1.3)
145 | claide (>= 1.0.2, < 2.0)
146 | colored2 (~> 3.1)
147 | nanaimo (~> 0.2.6)
148 | xcpretty (0.3.0)
149 | rouge (~> 2.0.7)
150 | xcpretty-travis-formatter (1.0.0)
151 | xcpretty (~> 0.2, >= 0.0.7)
152 |
153 | PLATFORMS
154 | ruby
155 |
156 | DEPENDENCIES
157 | fastlane (~> 2.137)
158 | fastlane-plugin-appcenter
159 |
160 | BUNDLED WITH
161 | 2.2.10
162 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------