Commit fd3d9a6327c2a39a61364f6adb2d22401b361748

Authored by wdn127929
1 parent 211c6d21

检测是否打开安装未知来源程序,没有打开,跳转设置页面

Showing 97 changed files with 2651 additions and 16 deletions
@@ -18,19 +18,19 @@ if (flutterRoot == null) { @@ -18,19 +18,19 @@ if (flutterRoot == null) {
18 18
19 19
20 20
21 -def flutterVersionCode = "519" 21 +def flutterVersionCode = "511"
22 if (flutterVersionCode == null) { 22 if (flutterVersionCode == null) {
23 - flutterVersionCode = '519' 23 + flutterVersionCode = '511'
24 24
25 25
26 26
27 } 27 }
28 28
29 29
30 -def flutterVersionName = "5.1.9" 30 +def flutterVersionName = "5.1.1"
31 31
32 if (flutterVersionName == null) { 32 if (flutterVersionName == null) {
33 - flutterVersionName = '5.1.9' 33 + flutterVersionName = '5.1.1'
34 34
35 35
36 } 36 }
@@ -5,6 +5,7 @@ import 'dart:math'; @@ -5,6 +5,7 @@ import 'dart:math';
5 import 'package:common_utils/common_utils.dart'; 5 import 'package:common_utils/common_utils.dart';
6 import 'package:dio/dio.dart'; 6 import 'package:dio/dio.dart';
7 import 'package:flutter/material.dart'; 7 import 'package:flutter/material.dart';
  8 +import 'package:flutter/services.dart';
8 import 'package:flutter_screenutil/flutter_screenutil.dart'; 9 import 'package:flutter_screenutil/flutter_screenutil.dart';
9 import 'package:install_plugin/install_plugin.dart'; 10 import 'package:install_plugin/install_plugin.dart';
10 import 'package:one_key/constant/constant.dart'; 11 import 'package:one_key/constant/constant.dart';
@@ -14,6 +15,7 @@ import 'package:one_key/net/dio_util.dart'; @@ -14,6 +15,7 @@ import 'package:one_key/net/dio_util.dart';
14 import 'package:one_key/net/http_url.dart'; 15 import 'package:one_key/net/http_url.dart';
15 import 'package:one_key/provider/user_model.dart'; 16 import 'package:one_key/provider/user_model.dart';
16 import 'package:one_key/res/colors.dart'; 17 import 'package:one_key/res/colors.dart';
  18 +import 'package:one_key/utils/misc.dart';
17 import 'package:one_key/utils/utils.dart'; 19 import 'package:one_key/utils/utils.dart';
18 import 'package:one_key/widgets/MyDivider.dart'; 20 import 'package:one_key/widgets/MyDivider.dart';
19 import 'package:one_key/widgets/v_empty_view.dart'; 21 import 'package:one_key/widgets/v_empty_view.dart';
@@ -23,24 +25,75 @@ import 'package:provider/provider.dart'; @@ -23,24 +25,75 @@ import 'package:provider/provider.dart';
23 import 'package:flutter_app_update/azhon_app_update.dart'; 25 import 'package:flutter_app_update/azhon_app_update.dart';
24 import 'package:flutter_app_update/update_model.dart'; 26 import 'package:flutter_app_update/update_model.dart';
25 27
  28 +import '../app.dart';
  29 +import '../utils/dialog_util.dart';
  30 +import 'package:device_utils_my/device_utils_my.dart';
  31 +import 'package:android_package_manager/android_package_manager.dart';
  32 +
26 typedef VeisonCallback = void Function(Version value); 33 typedef VeisonCallback = void Function(Version value);
27 34
28 class UpdateModelMy { 35 class UpdateModelMy {
29 int _progress = 1; //下载进度 36 int _progress = 1; //下载进度
30 Function _setState; 37 Function _setState;
  38 + DeviceUtilsMy _deviceUtilsMyPlugin = DeviceUtilsMy();
  39 +
  40 + Future checkInstallPermission() async {
  41 + // Native channel
  42 + var result;
  43 + // try {
  44 + // result = await _channel.invokeMethod("checkInstallPermission");
  45 + // LogUtil.v("result call checkInstallPermission result $result ");
  46 + // } on Exception catch (e) {
  47 + // print(e.toString());
  48 + // LogUtil.v("result call checkInstallPermission error$e");
  49 + // }
  50 + try {
  51 + result = await _deviceUtilsMyPlugin.checkInstallPermission() ??
  52 + 'Unknown platform version';
  53 + } on PlatformException {
  54 + print(e.toString());
  55 + LogUtil.v("result call checkInstallPermission error$e");
  56 + }
  57 + return result;
  58 + }
31 59
32 ///简单使用版本更新 60 ///简单使用版本更新
33 - simpleUse(bool showiOSDialog, String url) {  
34 - UpdateModel model = UpdateModel(  
35 - url,  
36 - "yjd.apk",  
37 - "ic_launcher",  
38 - // "1.支持Android M N O P Q\n2.支持自定义下载过程\n3.支持 设备>=Android M 动态权限的申请\n4.支持通知栏进度条展示\n5.支持文字国际化", 61 + simpleUse(bool showiOSDialog, String url) async {
  62 + var result = true;
  63 +
  64 + if (Platform.isAndroid) {
  65 + result = await checkInstallPermission();
  66 + if (!result) {
  67 + //跳转设置页面
  68 + BuildContext context = App.navigatorKey.currentState.overlay.context;
  69 + var option = await DialogUtil.openAlertDialog(
  70 + context, '安装未知应用权限未打开', "请在手机的权限管理里,将安装未知应用权限开启", '去设置', 340.0,
  71 + onTap: () async {
  72 + // Navigator.pop(context, '');
  73 + // openSetting();
  74 + Navigator.pop(context, true);
  75 + // Future.delayed(Duration(milliseconds: 500), () {
  76 + // await _deviceUtilsMyPlugin.openPackageInstall();
  77 + // });
  78 + // Navigator.pop(context, '');
  79 + });
  80 + if (option != null && option) {
  81 + await _deviceUtilsMyPlugin.openPackageInstall();
  82 + }
  83 + }
  84 + }
  85 + if (result) {
  86 + UpdateModel model = UpdateModel(
  87 + url,
  88 + "yjd.apk",
  89 + "ic_launcher",
  90 + // "1.支持Android M N O P Q\n2.支持自定义下载过程\n3.支持 设备>=Android M 动态权限的申请\n4.支持通知栏进度条展示\n5.支持文字国际化",
39 91
40 - 'itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=1510697490',  
41 - // showiOSDialog: showiOSDialog,  
42 - );  
43 - AzhonAppUpdate.update(model).then((value) => print(value)); 92 + 'itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=1510697490',
  93 + // showiOSDialog: showiOSDialog,
  94 + );
  95 + AzhonAppUpdate.update(model).then((value) => print(value));
  96 + }
44 } 97 }
45 98
46 //检查更新 99 //检查更新
@@ -7736,6 +7736,7 @@ class DialogUtil { @@ -7736,6 +7736,7 @@ class DialogUtil {
7736 ); 7736 );
7737 }, 7737 },
7738 ); 7738 );
  7739 + return action;
7739 } 7740 }
7740 7741
7741 ///店铺临近过期弹窗 7742 ///店铺临近过期弹窗
  1 +# Miscellaneous
  2 +*.class
  3 +*.log
  4 +*.pyc
  5 +*.swp
  6 +.DS_Store
  7 +.atom/
  8 +.buildlog/
  9 +.history
  10 +.svn/
  11 +migrate_working_dir/
  12 +
  13 +# IntelliJ related
  14 +*.iml
  15 +*.ipr
  16 +*.iws
  17 +.idea/
  18 +
  19 +# The .vscode folder contains launch configuration and tasks you configure in
  20 +# VS Code which you may wish to be included in version control, so this line
  21 +# is commented out by default.
  22 +#.vscode/
  23 +
  24 +# Flutter/Dart/Pub related
  25 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
  26 +/pubspec.lock
  27 +**/doc/api/
  28 +.dart_tool/
  29 +.packages
  30 +build/
  1 +# This file tracks properties of this Flutter project.
  2 +# Used by Flutter tool to assess capabilities and perform upgrades etc.
  3 +#
  4 +# This file should be version controlled.
  5 +
  6 +version:
  7 + revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  8 + channel: stable
  9 +
  10 +project_type: plugin
  11 +
  12 +# Tracks metadata for the flutter migrate command
  13 +migration:
  14 + platforms:
  15 + - platform: root
  16 + create_revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  17 + base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  18 + - platform: android
  19 + create_revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  20 + base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  21 + - platform: ios
  22 + create_revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  23 + base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c
  24 +
  25 + # User provided section
  26 +
  27 + # List of Local paths (relative to this file) that should be
  28 + # ignored by the migrate tool.
  29 + #
  30 + # Files that are not part of the templates will be ignored by default.
  31 + unmanaged_files:
  32 + - 'lib/main.dart'
  33 + - 'ios/Runner.xcodeproj/project.pbxproj'
  1 +## 0.0.1
  2 +
  3 +* TODO: Describe initial release.
  1 +TODO: Add your license here.
  1 +# device_utils_my
  2 +
  3 +A new Flutter plugin project.
  4 +
  5 +## Getting Started
  6 +
  7 +This project is a starting point for a Flutter
  8 +[plug-in package](https://flutter.dev/developing-packages/),
  9 +a specialized package that includes platform-specific implementation code for
  10 +Android and/or iOS.
  11 +
  12 +For help getting started with Flutter development, view the
  13 +[online documentation](https://flutter.dev/docs), which offers tutorials,
  14 +samples, guidance on mobile development, and a full API reference.
  15 +
  1 +include: package:flutter_lints/flutter.yaml
  2 +
  3 +# Additional information about this file can be found at
  4 +# https://dart.dev/guides/language/analysis-options
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +/.idea/workspace.xml
  5 +/.idea/libraries
  6 +.DS_Store
  7 +/build
  8 +/captures
  9 +.cxx
  1 +group 'com.example.device_utils_my'
  2 +version '1.0-SNAPSHOT'
  3 +
  4 +buildscript {
  5 + // ext.kotlin_version = '1.6.10'
  6 + ext.kotlin_version = '1.6.20'
  7 + repositories {
  8 + google()
  9 + mavenCentral()
  10 + // google()
  11 + // jcenter()
  12 + }
  13 +
  14 + dependencies {
  15 + // classpath 'com.android.tools.build:gradle:7.1.2'
  16 + classpath 'com.android.tools.build:gradle:7.4.1'
  17 + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  18 + }
  19 +}
  20 +
  21 +allprojects {
  22 + repositories {
  23 + google()
  24 + mavenCentral()
  25 + // google()
  26 + // jcenter()
  27 + }
  28 +}
  29 +
  30 +apply plugin: 'com.android.library'
  31 +apply plugin: 'kotlin-android'
  32 +
  33 +android {
  34 + compileSdkVersion 31
  35 +
  36 + // compileSdkVersion 33
  37 + // compileOptions {
  38 + // sourceCompatibility JavaVersion.VERSION_1_8
  39 + // targetCompatibility JavaVersion.VERSION_1_8
  40 + // }
  41 +
  42 + // kotlinOptions {
  43 + // jvmTarget = '1.8'
  44 + // }
  45 +
  46 + sourceSets {
  47 + main.java.srcDirs += 'src/main/kotlin'
  48 + }
  49 +
  50 + defaultConfig {
  51 + minSdkVersion 16
  52 + // minSdkVersion 21
  53 + }
  54 +}
  1 +distributionBase=GRADLE_USER_HOME
  2 +distributionPath=wrapper/dists
  3 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
  4 +zipStoreBase=GRADLE_USER_HOME
  5 +zipStorePath=wrapper/dists
  1 +#!/bin/sh
  2 +
  3 +#
  4 +# Copyright © 2015-2021 the original authors.
  5 +#
  6 +# Licensed under the Apache License, Version 2.0 (the "License");
  7 +# you may not use this file except in compliance with the License.
  8 +# You may obtain a copy of the License at
  9 +#
  10 +# https://www.apache.org/licenses/LICENSE-2.0
  11 +#
  12 +# Unless required by applicable law or agreed to in writing, software
  13 +# distributed under the License is distributed on an "AS IS" BASIS,
  14 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15 +# See the License for the specific language governing permissions and
  16 +# limitations under the License.
  17 +#
  18 +
  19 +##############################################################################
  20 +#
  21 +# Gradle start up script for POSIX generated by Gradle.
  22 +#
  23 +# Important for running:
  24 +#
  25 +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
  26 +# noncompliant, but you have some other compliant shell such as ksh or
  27 +# bash, then to run this script, type that shell name before the whole
  28 +# command line, like:
  29 +#
  30 +# ksh Gradle
  31 +#
  32 +# Busybox and similar reduced shells will NOT work, because this script
  33 +# requires all of these POSIX shell features:
  34 +# * functions;
  35 +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
  36 +# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
  37 +# * compound commands having a testable exit status, especially «case»;
  38 +# * various built-in commands including «command», «set», and «ulimit».
  39 +#
  40 +# Important for patching:
  41 +#
  42 +# (2) This script targets any POSIX shell, so it avoids extensions provided
  43 +# by Bash, Ksh, etc; in particular arrays are avoided.
  44 +#
  45 +# The "traditional" practice of packing multiple parameters into a
  46 +# space-separated string is a well documented source of bugs and security
  47 +# problems, so this is (mostly) avoided, by progressively accumulating
  48 +# options in "$@", and eventually passing that to Java.
  49 +#
  50 +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
  51 +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
  52 +# see the in-line comments for details.
  53 +#
  54 +# There are tweaks for specific operating systems such as AIX, CygWin,
  55 +# Darwin, MinGW, and NonStop.
  56 +#
  57 +# (3) This script is generated from the Groovy template
  58 +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
  59 +# within the Gradle project.
  60 +#
  61 +# You can find Gradle at https://github.com/gradle/gradle/.
  62 +#
  63 +##############################################################################
  64 +
  65 +# Attempt to set APP_HOME
  66 +
  67 +# Resolve links: $0 may be a link
  68 +app_path=$0
  69 +
  70 +# Need this for daisy-chained symlinks.
  71 +while
  72 + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
  73 + [ -h "$app_path" ]
  74 +do
  75 + ls=$( ls -ld "$app_path" )
  76 + link=${ls#*' -> '}
  77 + case $link in #(
  78 + /*) app_path=$link ;; #(
  79 + *) app_path=$APP_HOME$link ;;
  80 + esac
  81 +done
  82 +
  83 +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
  84 +
  85 +APP_NAME="Gradle"
  86 +APP_BASE_NAME=${0##*/}
  87 +
  88 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  89 +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
  90 +
  91 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  92 +MAX_FD=maximum
  93 +
  94 +warn () {
  95 + echo "$*"
  96 +} >&2
  97 +
  98 +die () {
  99 + echo
  100 + echo "$*"
  101 + echo
  102 + exit 1
  103 +} >&2
  104 +
  105 +# OS specific support (must be 'true' or 'false').
  106 +cygwin=false
  107 +msys=false
  108 +darwin=false
  109 +nonstop=false
  110 +case "$( uname )" in #(
  111 + CYGWIN* ) cygwin=true ;; #(
  112 + Darwin* ) darwin=true ;; #(
  113 + MSYS* | MINGW* ) msys=true ;; #(
  114 + NONSTOP* ) nonstop=true ;;
  115 +esac
  116 +
  117 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  118 +
  119 +
  120 +# Determine the Java command to use to start the JVM.
  121 +if [ -n "$JAVA_HOME" ] ; then
  122 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  123 + # IBM's JDK on AIX uses strange locations for the executables
  124 + JAVACMD=$JAVA_HOME/jre/sh/java
  125 + else
  126 + JAVACMD=$JAVA_HOME/bin/java
  127 + fi
  128 + if [ ! -x "$JAVACMD" ] ; then
  129 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  130 +
  131 +Please set the JAVA_HOME variable in your environment to match the
  132 +location of your Java installation."
  133 + fi
  134 +else
  135 + JAVACMD=java
  136 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  137 +
  138 +Please set the JAVA_HOME variable in your environment to match the
  139 +location of your Java installation."
  140 +fi
  141 +
  142 +# Increase the maximum file descriptors if we can.
  143 +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
  144 + case $MAX_FD in #(
  145 + max*)
  146 + MAX_FD=$( ulimit -H -n ) ||
  147 + warn "Could not query maximum file descriptor limit"
  148 + esac
  149 + case $MAX_FD in #(
  150 + '' | soft) :;; #(
  151 + *)
  152 + ulimit -n "$MAX_FD" ||
  153 + warn "Could not set maximum file descriptor limit to $MAX_FD"
  154 + esac
  155 +fi
  156 +
  157 +# Collect all arguments for the java command, stacking in reverse order:
  158 +# * args from the command line
  159 +# * the main class name
  160 +# * -classpath
  161 +# * -D...appname settings
  162 +# * --module-path (only if needed)
  163 +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
  164 +
  165 +# For Cygwin or MSYS, switch paths to Windows format before running java
  166 +if "$cygwin" || "$msys" ; then
  167 + APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
  168 + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
  169 +
  170 + JAVACMD=$( cygpath --unix "$JAVACMD" )
  171 +
  172 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  173 + for arg do
  174 + if
  175 + case $arg in #(
  176 + -*) false ;; # don't mess with options #(
  177 + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
  178 + [ -e "$t" ] ;; #(
  179 + *) false ;;
  180 + esac
  181 + then
  182 + arg=$( cygpath --path --ignore --mixed "$arg" )
  183 + fi
  184 + # Roll the args list around exactly as many times as the number of
  185 + # args, so each arg winds up back in the position where it started, but
  186 + # possibly modified.
  187 + #
  188 + # NB: a `for` loop captures its iteration list before it begins, so
  189 + # changing the positional parameters here affects neither the number of
  190 + # iterations, nor the values presented in `arg`.
  191 + shift # remove old arg
  192 + set -- "$@" "$arg" # push replacement arg
  193 + done
  194 +fi
  195 +
  196 +# Collect all arguments for the java command;
  197 +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
  198 +# shell script including quotes and variable substitutions, so put them in
  199 +# double quotes to make sure that they get re-expanded; and
  200 +# * put everything else in single quotes, so that it's not re-expanded.
  201 +
  202 +set -- \
  203 + "-Dorg.gradle.appname=$APP_BASE_NAME" \
  204 + -classpath "$CLASSPATH" \
  205 + org.gradle.wrapper.GradleWrapperMain \
  206 + "$@"
  207 +
  208 +# Stop when "xargs" is not available.
  209 +if ! command -v xargs >/dev/null 2>&1
  210 +then
  211 + die "xargs is not available"
  212 +fi
  213 +
  214 +# Use "xargs" to parse quoted args.
  215 +#
  216 +# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
  217 +#
  218 +# In Bash we could simply go:
  219 +#
  220 +# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
  221 +# set -- "${ARGS[@]}" "$@"
  222 +#
  223 +# but POSIX shell has neither arrays nor command substitution, so instead we
  224 +# post-process each arg (as a line of input to sed) to backslash-escape any
  225 +# character that might be a shell metacharacter, then use eval to reverse
  226 +# that process (while maintaining the separation between arguments), and wrap
  227 +# the whole thing up as a single "set" statement.
  228 +#
  229 +# This will of course break if any of these variables contains a newline or
  230 +# an unmatched quote.
  231 +#
  232 +
  233 +eval "set -- $(
  234 + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
  235 + xargs -n1 |
  236 + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
  237 + tr '\n' ' '
  238 + )" '"$@"'
  239 +
  240 +exec "$JAVACMD" "$@"
  1 +@rem
  2 +@rem Copyright 2015 the original author or authors.
  3 +@rem
  4 +@rem Licensed under the Apache License, Version 2.0 (the "License");
  5 +@rem you may not use this file except in compliance with the License.
  6 +@rem You may obtain a copy of the License at
  7 +@rem
  8 +@rem https://www.apache.org/licenses/LICENSE-2.0
  9 +@rem
  10 +@rem Unless required by applicable law or agreed to in writing, software
  11 +@rem distributed under the License is distributed on an "AS IS" BASIS,
  12 +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +@rem See the License for the specific language governing permissions and
  14 +@rem limitations under the License.
  15 +@rem
  16 +
  17 +@if "%DEBUG%"=="" @echo off
  18 +@rem ##########################################################################
  19 +@rem
  20 +@rem Gradle startup script for Windows
  21 +@rem
  22 +@rem ##########################################################################
  23 +
  24 +@rem Set local scope for the variables with windows NT shell
  25 +if "%OS%"=="Windows_NT" setlocal
  26 +
  27 +set DIRNAME=%~dp0
  28 +if "%DIRNAME%"=="" set DIRNAME=.
  29 +set APP_BASE_NAME=%~n0
  30 +set APP_HOME=%DIRNAME%
  31 +
  32 +@rem Resolve any "." and ".." in APP_HOME to make it shorter.
  33 +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
  34 +
  35 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  36 +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
  37 +
  38 +@rem Find java.exe
  39 +if defined JAVA_HOME goto findJavaFromJavaHome
  40 +
  41 +set JAVA_EXE=java.exe
  42 +%JAVA_EXE% -version >NUL 2>&1
  43 +if %ERRORLEVEL% equ 0 goto execute
  44 +
  45 +echo.
  46 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  47 +echo.
  48 +echo Please set the JAVA_HOME variable in your environment to match the
  49 +echo location of your Java installation.
  50 +
  51 +goto fail
  52 +
  53 +:findJavaFromJavaHome
  54 +set JAVA_HOME=%JAVA_HOME:"=%
  55 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  56 +
  57 +if exist "%JAVA_EXE%" goto execute
  58 +
  59 +echo.
  60 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
  61 +echo.
  62 +echo Please set the JAVA_HOME variable in your environment to match the
  63 +echo location of your Java installation.
  64 +
  65 +goto fail
  66 +
  67 +:execute
  68 +@rem Setup the command line
  69 +
  70 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
  71 +
  72 +
  73 +@rem Execute Gradle
  74 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
  75 +
  76 +:end
  77 +@rem End local scope for the variables with windows NT shell
  78 +if %ERRORLEVEL% equ 0 goto mainEnd
  79 +
  80 +:fail
  81 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  82 +rem the _cmd.exe /c_ return code!
  83 +set EXIT_CODE=%ERRORLEVEL%
  84 +if %EXIT_CODE% equ 0 set EXIT_CODE=1
  85 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
  86 +exit /b %EXIT_CODE%
  87 +
  88 +:mainEnd
  89 +if "%OS%"=="Windows_NT" endlocal
  90 +
  91 +:omega
  1 +rootProject.name = 'device_utils_my'
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2 + package="com.example.device_utils_my">
  3 +
  4 +<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  5 +
  6 +
  7 +</manifest>
  1 +package com.example.device_utils_my
  2 +
  3 +import androidx.annotation.NonNull
  4 +import android.os.Build
  5 +import android.content.pm.PackageManager
  6 +import android.content.Context
  7 +import android.provider.Settings
  8 +import android.content.Intent
  9 +import android.net.Uri
  10 +import io.flutter.embedding.engine.plugins.FlutterPlugin
  11 +import io.flutter.plugin.common.MethodCall
  12 +import io.flutter.plugin.common.MethodChannel
  13 +import io.flutter.plugin.common.MethodChannel.MethodCallHandler
  14 +import io.flutter.plugin.common.MethodChannel.Result
  15 +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
  16 +import io.flutter.embedding.engine.plugins.activity.ActivityAware
  17 +
  18 +
  19 +
  20 +
  21 +/** DeviceUtilsMyPlugin */
  22 +class DeviceUtilsMyPlugin: FlutterPlugin, MethodCallHandler , ActivityAware{
  23 + /// The MethodChannel that will the communication between Flutter and native Android
  24 + ///
  25 + /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  26 + /// when the Flutter Engine is detached from the Activity
  27 +
  28 + private lateinit var channel : MethodChannel
  29 + private lateinit var packageManager: PackageManager
  30 + private lateinit var activityContext: Context
  31 +
  32 + override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
  33 + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "device_utils_my")
  34 + channel.setMethodCallHandler(this)
  35 + }
  36 +
  37 + override fun onAttachedToActivity(binding: ActivityPluginBinding) {
  38 + packageManager = binding.activity.packageManager
  39 + activityContext = binding.activity
  40 + }
  41 +
  42 + override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
  43 + if (call.method == "getPlatformVersion") {
  44 + result.success("Android ${android.os.Build.VERSION.RELEASE}")
  45 + }
  46 + else if(call.method == "checkInstallPermission"){
  47 +
  48 + result.success(Build.VERSION.SDK_INT >= 26 && packageManager.canRequestPackageInstalls())
  49 + } else if(call.method == "openPackageInstall"){
  50 +
  51 + activityContext.startActivity(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + activityContext.getPackageName())))
  52 + result.success(true);
  53 +
  54 + }
  55 + else {
  56 + result.notImplemented()
  57 + }
  58 + }
  59 +
  60 + override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
  61 + channel.setMethodCallHandler(null)
  62 + }
  63 +
  64 + override fun onDetachedFromActivityForConfigChanges() {}
  65 +
  66 + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {}
  67 +
  68 + override fun onDetachedFromActivity() {}
  69 +
  70 +
  71 +
  72 +
  73 +
  74 +
  75 +}
  1 +# Miscellaneous
  2 +*.class
  3 +*.log
  4 +*.pyc
  5 +*.swp
  6 +.DS_Store
  7 +.atom/
  8 +.buildlog/
  9 +.history
  10 +.svn/
  11 +migrate_working_dir/
  12 +
  13 +# IntelliJ related
  14 +*.iml
  15 +*.ipr
  16 +*.iws
  17 +.idea/
  18 +
  19 +# The .vscode folder contains launch configuration and tasks you configure in
  20 +# VS Code which you may wish to be included in version control, so this line
  21 +# is commented out by default.
  22 +#.vscode/
  23 +
  24 +# Flutter/Dart/Pub related
  25 +**/doc/api/
  26 +**/ios/Flutter/.last_build_id
  27 +.dart_tool/
  28 +.flutter-plugins
  29 +.flutter-plugins-dependencies
  30 +.packages
  31 +.pub-cache/
  32 +.pub/
  33 +/build/
  34 +
  35 +# Symbolication related
  36 +app.*.symbols
  37 +
  38 +# Obfuscation related
  39 +app.*.map.json
  40 +
  41 +# Android Studio will place build artifacts here
  42 +/android/app/debug
  43 +/android/app/profile
  44 +/android/app/release
  1 +# device_utils_my_example
  2 +
  3 +Demonstrates how to use the device_utils_my plugin.
  4 +
  5 +## Getting Started
  6 +
  7 +This project is a starting point for a Flutter application.
  8 +
  9 +A few resources to get you started if this is your first Flutter project:
  10 +
  11 +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
  12 +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
  13 +
  14 +For help getting started with Flutter development, view the
  15 +[online documentation](https://docs.flutter.dev/), which offers tutorials,
  16 +samples, guidance on mobile development, and a full API reference.
  1 +# This file configures the analyzer, which statically analyzes Dart code to
  2 +# check for errors, warnings, and lints.
  3 +#
  4 +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
  5 +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
  6 +# invoked from the command line by running `flutter analyze`.
  7 +
  8 +# The following line activates a set of recommended lints for Flutter apps,
  9 +# packages, and plugins designed to encourage good coding practices.
  10 +include: package:flutter_lints/flutter.yaml
  11 +
  12 +linter:
  13 + # The lint rules applied to this project can be customized in the
  14 + # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  15 + # included above or to enable additional rules. A list of all available lints
  16 + # and their documentation is published at
  17 + # https://dart-lang.github.io/linter/lints/index.html.
  18 + #
  19 + # Instead of disabling a lint rule for the entire project in the
  20 + # section below, it can also be suppressed for a single line of code
  21 + # or a specific dart file by using the `// ignore: name_of_lint` and
  22 + # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  23 + # producing the lint.
  24 + rules:
  25 + # avoid_print: false # Uncomment to disable the `avoid_print` rule
  26 + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
  27 +
  28 +# Additional information about this file can be found at
  29 +# https://dart.dev/guides/language/analysis-options
  1 +gradle-wrapper.jar
  2 +/.gradle
  3 +/captures/
  4 +/gradlew
  5 +/gradlew.bat
  6 +/local.properties
  7 +GeneratedPluginRegistrant.java
  8 +
  9 +# Remember to never publicly share your keystore.
  10 +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
  11 +key.properties
  12 +**/*.keystore
  13 +**/*.jks
  1 +def localProperties = new Properties()
  2 +def localPropertiesFile = rootProject.file('local.properties')
  3 +if (localPropertiesFile.exists()) {
  4 + localPropertiesFile.withReader('UTF-8') { reader ->
  5 + localProperties.load(reader)
  6 + }
  7 +}
  8 +
  9 +def flutterRoot = localProperties.getProperty('flutter.sdk')
  10 +if (flutterRoot == null) {
  11 + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
  12 +}
  13 +
  14 +def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
  15 +if (flutterVersionCode == null) {
  16 + flutterVersionCode = '1'
  17 +}
  18 +
  19 +def flutterVersionName = localProperties.getProperty('flutter.versionName')
  20 +if (flutterVersionName == null) {
  21 + flutterVersionName = '1.0'
  22 +}
  23 +
  24 +apply plugin: 'com.android.application'
  25 +apply plugin: 'kotlin-android'
  26 +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
  27 +
  28 +android {
  29 + compileSdkVersion flutter.compileSdkVersion
  30 + ndkVersion flutter.ndkVersion
  31 +
  32 + compileOptions {
  33 + sourceCompatibility JavaVersion.VERSION_1_8
  34 + targetCompatibility JavaVersion.VERSION_1_8
  35 + }
  36 +
  37 + kotlinOptions {
  38 + jvmTarget = '1.8'
  39 + }
  40 +
  41 + sourceSets {
  42 + main.java.srcDirs += 'src/main/kotlin'
  43 + }
  44 +
  45 + defaultConfig {
  46 + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
  47 + applicationId "com.example.device_utils_my_example"
  48 + // You can update the following values to match your application needs.
  49 + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
  50 + minSdkVersion flutter.minSdkVersion
  51 + targetSdkVersion flutter.targetSdkVersion
  52 + versionCode flutterVersionCode.toInteger()
  53 + versionName flutterVersionName
  54 + }
  55 +
  56 + buildTypes {
  57 + release {
  58 + // TODO: Add your own signing config for the release build.
  59 + // Signing with the debug keys for now, so `flutter run --release` works.
  60 + signingConfig signingConfigs.debug
  61 + }
  62 + }
  63 +}
  64 +
  65 +flutter {
  66 + source '../..'
  67 +}
  68 +
  69 +dependencies {
  70 + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
  71 +}
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2 + package="com.example.device_utils_my_example">
  3 + <!-- The INTERNET permission is required for development. Specifically,
  4 + the Flutter tool needs it to communicate with the running application
  5 + to allow setting breakpoints, to provide hot reload, etc.
  6 + -->
  7 + <uses-permission android:name="android.permission.INTERNET"/>
  8 +</manifest>
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2 + package="com.example.device_utils_my_example">
  3 + <application
  4 + android:label="device_utils_my_example"
  5 + android:name="${applicationName}"
  6 + android:icon="@mipmap/ic_launcher">
  7 + <activity
  8 + android:name=".MainActivity"
  9 + android:exported="true"
  10 + android:launchMode="singleTop"
  11 + android:theme="@style/LaunchTheme"
  12 + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
  13 + android:hardwareAccelerated="true"
  14 + android:windowSoftInputMode="adjustResize">
  15 + <!-- Specifies an Android theme to apply to this Activity as soon as
  16 + the Android process has started. This theme is visible to the user
  17 + while the Flutter UI initializes. After that, this theme continues
  18 + to determine the Window background behind the Flutter UI. -->
  19 + <meta-data
  20 + android:name="io.flutter.embedding.android.NormalTheme"
  21 + android:resource="@style/NormalTheme"
  22 + />
  23 + <intent-filter>
  24 + <action android:name="android.intent.action.MAIN"/>
  25 + <category android:name="android.intent.category.LAUNCHER"/>
  26 + </intent-filter>
  27 + </activity>
  28 + <!-- Don't delete the meta-data below.
  29 + This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
  30 + <meta-data
  31 + android:name="flutterEmbedding"
  32 + android:value="2" />
  33 + </application>
  34 +</manifest>
  1 +package com.example.device_utils_my_example
  2 +
  3 +import io.flutter.embedding.android.FlutterActivity
  4 +
  5 +class MainActivity: FlutterActivity() {
  6 +}
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<!-- Modify this file to customize your launch splash screen -->
  3 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  4 + <item android:drawable="?android:colorBackground" />
  5 +
  6 + <!-- You can insert your own image assets here -->
  7 + <!-- <item>
  8 + <bitmap
  9 + android:gravity="center"
  10 + android:src="@mipmap/launch_image" />
  11 + </item> -->
  12 +</layer-list>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<!-- Modify this file to customize your launch splash screen -->
  3 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  4 + <item android:drawable="@android:color/white" />
  5 +
  6 + <!-- You can insert your own image assets here -->
  7 + <!-- <item>
  8 + <bitmap
  9 + android:gravity="center"
  10 + android:src="@mipmap/launch_image" />
  11 + </item> -->
  12 +</layer-list>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
  4 + <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
  5 + <!-- Show a splash screen on the activity. Automatically removed when
  6 + the Flutter engine draws its first frame -->
  7 + <item name="android:windowBackground">@drawable/launch_background</item>
  8 + </style>
  9 + <!-- Theme applied to the Android Window as soon as the process has started.
  10 + This theme determines the color of the Android Window while your
  11 + Flutter UI initializes, as well as behind your Flutter UI while its
  12 + running.
  13 +
  14 + This Theme is only used starting with V2 of Flutter's Android embedding. -->
  15 + <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
  16 + <item name="android:windowBackground">?android:colorBackground</item>
  17 + </style>
  18 +</resources>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
  4 + <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
  5 + <!-- Show a splash screen on the activity. Automatically removed when
  6 + the Flutter engine draws its first frame -->
  7 + <item name="android:windowBackground">@drawable/launch_background</item>
  8 + </style>
  9 + <!-- Theme applied to the Android Window as soon as the process has started.
  10 + This theme determines the color of the Android Window while your
  11 + Flutter UI initializes, as well as behind your Flutter UI while its
  12 + running.
  13 +
  14 + This Theme is only used starting with V2 of Flutter's Android embedding. -->
  15 + <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
  16 + <item name="android:windowBackground">?android:colorBackground</item>
  17 + </style>
  18 +</resources>
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2 + package="com.example.device_utils_my_example">
  3 + <!-- The INTERNET permission is required for development. Specifically,
  4 + the Flutter tool needs it to communicate with the running application
  5 + to allow setting breakpoints, to provide hot reload, etc.
  6 + -->
  7 + <uses-permission android:name="android.permission.INTERNET"/>
  8 +</manifest>
  1 +buildscript {
  2 + ext.kotlin_version = '1.6.20'
  3 + repositories {
  4 + google()
  5 + mavenCentral()
  6 + }
  7 +
  8 + dependencies {
  9 + classpath 'com.android.tools.build:gradle:7.4.1'
  10 + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  11 + }
  12 +}
  13 +
  14 +allprojects {
  15 + repositories {
  16 + google()
  17 + mavenCentral()
  18 + }
  19 +}
  20 +
  21 +rootProject.buildDir = '../build'
  22 +subprojects {
  23 + project.buildDir = "${rootProject.buildDir}/${project.name}"
  24 +}
  25 +subprojects {
  26 + project.evaluationDependsOn(':app')
  27 +}
  28 +
  29 +task clean(type: Delete) {
  30 + delete rootProject.buildDir
  31 +}
  1 +org.gradle.jvmargs=-Xmx1536M
  2 +android.useAndroidX=true
  3 +android.enableJetifier=true
  1 +distributionBase=GRADLE_USER_HOME
  2 +distributionPath=wrapper/dists
  3 +zipStoreBase=GRADLE_USER_HOME
  4 +zipStorePath=wrapper/dists
  5 +# distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
  6 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
  1 +include ':app'
  2 +
  3 +def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
  4 +def properties = new Properties()
  5 +
  6 +assert localPropertiesFile.exists()
  7 +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
  8 +
  9 +def flutterSdkPath = properties.getProperty("flutter.sdk")
  10 +assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
  11 +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
  1 +**/dgph
  2 +*.mode1v3
  3 +*.mode2v3
  4 +*.moved-aside
  5 +*.pbxuser
  6 +*.perspectivev3
  7 +**/*sync/
  8 +.sconsign.dblite
  9 +.tags*
  10 +**/.vagrant/
  11 +**/DerivedData/
  12 +Icon?
  13 +**/Pods/
  14 +**/.symlinks/
  15 +profile
  16 +xcuserdata
  17 +**/.generated/
  18 +Flutter/App.framework
  19 +Flutter/Flutter.framework
  20 +Flutter/Flutter.podspec
  21 +Flutter/Generated.xcconfig
  22 +Flutter/ephemeral/
  23 +Flutter/app.flx
  24 +Flutter/app.zip
  25 +Flutter/flutter_assets/
  26 +Flutter/flutter_export_environment.sh
  27 +ServiceDefinitions.json
  28 +Runner/GeneratedPluginRegistrant.*
  29 +
  30 +# Exceptions to above rules.
  31 +!default.mode1v3
  32 +!default.mode2v3
  33 +!default.pbxuser
  34 +!default.perspectivev3
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>en</string>
  7 + <key>CFBundleExecutable</key>
  8 + <string>App</string>
  9 + <key>CFBundleIdentifier</key>
  10 + <string>io.flutter.flutter.app</string>
  11 + <key>CFBundleInfoDictionaryVersion</key>
  12 + <string>6.0</string>
  13 + <key>CFBundleName</key>
  14 + <string>App</string>
  15 + <key>CFBundlePackageType</key>
  16 + <string>FMWK</string>
  17 + <key>CFBundleShortVersionString</key>
  18 + <string>1.0</string>
  19 + <key>CFBundleSignature</key>
  20 + <string>????</string>
  21 + <key>CFBundleVersion</key>
  22 + <string>1.0</string>
  23 + <key>MinimumOSVersion</key>
  24 + <string>11.0</string>
  25 +</dict>
  26 +</plist>
  1 +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
  2 +#include "Generated.xcconfig"
  1 +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
  2 +#include "Generated.xcconfig"
  1 +# Uncomment this line to define a global platform for your project
  2 +# platform :ios, '11.0'
  3 +
  4 +# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
  5 +ENV['COCOAPODS_DISABLE_STATS'] = 'true'
  6 +
  7 +project 'Runner', {
  8 + 'Debug' => :debug,
  9 + 'Profile' => :release,
  10 + 'Release' => :release,
  11 +}
  12 +
  13 +def flutter_root
  14 + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
  15 + unless File.exist?(generated_xcode_build_settings_path)
  16 + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
  17 + end
  18 +
  19 + File.foreach(generated_xcode_build_settings_path) do |line|
  20 + matches = line.match(/FLUTTER_ROOT\=(.*)/)
  21 + return matches[1].strip if matches
  22 + end
  23 + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
  24 +end
  25 +
  26 +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
  27 +
  28 +flutter_ios_podfile_setup
  29 +
  30 +target 'Runner' do
  31 + use_frameworks!
  32 + use_modular_headers!
  33 +
  34 + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  35 +end
  36 +
  37 +post_install do |installer|
  38 + installer.pods_project.targets.each do |target|
  39 + flutter_additional_ios_build_settings(target)
  40 + end
  41 +end
  1 +// !$*UTF8*$!
  2 +{
  3 + archiveVersion = 1;
  4 + classes = {
  5 + };
  6 + objectVersion = 50;
  7 + objects = {
  8 +
  9 +/* Begin PBXBuildFile section */
  10 + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
  11 + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
  12 + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
  13 + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
  14 + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
  15 + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
  16 +/* End PBXBuildFile section */
  17 +
  18 +/* Begin PBXCopyFilesBuildPhase section */
  19 + 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
  20 + isa = PBXCopyFilesBuildPhase;
  21 + buildActionMask = 2147483647;
  22 + dstPath = "";
  23 + dstSubfolderSpec = 10;
  24 + files = (
  25 + );
  26 + name = "Embed Frameworks";
  27 + runOnlyForDeploymentPostprocessing = 0;
  28 + };
  29 +/* End PBXCopyFilesBuildPhase section */
  30 +
  31 +/* Begin PBXFileReference section */
  32 + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
  33 + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
  34 + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
  35 + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
  36 + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
  37 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
  38 + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
  39 + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
  40 + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
  41 + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
  42 + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
  43 + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
  44 + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  45 +/* End PBXFileReference section */
  46 +
  47 +/* Begin PBXFrameworksBuildPhase section */
  48 + 97C146EB1CF9000F007C117D /* Frameworks */ = {
  49 + isa = PBXFrameworksBuildPhase;
  50 + buildActionMask = 2147483647;
  51 + files = (
  52 + );
  53 + runOnlyForDeploymentPostprocessing = 0;
  54 + };
  55 +/* End PBXFrameworksBuildPhase section */
  56 +
  57 +/* Begin PBXGroup section */
  58 + 9740EEB11CF90186004384FC /* Flutter */ = {
  59 + isa = PBXGroup;
  60 + children = (
  61 + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
  62 + 9740EEB21CF90195004384FC /* Debug.xcconfig */,
  63 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
  64 + 9740EEB31CF90195004384FC /* Generated.xcconfig */,
  65 + );
  66 + name = Flutter;
  67 + sourceTree = "<group>";
  68 + };
  69 + 97C146E51CF9000F007C117D = {
  70 + isa = PBXGroup;
  71 + children = (
  72 + 9740EEB11CF90186004384FC /* Flutter */,
  73 + 97C146F01CF9000F007C117D /* Runner */,
  74 + 97C146EF1CF9000F007C117D /* Products */,
  75 + );
  76 + sourceTree = "<group>";
  77 + };
  78 + 97C146EF1CF9000F007C117D /* Products */ = {
  79 + isa = PBXGroup;
  80 + children = (
  81 + 97C146EE1CF9000F007C117D /* Runner.app */,
  82 + );
  83 + name = Products;
  84 + sourceTree = "<group>";
  85 + };
  86 + 97C146F01CF9000F007C117D /* Runner */ = {
  87 + isa = PBXGroup;
  88 + children = (
  89 + 97C146FA1CF9000F007C117D /* Main.storyboard */,
  90 + 97C146FD1CF9000F007C117D /* Assets.xcassets */,
  91 + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
  92 + 97C147021CF9000F007C117D /* Info.plist */,
  93 + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
  94 + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
  95 + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
  96 + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
  97 + );
  98 + path = Runner;
  99 + sourceTree = "<group>";
  100 + };
  101 +/* End PBXGroup section */
  102 +
  103 +/* Begin PBXNativeTarget section */
  104 + 97C146ED1CF9000F007C117D /* Runner */ = {
  105 + isa = PBXNativeTarget;
  106 + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
  107 + buildPhases = (
  108 + 9740EEB61CF901F6004384FC /* Run Script */,
  109 + 97C146EA1CF9000F007C117D /* Sources */,
  110 + 97C146EB1CF9000F007C117D /* Frameworks */,
  111 + 97C146EC1CF9000F007C117D /* Resources */,
  112 + 9705A1C41CF9048500538489 /* Embed Frameworks */,
  113 + 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
  114 + );
  115 + buildRules = (
  116 + );
  117 + dependencies = (
  118 + );
  119 + name = Runner;
  120 + productName = Runner;
  121 + productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
  122 + productType = "com.apple.product-type.application";
  123 + };
  124 +/* End PBXNativeTarget section */
  125 +
  126 +/* Begin PBXProject section */
  127 + 97C146E61CF9000F007C117D /* Project object */ = {
  128 + isa = PBXProject;
  129 + attributes = {
  130 + LastUpgradeCheck = 1300;
  131 + ORGANIZATIONNAME = "";
  132 + TargetAttributes = {
  133 + 97C146ED1CF9000F007C117D = {
  134 + CreatedOnToolsVersion = 7.3.1;
  135 + LastSwiftMigration = 1100;
  136 + };
  137 + };
  138 + };
  139 + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
  140 + compatibilityVersion = "Xcode 9.3";
  141 + developmentRegion = en;
  142 + hasScannedForEncodings = 0;
  143 + knownRegions = (
  144 + en,
  145 + Base,
  146 + );
  147 + mainGroup = 97C146E51CF9000F007C117D;
  148 + productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
  149 + projectDirPath = "";
  150 + projectRoot = "";
  151 + targets = (
  152 + 97C146ED1CF9000F007C117D /* Runner */,
  153 + );
  154 + };
  155 +/* End PBXProject section */
  156 +
  157 +/* Begin PBXResourcesBuildPhase section */
  158 + 97C146EC1CF9000F007C117D /* Resources */ = {
  159 + isa = PBXResourcesBuildPhase;
  160 + buildActionMask = 2147483647;
  161 + files = (
  162 + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
  163 + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
  164 + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
  165 + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
  166 + );
  167 + runOnlyForDeploymentPostprocessing = 0;
  168 + };
  169 +/* End PBXResourcesBuildPhase section */
  170 +
  171 +/* Begin PBXShellScriptBuildPhase section */
  172 + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
  173 + isa = PBXShellScriptBuildPhase;
  174 + buildActionMask = 2147483647;
  175 + files = (
  176 + );
  177 + inputPaths = (
  178 + );
  179 + name = "Thin Binary";
  180 + outputPaths = (
  181 + );
  182 + runOnlyForDeploymentPostprocessing = 0;
  183 + shellPath = /bin/sh;
  184 + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
  185 + };
  186 + 9740EEB61CF901F6004384FC /* Run Script */ = {
  187 + isa = PBXShellScriptBuildPhase;
  188 + buildActionMask = 2147483647;
  189 + files = (
  190 + );
  191 + inputPaths = (
  192 + );
  193 + name = "Run Script";
  194 + outputPaths = (
  195 + );
  196 + runOnlyForDeploymentPostprocessing = 0;
  197 + shellPath = /bin/sh;
  198 + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
  199 + };
  200 +/* End PBXShellScriptBuildPhase section */
  201 +
  202 +/* Begin PBXSourcesBuildPhase section */
  203 + 97C146EA1CF9000F007C117D /* Sources */ = {
  204 + isa = PBXSourcesBuildPhase;
  205 + buildActionMask = 2147483647;
  206 + files = (
  207 + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
  208 + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
  209 + );
  210 + runOnlyForDeploymentPostprocessing = 0;
  211 + };
  212 +/* End PBXSourcesBuildPhase section */
  213 +
  214 +/* Begin PBXVariantGroup section */
  215 + 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
  216 + isa = PBXVariantGroup;
  217 + children = (
  218 + 97C146FB1CF9000F007C117D /* Base */,
  219 + );
  220 + name = Main.storyboard;
  221 + sourceTree = "<group>";
  222 + };
  223 + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
  224 + isa = PBXVariantGroup;
  225 + children = (
  226 + 97C147001CF9000F007C117D /* Base */,
  227 + );
  228 + name = LaunchScreen.storyboard;
  229 + sourceTree = "<group>";
  230 + };
  231 +/* End PBXVariantGroup section */
  232 +
  233 +/* Begin XCBuildConfiguration section */
  234 + 249021D3217E4FDB00AE95B9 /* Profile */ = {
  235 + isa = XCBuildConfiguration;
  236 + buildSettings = {
  237 + ALWAYS_SEARCH_USER_PATHS = NO;
  238 + CLANG_ANALYZER_NONNULL = YES;
  239 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
  240 + CLANG_CXX_LIBRARY = "libc++";
  241 + CLANG_ENABLE_MODULES = YES;
  242 + CLANG_ENABLE_OBJC_ARC = YES;
  243 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  244 + CLANG_WARN_BOOL_CONVERSION = YES;
  245 + CLANG_WARN_COMMA = YES;
  246 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  247 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  248 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  249 + CLANG_WARN_EMPTY_BODY = YES;
  250 + CLANG_WARN_ENUM_CONVERSION = YES;
  251 + CLANG_WARN_INFINITE_RECURSION = YES;
  252 + CLANG_WARN_INT_CONVERSION = YES;
  253 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  254 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  255 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  256 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  257 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  258 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  259 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  260 + CLANG_WARN_UNREACHABLE_CODE = YES;
  261 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  262 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  263 + COPY_PHASE_STRIP = NO;
  264 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  265 + ENABLE_NS_ASSERTIONS = NO;
  266 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  267 + GCC_C_LANGUAGE_STANDARD = gnu99;
  268 + GCC_NO_COMMON_BLOCKS = YES;
  269 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  270 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  271 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  272 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  273 + GCC_WARN_UNUSED_FUNCTION = YES;
  274 + GCC_WARN_UNUSED_VARIABLE = YES;
  275 + IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  276 + MTL_ENABLE_DEBUG_INFO = NO;
  277 + SDKROOT = iphoneos;
  278 + SUPPORTED_PLATFORMS = iphoneos;
  279 + TARGETED_DEVICE_FAMILY = "1,2";
  280 + VALIDATE_PRODUCT = YES;
  281 + };
  282 + name = Profile;
  283 + };
  284 + 249021D4217E4FDB00AE95B9 /* Profile */ = {
  285 + isa = XCBuildConfiguration;
  286 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
  287 + buildSettings = {
  288 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  289 + CLANG_ENABLE_MODULES = YES;
  290 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
  291 + DEVELOPMENT_TEAM = 8J59HM8B82;
  292 + ENABLE_BITCODE = NO;
  293 + INFOPLIST_FILE = Runner/Info.plist;
  294 + LD_RUNPATH_SEARCH_PATHS = (
  295 + "$(inherited)",
  296 + "@executable_path/Frameworks",
  297 + );
  298 + PRODUCT_BUNDLE_IDENTIFIER = com.example.deviceUtilsMyExample;
  299 + PRODUCT_NAME = "$(TARGET_NAME)";
  300 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
  301 + SWIFT_VERSION = 5.0;
  302 + VERSIONING_SYSTEM = "apple-generic";
  303 + };
  304 + name = Profile;
  305 + };
  306 + 97C147031CF9000F007C117D /* Debug */ = {
  307 + isa = XCBuildConfiguration;
  308 + buildSettings = {
  309 + ALWAYS_SEARCH_USER_PATHS = NO;
  310 + CLANG_ANALYZER_NONNULL = YES;
  311 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
  312 + CLANG_CXX_LIBRARY = "libc++";
  313 + CLANG_ENABLE_MODULES = YES;
  314 + CLANG_ENABLE_OBJC_ARC = YES;
  315 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  316 + CLANG_WARN_BOOL_CONVERSION = YES;
  317 + CLANG_WARN_COMMA = YES;
  318 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  319 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  320 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  321 + CLANG_WARN_EMPTY_BODY = YES;
  322 + CLANG_WARN_ENUM_CONVERSION = YES;
  323 + CLANG_WARN_INFINITE_RECURSION = YES;
  324 + CLANG_WARN_INT_CONVERSION = YES;
  325 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  326 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  327 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  328 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  329 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  330 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  331 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  332 + CLANG_WARN_UNREACHABLE_CODE = YES;
  333 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  334 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  335 + COPY_PHASE_STRIP = NO;
  336 + DEBUG_INFORMATION_FORMAT = dwarf;
  337 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  338 + ENABLE_TESTABILITY = YES;
  339 + GCC_C_LANGUAGE_STANDARD = gnu99;
  340 + GCC_DYNAMIC_NO_PIC = NO;
  341 + GCC_NO_COMMON_BLOCKS = YES;
  342 + GCC_OPTIMIZATION_LEVEL = 0;
  343 + GCC_PREPROCESSOR_DEFINITIONS = (
  344 + "DEBUG=1",
  345 + "$(inherited)",
  346 + );
  347 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  348 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  349 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  350 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  351 + GCC_WARN_UNUSED_FUNCTION = YES;
  352 + GCC_WARN_UNUSED_VARIABLE = YES;
  353 + IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  354 + MTL_ENABLE_DEBUG_INFO = YES;
  355 + ONLY_ACTIVE_ARCH = YES;
  356 + SDKROOT = iphoneos;
  357 + TARGETED_DEVICE_FAMILY = "1,2";
  358 + };
  359 + name = Debug;
  360 + };
  361 + 97C147041CF9000F007C117D /* Release */ = {
  362 + isa = XCBuildConfiguration;
  363 + buildSettings = {
  364 + ALWAYS_SEARCH_USER_PATHS = NO;
  365 + CLANG_ANALYZER_NONNULL = YES;
  366 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
  367 + CLANG_CXX_LIBRARY = "libc++";
  368 + CLANG_ENABLE_MODULES = YES;
  369 + CLANG_ENABLE_OBJC_ARC = YES;
  370 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  371 + CLANG_WARN_BOOL_CONVERSION = YES;
  372 + CLANG_WARN_COMMA = YES;
  373 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  374 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  375 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  376 + CLANG_WARN_EMPTY_BODY = YES;
  377 + CLANG_WARN_ENUM_CONVERSION = YES;
  378 + CLANG_WARN_INFINITE_RECURSION = YES;
  379 + CLANG_WARN_INT_CONVERSION = YES;
  380 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  381 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  382 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  383 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  384 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  385 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  386 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  387 + CLANG_WARN_UNREACHABLE_CODE = YES;
  388 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  389 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  390 + COPY_PHASE_STRIP = NO;
  391 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  392 + ENABLE_NS_ASSERTIONS = NO;
  393 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  394 + GCC_C_LANGUAGE_STANDARD = gnu99;
  395 + GCC_NO_COMMON_BLOCKS = YES;
  396 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  397 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  398 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  399 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  400 + GCC_WARN_UNUSED_FUNCTION = YES;
  401 + GCC_WARN_UNUSED_VARIABLE = YES;
  402 + IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  403 + MTL_ENABLE_DEBUG_INFO = NO;
  404 + SDKROOT = iphoneos;
  405 + SUPPORTED_PLATFORMS = iphoneos;
  406 + SWIFT_COMPILATION_MODE = wholemodule;
  407 + SWIFT_OPTIMIZATION_LEVEL = "-O";
  408 + TARGETED_DEVICE_FAMILY = "1,2";
  409 + VALIDATE_PRODUCT = YES;
  410 + };
  411 + name = Release;
  412 + };
  413 + 97C147061CF9000F007C117D /* Debug */ = {
  414 + isa = XCBuildConfiguration;
  415 + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
  416 + buildSettings = {
  417 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  418 + CLANG_ENABLE_MODULES = YES;
  419 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
  420 + DEVELOPMENT_TEAM = 8J59HM8B82;
  421 + ENABLE_BITCODE = NO;
  422 + INFOPLIST_FILE = Runner/Info.plist;
  423 + LD_RUNPATH_SEARCH_PATHS = (
  424 + "$(inherited)",
  425 + "@executable_path/Frameworks",
  426 + );
  427 + PRODUCT_BUNDLE_IDENTIFIER = com.example.deviceUtilsMyExample;
  428 + PRODUCT_NAME = "$(TARGET_NAME)";
  429 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
  430 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
  431 + SWIFT_VERSION = 5.0;
  432 + VERSIONING_SYSTEM = "apple-generic";
  433 + };
  434 + name = Debug;
  435 + };
  436 + 97C147071CF9000F007C117D /* Release */ = {
  437 + isa = XCBuildConfiguration;
  438 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
  439 + buildSettings = {
  440 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  441 + CLANG_ENABLE_MODULES = YES;
  442 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
  443 + DEVELOPMENT_TEAM = 8J59HM8B82;
  444 + ENABLE_BITCODE = NO;
  445 + INFOPLIST_FILE = Runner/Info.plist;
  446 + LD_RUNPATH_SEARCH_PATHS = (
  447 + "$(inherited)",
  448 + "@executable_path/Frameworks",
  449 + );
  450 + PRODUCT_BUNDLE_IDENTIFIER = com.example.deviceUtilsMyExample;
  451 + PRODUCT_NAME = "$(TARGET_NAME)";
  452 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
  453 + SWIFT_VERSION = 5.0;
  454 + VERSIONING_SYSTEM = "apple-generic";
  455 + };
  456 + name = Release;
  457 + };
  458 +/* End XCBuildConfiguration section */
  459 +
  460 +/* Begin XCConfigurationList section */
  461 + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
  462 + isa = XCConfigurationList;
  463 + buildConfigurations = (
  464 + 97C147031CF9000F007C117D /* Debug */,
  465 + 97C147041CF9000F007C117D /* Release */,
  466 + 249021D3217E4FDB00AE95B9 /* Profile */,
  467 + );
  468 + defaultConfigurationIsVisible = 0;
  469 + defaultConfigurationName = Release;
  470 + };
  471 + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
  472 + isa = XCConfigurationList;
  473 + buildConfigurations = (
  474 + 97C147061CF9000F007C117D /* Debug */,
  475 + 97C147071CF9000F007C117D /* Release */,
  476 + 249021D4217E4FDB00AE95B9 /* Profile */,
  477 + );
  478 + defaultConfigurationIsVisible = 0;
  479 + defaultConfigurationName = Release;
  480 + };
  481 +/* End XCConfigurationList section */
  482 + };
  483 + rootObject = 97C146E61CF9000F007C117D /* Project object */;
  484 +}
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "self:">
  6 + </FileRef>
  7 +</Workspace>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>PreviewsEnabled</key>
  6 + <false/>
  7 +</dict>
  8 +</plist>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Scheme
  3 + LastUpgradeVersion = "1300"
  4 + version = "1.3">
  5 + <BuildAction
  6 + parallelizeBuildables = "YES"
  7 + buildImplicitDependencies = "YES">
  8 + <BuildActionEntries>
  9 + <BuildActionEntry
  10 + buildForTesting = "YES"
  11 + buildForRunning = "YES"
  12 + buildForProfiling = "YES"
  13 + buildForArchiving = "YES"
  14 + buildForAnalyzing = "YES">
  15 + <BuildableReference
  16 + BuildableIdentifier = "primary"
  17 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  18 + BuildableName = "Runner.app"
  19 + BlueprintName = "Runner"
  20 + ReferencedContainer = "container:Runner.xcodeproj">
  21 + </BuildableReference>
  22 + </BuildActionEntry>
  23 + </BuildActionEntries>
  24 + </BuildAction>
  25 + <TestAction
  26 + buildConfiguration = "Debug"
  27 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  28 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  29 + shouldUseLaunchSchemeArgsEnv = "YES">
  30 + <MacroExpansion>
  31 + <BuildableReference
  32 + BuildableIdentifier = "primary"
  33 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  34 + BuildableName = "Runner.app"
  35 + BlueprintName = "Runner"
  36 + ReferencedContainer = "container:Runner.xcodeproj">
  37 + </BuildableReference>
  38 + </MacroExpansion>
  39 + <Testables>
  40 + </Testables>
  41 + </TestAction>
  42 + <LaunchAction
  43 + buildConfiguration = "Debug"
  44 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  45 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  46 + launchStyle = "0"
  47 + useCustomWorkingDirectory = "NO"
  48 + ignoresPersistentStateOnLaunch = "NO"
  49 + debugDocumentVersioning = "YES"
  50 + debugServiceExtension = "internal"
  51 + allowLocationSimulation = "YES">
  52 + <BuildableProductRunnable
  53 + runnableDebuggingMode = "0">
  54 + <BuildableReference
  55 + BuildableIdentifier = "primary"
  56 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  57 + BuildableName = "Runner.app"
  58 + BlueprintName = "Runner"
  59 + ReferencedContainer = "container:Runner.xcodeproj">
  60 + </BuildableReference>
  61 + </BuildableProductRunnable>
  62 + </LaunchAction>
  63 + <ProfileAction
  64 + buildConfiguration = "Profile"
  65 + shouldUseLaunchSchemeArgsEnv = "YES"
  66 + savedToolIdentifier = ""
  67 + useCustomWorkingDirectory = "NO"
  68 + debugDocumentVersioning = "YES">
  69 + <BuildableProductRunnable
  70 + runnableDebuggingMode = "0">
  71 + <BuildableReference
  72 + BuildableIdentifier = "primary"
  73 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  74 + BuildableName = "Runner.app"
  75 + BlueprintName = "Runner"
  76 + ReferencedContainer = "container:Runner.xcodeproj">
  77 + </BuildableReference>
  78 + </BuildableProductRunnable>
  79 + </ProfileAction>
  80 + <AnalyzeAction
  81 + buildConfiguration = "Debug">
  82 + </AnalyzeAction>
  83 + <ArchiveAction
  84 + buildConfiguration = "Release"
  85 + revealArchiveInOrganizer = "YES">
  86 + </ArchiveAction>
  87 +</Scheme>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "group:Runner.xcodeproj">
  6 + </FileRef>
  7 +</Workspace>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>PreviewsEnabled</key>
  6 + <false/>
  7 +</dict>
  8 +</plist>
  1 +import UIKit
  2 +import Flutter
  3 +
  4 +@UIApplicationMain
  5 +@objc class AppDelegate: FlutterAppDelegate {
  6 + override func application(
  7 + _ application: UIApplication,
  8 + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  9 + ) -> Bool {
  10 + GeneratedPluginRegistrant.register(with: self)
  11 + return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  12 + }
  13 +}
  1 +{
  2 + "images" : [
  3 + {
  4 + "size" : "20x20",
  5 + "idiom" : "iphone",
  6 + "filename" : "Icon-App-20x20@2x.png",
  7 + "scale" : "2x"
  8 + },
  9 + {
  10 + "size" : "20x20",
  11 + "idiom" : "iphone",
  12 + "filename" : "Icon-App-20x20@3x.png",
  13 + "scale" : "3x"
  14 + },
  15 + {
  16 + "size" : "29x29",
  17 + "idiom" : "iphone",
  18 + "filename" : "Icon-App-29x29@1x.png",
  19 + "scale" : "1x"
  20 + },
  21 + {
  22 + "size" : "29x29",
  23 + "idiom" : "iphone",
  24 + "filename" : "Icon-App-29x29@2x.png",
  25 + "scale" : "2x"
  26 + },
  27 + {
  28 + "size" : "29x29",
  29 + "idiom" : "iphone",
  30 + "filename" : "Icon-App-29x29@3x.png",
  31 + "scale" : "3x"
  32 + },
  33 + {
  34 + "size" : "40x40",
  35 + "idiom" : "iphone",
  36 + "filename" : "Icon-App-40x40@2x.png",
  37 + "scale" : "2x"
  38 + },
  39 + {
  40 + "size" : "40x40",
  41 + "idiom" : "iphone",
  42 + "filename" : "Icon-App-40x40@3x.png",
  43 + "scale" : "3x"
  44 + },
  45 + {
  46 + "size" : "60x60",
  47 + "idiom" : "iphone",
  48 + "filename" : "Icon-App-60x60@2x.png",
  49 + "scale" : "2x"
  50 + },
  51 + {
  52 + "size" : "60x60",
  53 + "idiom" : "iphone",
  54 + "filename" : "Icon-App-60x60@3x.png",
  55 + "scale" : "3x"
  56 + },
  57 + {
  58 + "size" : "20x20",
  59 + "idiom" : "ipad",
  60 + "filename" : "Icon-App-20x20@1x.png",
  61 + "scale" : "1x"
  62 + },
  63 + {
  64 + "size" : "20x20",
  65 + "idiom" : "ipad",
  66 + "filename" : "Icon-App-20x20@2x.png",
  67 + "scale" : "2x"
  68 + },
  69 + {
  70 + "size" : "29x29",
  71 + "idiom" : "ipad",
  72 + "filename" : "Icon-App-29x29@1x.png",
  73 + "scale" : "1x"
  74 + },
  75 + {
  76 + "size" : "29x29",
  77 + "idiom" : "ipad",
  78 + "filename" : "Icon-App-29x29@2x.png",
  79 + "scale" : "2x"
  80 + },
  81 + {
  82 + "size" : "40x40",
  83 + "idiom" : "ipad",
  84 + "filename" : "Icon-App-40x40@1x.png",
  85 + "scale" : "1x"
  86 + },
  87 + {
  88 + "size" : "40x40",
  89 + "idiom" : "ipad",
  90 + "filename" : "Icon-App-40x40@2x.png",
  91 + "scale" : "2x"
  92 + },
  93 + {
  94 + "size" : "76x76",
  95 + "idiom" : "ipad",
  96 + "filename" : "Icon-App-76x76@1x.png",
  97 + "scale" : "1x"
  98 + },
  99 + {
  100 + "size" : "76x76",
  101 + "idiom" : "ipad",
  102 + "filename" : "Icon-App-76x76@2x.png",
  103 + "scale" : "2x"
  104 + },
  105 + {
  106 + "size" : "83.5x83.5",
  107 + "idiom" : "ipad",
  108 + "filename" : "Icon-App-83.5x83.5@2x.png",
  109 + "scale" : "2x"
  110 + },
  111 + {
  112 + "size" : "1024x1024",
  113 + "idiom" : "ios-marketing",
  114 + "filename" : "Icon-App-1024x1024@1x.png",
  115 + "scale" : "1x"
  116 + }
  117 + ],
  118 + "info" : {
  119 + "version" : 1,
  120 + "author" : "xcode"
  121 + }
  122 +}
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "LaunchImage.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "filename" : "LaunchImage@2x.png",
  11 + "scale" : "2x"
  12 + },
  13 + {
  14 + "idiom" : "universal",
  15 + "filename" : "LaunchImage@3x.png",
  16 + "scale" : "3x"
  17 + }
  18 + ],
  19 + "info" : {
  20 + "version" : 1,
  21 + "author" : "xcode"
  22 + }
  23 +}
  1 +# Launch Screen Assets
  2 +
  3 +You can customize the launch screen with your own desired assets by replacing the image files in this directory.
  4 +
  5 +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
  3 + <dependencies>
  4 + <deployment identifier="iOS"/>
  5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
  6 + </dependencies>
  7 + <scenes>
  8 + <!--View Controller-->
  9 + <scene sceneID="EHf-IW-A2E">
  10 + <objects>
  11 + <viewController id="01J-lp-oVM" sceneMemberID="viewController">
  12 + <layoutGuides>
  13 + <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
  14 + <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
  15 + </layoutGuides>
  16 + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
  17 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
  18 + <subviews>
  19 + <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
  20 + </imageView>
  21 + </subviews>
  22 + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  23 + <constraints>
  24 + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
  25 + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
  26 + </constraints>
  27 + </view>
  28 + </viewController>
  29 + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
  30 + </objects>
  31 + <point key="canvasLocation" x="53" y="375"/>
  32 + </scene>
  33 + </scenes>
  34 + <resources>
  35 + <image name="LaunchImage" width="168" height="185"/>
  36 + </resources>
  37 +</document>
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
  3 + <dependencies>
  4 + <deployment identifier="iOS"/>
  5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
  6 + </dependencies>
  7 + <scenes>
  8 + <!--Flutter View Controller-->
  9 + <scene sceneID="tne-QT-ifu">
  10 + <objects>
  11 + <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
  12 + <layoutGuides>
  13 + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
  14 + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
  15 + </layoutGuides>
  16 + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
  17 + <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
  18 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
  19 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  20 + </view>
  21 + </viewController>
  22 + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
  23 + </objects>
  24 + </scene>
  25 + </scenes>
  26 +</document>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>$(DEVELOPMENT_LANGUAGE)</string>
  7 + <key>CFBundleDisplayName</key>
  8 + <string>Device Utils My</string>
  9 + <key>CFBundleExecutable</key>
  10 + <string>$(EXECUTABLE_NAME)</string>
  11 + <key>CFBundleIdentifier</key>
  12 + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
  13 + <key>CFBundleInfoDictionaryVersion</key>
  14 + <string>6.0</string>
  15 + <key>CFBundleName</key>
  16 + <string>device_utils_my_example</string>
  17 + <key>CFBundlePackageType</key>
  18 + <string>APPL</string>
  19 + <key>CFBundleShortVersionString</key>
  20 + <string>$(FLUTTER_BUILD_NAME)</string>
  21 + <key>CFBundleSignature</key>
  22 + <string>????</string>
  23 + <key>CFBundleVersion</key>
  24 + <string>$(FLUTTER_BUILD_NUMBER)</string>
  25 + <key>LSRequiresIPhoneOS</key>
  26 + <true/>
  27 + <key>UILaunchStoryboardName</key>
  28 + <string>LaunchScreen</string>
  29 + <key>UIMainStoryboardFile</key>
  30 + <string>Main</string>
  31 + <key>UISupportedInterfaceOrientations</key>
  32 + <array>
  33 + <string>UIInterfaceOrientationPortrait</string>
  34 + <string>UIInterfaceOrientationLandscapeLeft</string>
  35 + <string>UIInterfaceOrientationLandscapeRight</string>
  36 + </array>
  37 + <key>UISupportedInterfaceOrientations~ipad</key>
  38 + <array>
  39 + <string>UIInterfaceOrientationPortrait</string>
  40 + <string>UIInterfaceOrientationPortraitUpsideDown</string>
  41 + <string>UIInterfaceOrientationLandscapeLeft</string>
  42 + <string>UIInterfaceOrientationLandscapeRight</string>
  43 + </array>
  44 + <key>UIViewControllerBasedStatusBarAppearance</key>
  45 + <false/>
  46 + <key>CADisableMinimumFrameDurationOnPhone</key>
  47 + <true/>
  48 + <key>UIApplicationSupportsIndirectInputEvents</key>
  49 + <true/>
  50 +</dict>
  51 +</plist>
  1 +import 'package:flutter/material.dart';
  2 +import 'dart:async';
  3 +
  4 +import 'package:flutter/services.dart';
  5 +import 'package:device_utils_my/device_utils_my.dart';
  6 +
  7 +void main() {
  8 + runApp(const MyApp());
  9 +}
  10 +
  11 +class MyApp extends StatefulWidget {
  12 + const MyApp({Key key});
  13 +
  14 + @override
  15 + State<MyApp> createState() => _MyAppState();
  16 +}
  17 +
  18 +class _MyAppState extends State<MyApp> {
  19 + String _platformVersion = 'Unknown';
  20 + final _deviceUtilsMyPlugin = DeviceUtilsMy();
  21 +
  22 + @override
  23 + void initState() {
  24 + super.initState();
  25 + initPlatformState();
  26 + }
  27 +
  28 + // Platform messages are asynchronous, so we initialize in an async method.
  29 + Future<void> initPlatformState() async {
  30 + String platformVersion;
  31 + // Platform messages may fail, so we use a try/catch PlatformException.
  32 + // We also handle the message potentially returning null.
  33 + try {
  34 + platformVersion =
  35 + await _deviceUtilsMyPlugin.getPlatformVersion() ?? 'Unknown platform version';
  36 + } on PlatformException {
  37 + platformVersion = 'Failed to get platform version.';
  38 + }
  39 +
  40 + // If the widget was removed from the tree while the asynchronous platform
  41 + // message was in flight, we want to discard the reply rather than calling
  42 + // setState to update our non-existent appearance.
  43 + if (!mounted) return;
  44 +
  45 + setState(() {
  46 + _platformVersion = platformVersion;
  47 + });
  48 + }
  49 +
  50 + @override
  51 + Widget build(BuildContext context) {
  52 + return MaterialApp(
  53 + home: Scaffold(
  54 + appBar: AppBar(
  55 + title: const Text('Plugin example app'),
  56 + ),
  57 + body: Center(
  58 + child: Text('Running on: $_platformVersion\n'),
  59 + ),
  60 + ),
  61 + );
  62 + }
  63 +}
  1 +# Generated by pub
  2 +# See https://dart.dev/tools/pub/glossary#lockfile
  3 +packages:
  4 + async:
  5 + dependency: transitive
  6 + description:
  7 + name: async
  8 + url: "https://pub.flutter-io.cn"
  9 + source: hosted
  10 + version: "2.9.0"
  11 + boolean_selector:
  12 + dependency: transitive
  13 + description:
  14 + name: boolean_selector
  15 + url: "https://pub.flutter-io.cn"
  16 + source: hosted
  17 + version: "2.1.0"
  18 + characters:
  19 + dependency: transitive
  20 + description:
  21 + name: characters
  22 + url: "https://pub.flutter-io.cn"
  23 + source: hosted
  24 + version: "1.2.1"
  25 + clock:
  26 + dependency: transitive
  27 + description:
  28 + name: clock
  29 + url: "https://pub.flutter-io.cn"
  30 + source: hosted
  31 + version: "1.1.1"
  32 + collection:
  33 + dependency: transitive
  34 + description:
  35 + name: collection
  36 + url: "https://pub.flutter-io.cn"
  37 + source: hosted
  38 + version: "1.16.0"
  39 + cupertino_icons:
  40 + dependency: "direct main"
  41 + description:
  42 + name: cupertino_icons
  43 + url: "https://pub.flutter-io.cn"
  44 + source: hosted
  45 + version: "1.0.5"
  46 + device_utils_my:
  47 + dependency: "direct main"
  48 + description:
  49 + path: ".."
  50 + relative: true
  51 + source: path
  52 + version: "0.0.1"
  53 + fake_async:
  54 + dependency: transitive
  55 + description:
  56 + name: fake_async
  57 + url: "https://pub.flutter-io.cn"
  58 + source: hosted
  59 + version: "1.3.1"
  60 + flutter:
  61 + dependency: "direct main"
  62 + description: flutter
  63 + source: sdk
  64 + version: "0.0.0"
  65 + flutter_lints:
  66 + dependency: "direct dev"
  67 + description:
  68 + name: flutter_lints
  69 + url: "https://pub.flutter-io.cn"
  70 + source: hosted
  71 + version: "2.0.2"
  72 + flutter_test:
  73 + dependency: "direct dev"
  74 + description: flutter
  75 + source: sdk
  76 + version: "0.0.0"
  77 + lints:
  78 + dependency: transitive
  79 + description:
  80 + name: lints
  81 + url: "https://pub.flutter-io.cn"
  82 + source: hosted
  83 + version: "2.0.1"
  84 + matcher:
  85 + dependency: transitive
  86 + description:
  87 + name: matcher
  88 + url: "https://pub.flutter-io.cn"
  89 + source: hosted
  90 + version: "0.12.12"
  91 + material_color_utilities:
  92 + dependency: transitive
  93 + description:
  94 + name: material_color_utilities
  95 + url: "https://pub.flutter-io.cn"
  96 + source: hosted
  97 + version: "0.1.5"
  98 + meta:
  99 + dependency: transitive
  100 + description:
  101 + name: meta
  102 + url: "https://pub.flutter-io.cn"
  103 + source: hosted
  104 + version: "1.8.0"
  105 + path:
  106 + dependency: transitive
  107 + description:
  108 + name: path
  109 + url: "https://pub.flutter-io.cn"
  110 + source: hosted
  111 + version: "1.8.2"
  112 + plugin_platform_interface:
  113 + dependency: transitive
  114 + description:
  115 + name: plugin_platform_interface
  116 + url: "https://pub.flutter-io.cn"
  117 + source: hosted
  118 + version: "2.1.5"
  119 + sky_engine:
  120 + dependency: transitive
  121 + description: flutter
  122 + source: sdk
  123 + version: "0.0.99"
  124 + source_span:
  125 + dependency: transitive
  126 + description:
  127 + name: source_span
  128 + url: "https://pub.flutter-io.cn"
  129 + source: hosted
  130 + version: "1.9.0"
  131 + stack_trace:
  132 + dependency: transitive
  133 + description:
  134 + name: stack_trace
  135 + url: "https://pub.flutter-io.cn"
  136 + source: hosted
  137 + version: "1.10.0"
  138 + stream_channel:
  139 + dependency: transitive
  140 + description:
  141 + name: stream_channel
  142 + url: "https://pub.flutter-io.cn"
  143 + source: hosted
  144 + version: "2.1.0"
  145 + string_scanner:
  146 + dependency: transitive
  147 + description:
  148 + name: string_scanner
  149 + url: "https://pub.flutter-io.cn"
  150 + source: hosted
  151 + version: "1.1.1"
  152 + term_glyph:
  153 + dependency: transitive
  154 + description:
  155 + name: term_glyph
  156 + url: "https://pub.flutter-io.cn"
  157 + source: hosted
  158 + version: "1.2.1"
  159 + test_api:
  160 + dependency: transitive
  161 + description:
  162 + name: test_api
  163 + url: "https://pub.flutter-io.cn"
  164 + source: hosted
  165 + version: "0.4.12"
  166 + vector_math:
  167 + dependency: transitive
  168 + description:
  169 + name: vector_math
  170 + url: "https://pub.flutter-io.cn"
  171 + source: hosted
  172 + version: "2.1.2"
  173 +sdks:
  174 + dart: ">=2.18.0 <3.0.0"
  1 +name: device_utils_my_example
  2 +description: Demonstrates how to use the device_utils_my plugin.
  3 +
  4 +# The following line prevents the package from being accidentally published to
  5 +# pub.dev using `flutter pub publish`. This is preferred for private packages.
  6 +publish_to: 'none' # Remove this line if you wish to publish to pub.dev
  7 +
  8 +environment:
  9 + sdk: ">=2.1.0 <3.0.0"
  10 +
  11 +# Dependencies specify other packages that your package needs in order to work.
  12 +# To automatically upgrade your package dependencies to the latest versions
  13 +# consider running `flutter pub upgrade --major-versions`. Alternatively,
  14 +# dependencies can be manually updated by changing the version numbers below to
  15 +# the latest version available on pub.dev. To see which dependencies have newer
  16 +# versions available, run `flutter pub outdated`.
  17 +dependencies:
  18 + flutter:
  19 + sdk: flutter
  20 +
  21 + device_utils_my:
  22 + # When depending on this package from a real application you should use:
  23 + # device_utils_my: ^x.y.z
  24 + # See https://dart.dev/tools/pub/dependencies#version-constraints
  25 + # The example app is bundled with the plugin so we use a path dependency on
  26 + # the parent directory to use the current plugin's version.
  27 + path: ../
  28 +
  29 + # The following adds the Cupertino Icons font to your application.
  30 + # Use with the CupertinoIcons class for iOS style icons.
  31 + cupertino_icons: ^1.0.2
  32 +
  33 +dev_dependencies:
  34 + flutter_test:
  35 + sdk: flutter
  36 +
  37 + # The "flutter_lints" package below contains a set of recommended lints to
  38 + # encourage good coding practices. The lint set provided by the package is
  39 + # activated in the `analysis_options.yaml` file located at the root of your
  40 + # package. See that file for information about deactivating specific lint
  41 + # rules and activating additional ones.
  42 + flutter_lints: ^2.0.0
  43 +
  44 +# For information on the generic Dart part of this file, see the
  45 +# following page: https://dart.dev/tools/pub/pubspec
  46 +
  47 +# The following section is specific to Flutter packages.
  48 +flutter:
  49 +
  50 + # The following line ensures that the Material Icons font is
  51 + # included with your application, so that you can use the icons in
  52 + # the material Icons class.
  53 + uses-material-design: true
  54 +
  55 + # To add assets to your application, add an assets section, like this:
  56 + # assets:
  57 + # - images/a_dot_burr.jpeg
  58 + # - images/a_dot_ham.jpeg
  59 +
  60 + # An image asset can refer to one or more resolution-specific "variants", see
  61 + # https://flutter.dev/assets-and-images/#resolution-aware
  62 +
  63 + # For details regarding adding assets from package dependencies, see
  64 + # https://flutter.dev/assets-and-images/#from-packages
  65 +
  66 + # To add custom fonts to your application, add a fonts section here,
  67 + # in this "flutter" section. Each entry in this list should have a
  68 + # "family" key with the font family name, and a "fonts" key with a
  69 + # list giving the asset and other descriptors for the font. For
  70 + # example:
  71 + # fonts:
  72 + # - family: Schyler
  73 + # fonts:
  74 + # - asset: fonts/Schyler-Regular.ttf
  75 + # - asset: fonts/Schyler-Italic.ttf
  76 + # style: italic
  77 + # - family: Trajan Pro
  78 + # fonts:
  79 + # - asset: fonts/TrajanPro.ttf
  80 + # - asset: fonts/TrajanPro_Bold.ttf
  81 + # weight: 700
  82 + #
  83 + # For details regarding fonts from package dependencies,
  84 + # see https://flutter.dev/custom-fonts/#from-packages
  1 +// This is a basic Flutter widget test.
  2 +//
  3 +// To perform an interaction with a widget in your test, use the WidgetTester
  4 +// utility in the flutter_test package. For example, you can send tap and scroll
  5 +// gestures. You can also use WidgetTester to find child widgets in the widget
  6 +// tree, read text, and verify that the values of widget properties are correct.
  7 +
  8 +import 'package:flutter/material.dart';
  9 +import 'package:flutter_test/flutter_test.dart';
  10 +
  11 +import 'package:device_utils_my_example/main.dart';
  12 +
  13 +void main() {
  14 + testWidgets('Verify Platform version', (WidgetTester tester) async {
  15 + // Build our app and trigger a frame.
  16 + await tester.pumpWidget(const MyApp());
  17 +
  18 + // Verify that platform version is retrieved.
  19 + expect(
  20 + find.byWidgetPredicate(
  21 + (Widget widget) => widget is Text &&
  22 + widget.data.startsWith('Running on:'),
  23 + ),
  24 + findsOneWidget,
  25 + );
  26 + });
  27 +}
  1 +.idea/
  2 +.vagrant/
  3 +.sconsign.dblite
  4 +.svn/
  5 +
  6 +.DS_Store
  7 +*.swp
  8 +profile
  9 +
  10 +DerivedData/
  11 +build/
  12 +GeneratedPluginRegistrant.h
  13 +GeneratedPluginRegistrant.m
  14 +
  15 +.generated/
  16 +
  17 +*.pbxuser
  18 +*.mode1v3
  19 +*.mode2v3
  20 +*.perspectivev3
  21 +
  22 +!default.pbxuser
  23 +!default.mode1v3
  24 +!default.mode2v3
  25 +!default.perspectivev3
  26 +
  27 +xcuserdata
  28 +
  29 +*.moved-aside
  30 +
  31 +*.pyc
  32 +*sync/
  33 +Icon?
  34 +.tags*
  35 +
  36 +/Flutter/Generated.xcconfig
  37 +/Flutter/ephemeral/
  38 +/Flutter/flutter_export_environment.sh
  1 +#import <Flutter/Flutter.h>
  2 +
  3 +@interface DeviceUtilsMyPlugin : NSObject<FlutterPlugin>
  4 +@end
  1 +#import "DeviceUtilsMyPlugin.h"
  2 +#if __has_include(<device_utils_my/device_utils_my-Swift.h>)
  3 +#import <device_utils_my/device_utils_my-Swift.h>
  4 +#else
  5 +// Support project import fallback if the generated compatibility header
  6 +// is not copied when this plugin is created as a library.
  7 +// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816
  8 +#import "device_utils_my-Swift.h"
  9 +#endif
  10 +
  11 +@implementation DeviceUtilsMyPlugin
  12 ++ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  13 + [SwiftDeviceUtilsMyPlugin registerWithRegistrar:registrar];
  14 +}
  15 +@end
  1 +import Flutter
  2 +import UIKit
  3 +
  4 +public class SwiftDeviceUtilsMyPlugin: NSObject, FlutterPlugin {
  5 + public static func register(with registrar: FlutterPluginRegistrar) {
  6 + let channel = FlutterMethodChannel(name: "device_utils_my", binaryMessenger: registrar.messenger())
  7 + let instance = SwiftDeviceUtilsMyPlugin()
  8 + registrar.addMethodCallDelegate(instance, channel: channel)
  9 + }
  10 +
  11 + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
  12 + result("iOS " + UIDevice.current.systemVersion)
  13 + }
  14 +}
  1 +#
  2 +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
  3 +# Run `pod lib lint device_utils_my.podspec` to validate before publishing.
  4 +#
  5 +Pod::Spec.new do |s|
  6 + s.name = 'device_utils_my'
  7 + s.version = '0.0.1'
  8 + s.summary = 'A new Flutter plugin project.'
  9 + s.description = <<-DESC
  10 +A new Flutter plugin project.
  11 + DESC
  12 + s.homepage = 'http://example.com'
  13 + s.license = { :file => '../LICENSE' }
  14 + s.author = { 'Your Company' => 'email@example.com' }
  15 + s.source = { :path => '.' }
  16 + s.source_files = 'Classes/**/*'
  17 + s.dependency 'Flutter'
  18 + s.platform = :ios, '9.0'
  19 +
  20 + # Flutter.framework does not contain a i386 slice.
  21 + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
  22 + s.swift_version = '5.0'
  23 +end
  1 +
  2 +import 'device_utils_my_platform_interface.dart';
  3 +
  4 +class DeviceUtilsMy {
  5 + Future<String> getPlatformVersion() {
  6 + return DeviceUtilsMyPlatform.instance.getPlatformVersion();
  7 + }
  8 + Future<bool> checkInstallPermission() {
  9 + return DeviceUtilsMyPlatform.instance.checkInstallPermission();
  10 + }
  11 + Future<bool> openPackageInstall() {
  12 + return DeviceUtilsMyPlatform.instance.openPackageInstall();
  13 + }
  14 +
  15 +
  16 +
  17 +}
  1 +import 'package:flutter/foundation.dart';
  2 +import 'package:flutter/services.dart';
  3 +
  4 +import 'device_utils_my_platform_interface.dart';
  5 +
  6 +/// An implementation of [DeviceUtilsMyPlatform] that uses method channels.
  7 +class MethodChannelDeviceUtilsMy extends DeviceUtilsMyPlatform {
  8 + /// The method channel used to interact with the native platform.
  9 + @visibleForTesting
  10 + final methodChannel = const MethodChannel('device_utils_my');
  11 +
  12 + @override
  13 + Future<String> getPlatformVersion() async {
  14 + final version =
  15 + await methodChannel.invokeMethod<String>('getPlatformVersion');
  16 + return version;
  17 + }
  18 +
  19 + @override
  20 + Future<bool> checkInstallPermission() async {
  21 + final installPermission =
  22 + await methodChannel.invokeMethod<bool>('checkInstallPermission');
  23 + return installPermission;
  24 + }
  25 +
  26 + @override
  27 + Future<bool> openPackageInstall() async {
  28 + final openPackageInstall =
  29 + await methodChannel.invokeMethod<bool>('openPackageInstall');
  30 + return openPackageInstall;
  31 + }
  32 +}
  1 +import 'package:plugin_platform_interface/plugin_platform_interface.dart';
  2 +
  3 +import 'device_utils_my_method_channel.dart';
  4 +
  5 +abstract class DeviceUtilsMyPlatform extends PlatformInterface {
  6 + /// Constructs a DeviceUtilsMyPlatform.
  7 + DeviceUtilsMyPlatform() : super(token: _token);
  8 +
  9 + static final Object _token = Object();
  10 +
  11 + static DeviceUtilsMyPlatform _instance = MethodChannelDeviceUtilsMy();
  12 +
  13 + /// The default instance of [DeviceUtilsMyPlatform] to use.
  14 + ///
  15 + /// Defaults to [MethodChannelDeviceUtilsMy].
  16 + static DeviceUtilsMyPlatform get instance => _instance;
  17 +
  18 + /// Platform-specific implementations should set this with their own
  19 + /// platform-specific class that extends [DeviceUtilsMyPlatform] when
  20 + /// they register themselves.
  21 + static set instance(DeviceUtilsMyPlatform instance) {
  22 + PlatformInterface.verifyToken(instance, _token);
  23 + _instance = instance;
  24 + }
  25 +
  26 + Future<String> getPlatformVersion() {
  27 + throw UnimplementedError('platformVersion() has not been implemented.');
  28 + }
  29 +
  30 + Future<bool> checkInstallPermission() {
  31 + throw UnimplementedError('checkInstallPermission() has not been implemented.');
  32 + }
  33 +
  34 + Future<bool> openPackageInstall() {
  35 + throw UnimplementedError('openPackageInstall() has not been implemented.');
  36 + }
  37 +
  38 +
  39 +}
  1 +name: device_utils_my
  2 +description: A new Flutter plugin project.
  3 +version: 0.0.1
  4 +homepage:
  5 +
  6 +environment:
  7 + # sdk: '>=2.18.2 <3.0.0'
  8 + sdk: ">=2.1.0 <3.0.0"
  9 + # flutter: ">=2.5.0"
  10 +
  11 +dependencies:
  12 + flutter:
  13 + sdk: flutter
  14 + plugin_platform_interface: ^2.0.2
  15 +
  16 +dev_dependencies:
  17 + flutter_test:
  18 + sdk: flutter
  19 + flutter_lints: ^2.0.0
  20 +
  21 +# For information on the generic Dart part of this file, see the
  22 +# following page: https://dart.dev/tools/pub/pubspec
  23 +
  24 +# The following section is specific to Flutter packages.
  25 +flutter:
  26 + # This section identifies this Flutter project as a plugin project.
  27 + # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.)
  28 + # which should be registered in the plugin registry. This is required for
  29 + # using method channels.
  30 + # The Android 'package' specifies package in which the registered class is.
  31 + # This is required for using method channels on Android.
  32 + # The 'ffiPlugin' specifies that native code should be built and bundled.
  33 + # This is required for using `dart:ffi`.
  34 + # All these are used by the tooling to maintain consistency when
  35 + # adding or updating assets for this project.
  36 + plugin:
  37 + platforms:
  38 + android:
  39 + package: com.example.device_utils_my
  40 + pluginClass: DeviceUtilsMyPlugin
  41 + ios:
  42 + pluginClass: DeviceUtilsMyPlugin
  43 +
  44 + # To add assets to your plugin package, add an assets section, like this:
  45 + # assets:
  46 + # - images/a_dot_burr.jpeg
  47 + # - images/a_dot_ham.jpeg
  48 + #
  49 + # For details regarding assets in packages, see
  50 + # https://flutter.dev/assets-and-images/#from-packages
  51 + #
  52 + # An image asset can refer to one or more resolution-specific "variants", see
  53 + # https://flutter.dev/assets-and-images/#resolution-aware
  54 +
  55 + # To add custom fonts to your plugin package, add a fonts section here,
  56 + # in this "flutter" section. Each entry in this list should have a
  57 + # "family" key with the font family name, and a "fonts" key with a
  58 + # list giving the asset and other descriptors for the font. For
  59 + # example:
  60 + # fonts:
  61 + # - family: Schyler
  62 + # fonts:
  63 + # - asset: fonts/Schyler-Regular.ttf
  64 + # - asset: fonts/Schyler-Italic.ttf
  65 + # style: italic
  66 + # - family: Trajan Pro
  67 + # fonts:
  68 + # - asset: fonts/TrajanPro.ttf
  69 + # - asset: fonts/TrajanPro_Bold.ttf
  70 + # weight: 700
  71 + #
  72 + # For details regarding fonts in packages, see
  73 + # https://flutter.dev/custom-fonts/#from-packages
  1 +import 'package:flutter/services.dart';
  2 +import 'package:flutter_test/flutter_test.dart';
  3 +import 'package:device_utils_my/device_utils_my_method_channel.dart';
  4 +
  5 +void main() {
  6 + MethodChannelDeviceUtilsMy platform = MethodChannelDeviceUtilsMy();
  7 + const MethodChannel channel = MethodChannel('device_utils_my');
  8 +
  9 + TestWidgetsFlutterBinding.ensureInitialized();
  10 +
  11 + setUp(() {
  12 + channel.setMockMethodCallHandler((MethodCall methodCall) async {
  13 + return '42';
  14 + });
  15 + });
  16 +
  17 + tearDown(() {
  18 + channel.setMockMethodCallHandler(null);
  19 + });
  20 +
  21 + test('getPlatformVersion', () async {
  22 + expect(await platform.getPlatformVersion(), '42');
  23 + });
  24 +}
  1 +// import 'package:flutter_test/flutter_test.dart';
  2 +// import 'package:device_utils_my/device_utils_my.dart';
  3 +// import 'package:device_utils_my/device_utils_my_platform_interface.dart';
  4 +// import 'package:device_utils_my/device_utils_my_method_channel.dart';
  5 +// import 'package:plugin_platform_interface/plugin_platform_interface.dart';
  6 +
  7 +// class MockDeviceUtilsMyPlatform
  8 +// with MockPlatformInterfaceMixin
  9 +// implements DeviceUtilsMyPlatform {
  10 +
  11 +// @override
  12 +// Future<String?> getPlatformVersion() => Future.value('42');
  13 +// }
  14 +
  15 +// void main() {
  16 +// final DeviceUtilsMyPlatform initialPlatform = DeviceUtilsMyPlatform.instance;
  17 +
  18 +// test('$MethodChannelDeviceUtilsMy is the default instance', () {
  19 +// expect(initialPlatform, isInstanceOf<MethodChannelDeviceUtilsMy>());
  20 +// });
  21 +
  22 +// test('getPlatformVersion', () async {
  23 +// DeviceUtilsMy deviceUtilsMyPlugin = DeviceUtilsMy();
  24 +// MockDeviceUtilsMyPlatform fakePlatform = MockDeviceUtilsMyPlatform();
  25 +// DeviceUtilsMyPlatform.instance = fakePlatform;
  26 +
  27 +// expect(await deviceUtilsMyPlugin.getPlatformVersion(), '42');
  28 +// });
  29 +// }
@@ -43,6 +43,13 @@ packages: @@ -43,6 +43,13 @@ packages:
43 url: "https://pub.flutter-io.cn" 43 url: "https://pub.flutter-io.cn"
44 source: hosted 44 source: hosted
45 version: "4.1.0" 45 version: "4.1.0"
  46 + android_package_manager:
  47 + dependency: "direct main"
  48 + description:
  49 + name: android_package_manager
  50 + url: "https://pub.flutter-io.cn"
  51 + source: hosted
  52 + version: "0.5.0"
46 android_path_provider: 53 android_path_provider:
47 dependency: "direct main" 54 dependency: "direct main"
48 description: 55 description:
@@ -386,6 +393,13 @@ packages: @@ -386,6 +393,13 @@ packages:
386 url: "https://pub.flutter-io.cn" 393 url: "https://pub.flutter-io.cn"
387 source: hosted 394 source: hosted
388 version: "2.0.1" 395 version: "2.0.1"
  396 + device_utils_my:
  397 + dependency: "direct main"
  398 + description:
  399 + path: "library/device_utils_my"
  400 + relative: true
  401 + source: path
  402 + version: "0.0.1"
389 dio: 403 dio:
390 dependency: "direct main" 404 dependency: "direct main"
391 description: 405 description:
@@ -530,7 +544,7 @@ packages: @@ -530,7 +544,7 @@ packages:
530 name: flutter_app_update 544 name: flutter_app_update
531 url: "https://pub.flutter-io.cn" 545 url: "https://pub.flutter-io.cn"
532 source: hosted 546 source: hosted
533 - version: "3.0.2" 547 + version: "3.0.4"
534 flutter_blurhash: 548 flutter_blurhash:
535 dependency: transitive 549 dependency: transitive
536 description: 550 description:
@@ -178,7 +178,8 @@ dependencies: @@ -178,7 +178,8 @@ dependencies:
178 flutter_native_image: ^0.0.6+1 178 flutter_native_image: ^0.0.6+1
179 #更新apk 179 #更新apk
180 # flutter_app_update: ^0.0.2 180 # flutter_app_update: ^0.0.2
181 - flutter_app_update: ^3.0.2 181 + flutter_app_update: ^3.0.4
  182 + android_package_manager: ^0.5.0
182 # flutter_app_update: ^1.0.0 183 # flutter_app_update: ^1.0.0
183 flutter_staggered_grid_view: ^0.4.1 184 flutter_staggered_grid_view: ^0.4.1
184 # webview 185 # webview
@@ -198,6 +199,8 @@ dependencies: @@ -198,6 +199,8 @@ dependencies:
198 path: library/webview_flutter-2.0.13-copy_inappwebview_select_file_20210930 199 path: library/webview_flutter-2.0.13-copy_inappwebview_select_file_20210930
199 sendsms: 200 sendsms:
200 path: library/sendsms-1.0.3 201 path: library/sendsms-1.0.3
  202 + device_utils_my:
  203 + path: library/device_utils_my
201 #联系人索引 204 #联系人索引
202 azlistview: ^2.0.0 205 azlistview: ^2.0.0
203 # wechat_assets_picker: ^6.0.6 206 # wechat_assets_picker: ^6.0.6