├── .gitignore
├── .idea
├── .name
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── gradle.xml
├── inspectionProfiles
│ └── profiles_settings.xml
├── misc.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── quick-action-dialog-fragment
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── kingfisherphuoc
│ │ └── quickactiondialog
│ │ ├── AlignmentFlag.java
│ │ └── QuickActionDialogFragment.java
│ └── res
│ └── values
│ └── strings.xml
├── sample
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── kingfisherphuoc
│ │ └── sample
│ │ └── MainActivity.java
│ └── res
│ ├── drawable
│ ├── header.png
│ └── ic_up_arrow.png
│ ├── layout
│ ├── activity_main.xml
│ └── dialog_sample_view.xml
│ ├── menu
│ └── menu_main.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | /.idea/workspace.xml
4 | /.idea/libraries
5 | .DS_Store
6 | /build
7 | /captures
8 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | QuickActionDialogFragment
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | Android API 8 Platform
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # QuickActionDialogFragment [](https://android-arsenal.com/details/1/2927)
2 | After longtime searching in GG to find a way to show Quick Action Dialog with up Arrow in the top of dialog, I failed!! Therefore, I create This Library to help lazy devs as me to show quick action view in a dialog fragment. Therefore, you can custom your quick action view easily even with: viewpager inside your quick action.
3 |
4 | 
5 | 
6 | ## Gradle dependency
7 |
8 | `compile 'com.kingfisherphuoc:quick-action-dialog-fragment:1.1'`
9 |
10 | ## Usage
11 | 1. You need to create your own `DialogFragment` class which `extends QuickActionDialogFragment` and `override` some abstract methods
12 | 2. `setAnchorView(View)` before showing it.
13 | 3. You can change Alignment of Dialog based on position of AnchorView (like RealativeLayout) with methods: `setAligmentFlags(AlignmentFlag.ALIGN_ANCHOR_VIEW_LEFT | AlignmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM);`
14 | ```
15 | // Sample class
16 | public static class MySampleDialogFragment extends QuickActionDialogFragment {
17 |
18 | @Override
19 | protected int getArrowImageViewId() {
20 | return R.id.ivArrow; //return 0; that mean you do not have an up arrow icon
21 | }
22 | @Override
23 | protected int getLayout() {
24 | return R.layout.dialog_sample_view;
25 | }
26 | @Override
27 | protected boolean isStatusBarVisible() {
28 | return true; //optional: if status bar is visible in your app
29 | }
30 | @Override
31 | protected boolean isCanceledOnTouchOutside() {
32 | return true; //optional
33 | }
34 | @Override
35 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36 | View view = super.onCreateView(inflater, container, savedInstanceState);
37 | // Set listener, view, data for your dialog fragment
38 | view.findViewById(R.id.btnSample).setOnClickListener(new View.OnClickListener() {
39 | @Override
40 | public void onClick(View view) {
41 | Toast.makeText(getContext(), "Button inside Dialog!!", Toast.LENGTH_SHORT).show();
42 | }
43 | });
44 | return view;
45 | }
46 | }
47 | // Sample XML:
48 |
52 |
56 |
61 |
68 |
74 |
79 |
80 |
81 |
82 | // Sample show dialog fragment
83 | mySampleDialogFragment = new MySampleDialogFragment();
84 | mySampleDialogFragment.setAnchorView(buttonShow);
85 | mySampleDialogFragment.setAligmentFlags(AlignmentFlag.ALIGN_ANCHOR_VIEW_LEFT | AlignmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM);
86 | mySampleDialogFragment.show(getSupportFragmentManager(), null);
87 | ```
88 | ## Notice:
89 | - You should dismiss this dialog when orientation change to avoid `anchor View` null:
90 | ```
91 | @Override
92 | protected void onSaveInstanceState(Bundle outState) {
93 | // must dismiss this dialog before orientation change to avoid AnchorView is deleted!
94 | if (mySampleDialogFragment != null && mySampleDialogFragment.isVisible()) {
95 | mySampleDialogFragment.dismiss();
96 | }
97 | super.onSaveInstanceState(outState);
98 | }
99 | ```
100 | - The Up Arrow Icon of `ImageView` must be declared inside `LinearLayout` with `vertical` orientation (Otherwise the position of arrow will not accurate)
101 | - The current version of Library only supports `DialogFragment` with left and top gravity. You should be careful when using it!
102 |
103 |
104 | ## Upcoming Version:
105 | I'm really lazy man, so when I have free time or there are many requests, I will implement the below features:
106 |
107 | 1. Support toRightOfView, toLeftOfView, toTopOfView, toBottomOfView
108 | 2. Support down,left,right arrow
109 |
110 | ## License
111 | Copyright 2015 Doan Hong Phuoc
112 |
113 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
114 |
115 | `http://www.apache.org/licenses/LICENSE-2.0`
116 |
117 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
118 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:1.2.3'
9 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
10 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
11 |
12 | // NOTE: Do not place your application dependencies here; they belong
13 | // in the individual module build.gradle files
14 | }
15 | }
16 |
17 | //apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
18 | //apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
19 |
20 | allprojects {
21 | repositories {
22 | jcenter()
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 | VERSION_NAME=1.1
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Dec 02 15:24:21 ICT 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | ext {
4 | bintrayRepo = 'maven'
5 | bintrayName = 'quick-action-dialog-fragment'
6 |
7 | publishedGroupId = 'com.kingfisherphuoc'
8 | libraryName = 'QuickActionDialogFragment'
9 | artifact = 'quick-action-dialog-fragment'
10 |
11 | libraryDescription = 'Quick Action Dialog Fragment which is showed with position relate to Anchor View'
12 |
13 | siteUrl = 'https://github.com/kingfisherphuoc/QuickActionDialogFragment'
14 | gitUrl = 'https://github.com/kingfisherphuoc/QuickActionDialogFragment.git'
15 |
16 | libraryVersion = VERSION_NAME
17 |
18 | developerId = 'kingfisherphuoc'
19 | developerName = 'Doan Hong Phuoc'
20 | developerEmail = 'phuocdh53@gmail.com'
21 |
22 | licenseName = 'The Apache Software License, Version 2.0'
23 | licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
24 | allLicenses = ["Apache-2.0"]
25 | }
26 |
27 | android {
28 | compileSdkVersion 23
29 | buildToolsVersion "23.0.2"
30 |
31 | defaultConfig {
32 | minSdkVersion 9
33 | targetSdkVersion 23
34 | versionCode 2
35 | versionName VERSION_NAME
36 | }
37 | buildTypes {
38 | release {
39 | minifyEnabled false
40 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
41 | }
42 | }
43 |
44 | libraryVariants.all { variant ->
45 | variant.outputs.each { output ->
46 | def outputFile = output.outputFile
47 | if (outputFile != null && outputFile.name.endsWith('.aar')) {
48 | def fileName = "QuickActionDialogFragment-" + VERSION_NAME + ".aar"
49 | // change default name: library-debug_VERSION_NAME.aar
50 | output.outputFile = new File(outputFile.parent, fileName)
51 | }
52 | }
53 | }
54 | }
55 |
56 | dependencies {
57 | compile fileTree(dir: 'libs', include: ['*.jar'])
58 | compile 'com.android.support:appcompat-v7:23.1.1'
59 | }
60 |
61 | apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
62 | apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
63 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/kingfisher/AndroidDevTool/AndroidSdkMac/adt-bundle-mac-x86_64-20140702/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/src/main/java/com/kingfisherphuoc/quickactiondialog/AlignmentFlag.java:
--------------------------------------------------------------------------------
1 | package com.kingfisherphuoc.quickactiondialog;
2 |
3 | /**
4 | * AlignmentFlag which is used to align the dialog view with device screen or anchor view
5 | */
6 | public class AlignmentFlag {
7 | public static final int ALIGN_SCREEN_LEFT = 1;
8 | public static final int ALIGN_SCREEN_RIGHT = 2;
9 | public static final int ALIGN_SCREEN_TOP = 4;
10 | public static final int ALIGN_SCREEN_BOTTOM = 8;
11 | public static final int ALIGN_ANCHOR_VIEW_LEFT = 16;
12 | public static final int ALIGN_ANCHOR_VIEW_RIGHT = 32;
13 | public static final int ALIGN_ANCHOR_VIEW_TOP = 64;
14 | public static final int ALIGN_ANCHOR_VIEW_BOTTOM = 128;
15 | }
16 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/src/main/java/com/kingfisherphuoc/quickactiondialog/QuickActionDialogFragment.java:
--------------------------------------------------------------------------------
1 | package com.kingfisherphuoc.quickactiondialog;
2 |
3 | import android.graphics.Rect;
4 | import android.os.Build;
5 | import android.os.Bundle;
6 | import android.support.v4.app.DialogFragment;
7 | import android.util.DisplayMetrics;
8 | import android.util.Log;
9 | import android.view.Gravity;
10 | import android.view.LayoutInflater;
11 | import android.view.View;
12 | import android.view.ViewGroup;
13 | import android.view.ViewTreeObserver;
14 | import android.view.Window;
15 | import android.view.WindowManager;
16 | import android.widget.ImageView;
17 | import android.widget.LinearLayout;
18 |
19 | /**
20 | * Created by kingfisher on 12/2/15.
21 | */
22 | public abstract class QuickActionDialogFragment extends DialogFragment {
23 | // public enum Alignment {
24 | // SCREEN_LEFT,SREEN_RIGHT, SCREEN_TOP,SCREEN_BOTTOM,
25 | // }
26 |
27 | protected ImageView ivArrow;
28 | private View mAnchorView;
29 | // default alignment is screen align left and anchorview bottom
30 | private int mFlags = AlignmentFlag.ALIGN_SCREEN_LEFT | AlignmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM;
31 |
32 | /**
33 | * Change aligment of Dialog with flags in class: {@link AlignmentFlag}. Flags can be combined together as:
34 | *
AligmentFlag.ALIGN_SCREEN_LEFT | AligmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM
35 | *
36 | * @param flags
37 | * @return
38 | */
39 | public QuickActionDialogFragment setAligmentFlags(int flags) {
40 | if (flags != 0) {
41 | mFlags = flags;
42 | }
43 | return this;
44 | }
45 |
46 | /**
47 | * Set anchorview to show this dialog below
48 | *
49 | * @param anchorView
50 | */
51 | public QuickActionDialogFragment setAnchorView(View anchorView) {
52 | this.mAnchorView = anchorView;
53 | return this;
54 | }
55 |
56 |
57 | /**
58 | * get id of arrow image view so this image can be center and below anchorview
59 | *
60 | * @return
61 | */
62 | protected abstract int getArrowImageViewId();
63 |
64 | /**
65 | * Custome layout of this dialog
66 | *
67 | * @return
68 | */
69 | protected abstract int getLayout();
70 |
71 |
72 | /**
73 | * Is this dialog will be dismissed when user touch outside?
74 | *
75 | * @return
76 | */
77 | protected boolean isCanceledOnTouchOutside() {
78 | return true;
79 | }
80 |
81 | /**
82 | * Is system status bar visible when showing this dialog fragment? This will affect positioning
83 | * the view below anchorView
84 | *
85 | * @return
86 | */
87 | protected boolean isStatusBarVisible() {
88 | return false;
89 | }
90 |
91 |
92 | @Override
93 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
94 | View view = inflater.inflate(getLayout(), container, false);
95 | if (getArrowImageViewId() != 0)
96 | ivArrow = (ImageView) view.findViewById(getArrowImageViewId());
97 | getScreenSize();
98 | getAnchorViewSizeAndPosition();
99 | setupDialogPosition();
100 | setupImageIcon(view);
101 | return view;
102 | }
103 |
104 | // Default width height of screen: 720x1200
105 | private int mScreenWidth = 720;
106 | private int mScreenHeight = 1200;
107 | // anchor view size and location in screen
108 | private int mAnchorWidth;
109 | private int mAnchorHeight;
110 | private int[] mAnchorLocation = new int[2]; // location always has status bar height but margin dont!! be careful!!
111 | // gravity of dialog view
112 | private int mGravity = 0;
113 |
114 | /**
115 | * Setup position of dialog and its arrow
116 | */
117 | protected void setupDialogPosition() {
118 | // setup the dialog
119 | getDialog().setCanceledOnTouchOutside(isCanceledOnTouchOutside());
120 | // getDialog().getWindow().setGravity(Gravity.LEFT | Gravity.TOP);
121 | WindowManager.LayoutParams p = getDialog().getWindow().getAttributes();
122 | p.width = ViewGroup.LayoutParams.MATCH_PARENT;
123 | p.height = ViewGroup.LayoutParams.MATCH_PARENT;
124 | p.y = 0;
125 |
126 | alignBaseOnFlags(p);
127 | Log.i(TAG, "margin top: " + p.y);
128 | getDialog().getWindow().setGravity(mGravity);
129 | getDialog().getWindow().setAttributes(p);
130 | }
131 |
132 | /**
133 | * Align dialog view based on flags
134 | *
135 | * @param params
136 | */
137 | private void alignBaseOnFlags(WindowManager.LayoutParams params) {
138 | if ((mFlags & AlignmentFlag.ALIGN_SCREEN_LEFT) == AlignmentFlag.ALIGN_SCREEN_LEFT) {
139 | alignScreenLeft(params);
140 | }
141 | if ((mFlags & AlignmentFlag.ALIGN_SCREEN_RIGHT) == AlignmentFlag.ALIGN_SCREEN_RIGHT) {
142 | alignScreenRight(params);
143 | }
144 | if ((mFlags & AlignmentFlag.ALIGN_SCREEN_TOP) == AlignmentFlag.ALIGN_SCREEN_TOP) {
145 | alignScreenTop(params);
146 | }
147 | if ((mFlags & AlignmentFlag.ALIGN_SCREEN_BOTTOM) == AlignmentFlag.ALIGN_SCREEN_BOTTOM) {
148 | alignScreenBottom(params);
149 | }
150 | if ((mFlags & AlignmentFlag.ALIGN_ANCHOR_VIEW_LEFT) == AlignmentFlag.ALIGN_ANCHOR_VIEW_LEFT) {
151 | alignAnchorViewLeft(params);
152 | }
153 | if ((mFlags & AlignmentFlag.ALIGN_ANCHOR_VIEW_RIGHT) == AlignmentFlag.ALIGN_ANCHOR_VIEW_RIGHT) {
154 | alignAnchorViewRight(params);
155 | }
156 | if ((mFlags & AlignmentFlag.ALIGN_ANCHOR_VIEW_TOP) == AlignmentFlag.ALIGN_ANCHOR_VIEW_TOP) {
157 | alignAnchorViewTop(params);
158 | }
159 | if ((mFlags & AlignmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM) == AlignmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM) {
160 | alignAnchorViewBottom(params);
161 | }
162 | }
163 |
164 | private void alignScreenLeft(WindowManager.LayoutParams params) {
165 | Log.i(TAG, "ALIGN_SCREEN_LEFT");
166 | mGravity = mGravity | Gravity.LEFT;
167 | params.x = 0;
168 | }
169 |
170 | private void alignScreenRight(WindowManager.LayoutParams params) {
171 | Log.i(TAG, "ALIGN_SCREEN_RIGHT");
172 | mGravity = mGravity | Gravity.RIGHT;
173 | params.x = 0;
174 | }
175 |
176 | private void alignScreenTop(WindowManager.LayoutParams params) {
177 | Log.i(TAG, "ALIGN_SCREEN_TOP");
178 | mGravity = mGravity | Gravity.TOP;
179 | params.y = 0;
180 | }
181 |
182 | private void alignScreenBottom(WindowManager.LayoutParams params) {
183 | Log.i(TAG, "ALIGN_SCREEN_BOTTOM");
184 | mGravity = mGravity | Gravity.BOTTOM;
185 | params.y = 0;
186 | }
187 |
188 | private void alignAnchorViewLeft(WindowManager.LayoutParams params) {
189 | Log.i(TAG, "ALIGN_ANCHOR_VIEW_LEFT");
190 | mGravity = mGravity | Gravity.LEFT;
191 | params.x = mAnchorLocation[0];
192 | }
193 |
194 | private void alignAnchorViewRight(WindowManager.LayoutParams params) {
195 | Log.i(TAG, "ALIGN_ANCHOR_VIEW_RIGHT");
196 | mGravity = mGravity | Gravity.RIGHT;
197 | params.x = mScreenWidth - mAnchorLocation[0] - mAnchorWidth;
198 | }
199 |
200 | private void alignAnchorViewTop(WindowManager.LayoutParams params) {
201 | Log.i(TAG, "ALIGN_ANCHOR_VIEW_TOP");
202 | mGravity = mGravity | Gravity.TOP;
203 | params.y = mAnchorLocation[1];
204 | if (isStatusBarVisible()) {
205 | params.y -= getStatusBarHeight();
206 | }
207 | }
208 |
209 | private void alignAnchorViewBottom(WindowManager.LayoutParams params) {
210 | Log.i(TAG, "ALIGN_ANCHOR_VIEW_BOTTOM");
211 | mGravity = mGravity | Gravity.TOP;
212 | params.y = mAnchorLocation[1] + mAnchorHeight;
213 | if (isStatusBarVisible()) {
214 | params.y -= getStatusBarHeight();
215 | }
216 | }
217 |
218 | /**
219 | * Show Arrow Icon center of Anchor View
220 | */
221 | private void setupImageIcon(final View dialogView) {
222 | if (ivArrow == null) return;// just show, dont care about the position of arrow icon
223 | final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) ivArrow.getLayoutParams();
224 | // params.leftMargin = mAnchorLocation[0] + mAnchorWidth / 2;
225 |
226 | ivArrow.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
227 | @Override
228 | public void onGlobalLayout() {
229 | // check for compatible
230 | if (BuildConfig.VERSION_CODE >= Build.VERSION_CODES.JELLY_BEAN) {
231 | ivArrow.getViewTreeObserver().removeOnGlobalLayoutListener(this);
232 | } else {
233 | ivArrow.getViewTreeObserver().removeGlobalOnLayoutListener(this);
234 | }
235 |
236 | // ivArrow.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
237 | // int arrowWidth = ivArrow.getWidth();
238 | //// LogUtils.i("Arrow Width: " + arrowWidth);
239 | // params.leftMargin -= arrowWidth / 2;
240 |
241 | // get dialog view size and location in screen
242 | int[] dialogLocation = new int[2];
243 | dialogView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
244 | int dialogWidth = dialogView.getWidth();
245 | dialogView.getLocationOnScreen(dialogLocation);
246 | // get arrow size
247 | ivArrow.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
248 | int arrowWidth = ivArrow.getWidth();
249 | // Log.i(TAG, String.format("Dialog location: x = %d, y = %d, width = %d, arrowWidth = %d", dialogLocation[0], dialogLocation[1], dialogWidth, arrowWidth));
250 |
251 | // arrow must be inside of dialog view!!
252 | int maxMarginLeft = dialogWidth - arrowWidth;
253 | int minMarginLeft = 0;
254 | if (dialogLocation[0] + dialogWidth < mAnchorLocation[0]) {
255 | // dialog is too far to the left of anchor view
256 | params.leftMargin = maxMarginLeft;
257 | } else if (mAnchorLocation[0] + mAnchorWidth <= dialogLocation[0]) {
258 | // dialog is too far to the right of anchor view
259 | params.leftMargin = minMarginLeft;
260 | } else {
261 | // calculate the arrow image to be showed in center of anchor view
262 | int margin = mAnchorLocation[0] + mAnchorWidth / 2 - dialogLocation[0] - arrowWidth / 2;
263 | if (margin < minMarginLeft) margin = minMarginLeft;
264 | if (margin > maxMarginLeft) margin = maxMarginLeft;
265 | params.leftMargin = margin;
266 | }
267 |
268 | }
269 | });
270 | }
271 |
272 | private final static int DEFAULT_STATUS_BAR = 24;
273 |
274 | /**
275 | * Get status bar height or returning default height: 24dp in pixels
276 | *
277 | * @return
278 | */
279 | private int getStatusBarHeight() {
280 | if (getActivity() == null) {
281 | DisplayMetrics metrics = getResources().getDisplayMetrics();
282 | return (int) (metrics.density * DEFAULT_STATUS_BAR);
283 | }
284 | Rect rectangle = new Rect();
285 | Window window = getActivity().getWindow();
286 | window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
287 | int statusBarHeight = rectangle.top;
288 | return statusBarHeight;
289 | }
290 |
291 | /**
292 | * Find anchor view size
293 | */
294 | private void getAnchorViewSizeAndPosition() {
295 | if (mAnchorView == null) { // throw exception to other
296 | throw new IllegalStateException("AnchorView not found! You must set AnchorView first");
297 | }
298 | // find anchor location 0: left, 1: top
299 | mAnchorView.getLocationInWindow(mAnchorLocation);
300 | // find anchorview width, height
301 | mAnchorView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
302 | mAnchorWidth = mAnchorView.getWidth();
303 | mAnchorHeight = mAnchorView.getHeight();
304 | Log.i(TAG, "Anchor Location: left: " + mAnchorLocation[0] + ", top: " + mAnchorLocation[1]);
305 | Log.i(TAG, "Anchor Width: " + mAnchorWidth + ", height: " + mAnchorHeight);
306 | }
307 |
308 | private void getScreenSize() {
309 | if (getActivity() == null) {
310 | return;
311 | }
312 | DisplayMetrics displaymetrics = new DisplayMetrics();
313 | getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
314 | mScreenHeight = displaymetrics.heightPixels;
315 | mScreenWidth = displaymetrics.widthPixels;
316 | }
317 |
318 | private static final String TAG = "QuickActionDialogFragment";
319 |
320 |
321 | @Override
322 | public void onCreate(Bundle savedInstanceState) {
323 | super.onCreate(savedInstanceState);
324 | // show dialog without border
325 | setStyle(DialogFragment.STYLE_NO_FRAME, 0);
326 | }
327 | }
328 |
--------------------------------------------------------------------------------
/quick-action-dialog-fragment/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | QuickActionDialog
3 |
4 |
--------------------------------------------------------------------------------
/sample/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/sample/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.2"
6 |
7 | defaultConfig {
8 | applicationId "com.kingfisherphuoc.sample"
9 | minSdkVersion 9
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(dir: 'libs', include: ['*.jar'])
24 | compile 'com.android.support:appcompat-v7:23.1.1'
25 | compile project(':quick-action-dialog-fragment')
26 | }
27 |
--------------------------------------------------------------------------------
/sample/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/kingfisher/AndroidDevTool/AndroidSdkMac/adt-bundle-mac-x86_64-20140702/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/sample/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/sample/src/main/java/com/kingfisherphuoc/sample/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.kingfisherphuoc.sample;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.Toast;
9 |
10 | import com.kingfisherphuoc.quickactiondialog.AlignmentFlag;
11 | import com.kingfisherphuoc.quickactiondialog.QuickActionDialogFragment;
12 |
13 | public class MainActivity extends AppCompatActivity {
14 |
15 | @Override
16 | protected void onCreate(Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | setContentView(R.layout.activity_main);
19 |
20 | final View buttonShow = findViewById(R.id.btnShow);
21 | buttonShow.setOnClickListener(new View.OnClickListener() {
22 | @Override
23 | public void onClick(View view) {
24 | mySampleDialogFragment = new MySampleDialogFragment();
25 | mySampleDialogFragment.setAnchorView(buttonShow);
26 | mySampleDialogFragment.setAligmentFlags(AlignmentFlag.ALIGN_ANCHOR_VIEW_LEFT | AlignmentFlag.ALIGN_ANCHOR_VIEW_BOTTOM);
27 | mySampleDialogFragment.show(getSupportFragmentManager(), null);
28 | }
29 | });
30 | }
31 |
32 | private MySampleDialogFragment mySampleDialogFragment;
33 |
34 | @Override
35 | protected void onSaveInstanceState(Bundle outState) {
36 | // must dismiss this dialog before orientation change to avoid AnchorView is deleted!
37 | if (mySampleDialogFragment != null && mySampleDialogFragment.isVisible()) {
38 | mySampleDialogFragment.dismiss();
39 | }
40 | super.onSaveInstanceState(outState);
41 | }
42 |
43 | public static class MySampleDialogFragment extends QuickActionDialogFragment {
44 |
45 | @Override
46 | protected int getArrowImageViewId() {
47 | return R.id.ivArrow;
48 | // return 0; that mean you donot have an arrow
49 | }
50 |
51 | @Override
52 | protected int getLayout() {
53 | return R.layout.dialog_sample_view;
54 | }
55 |
56 | @Override
57 | protected boolean isStatusBarVisible() {
58 | return true;
59 | }
60 |
61 |
62 | @Override
63 | protected boolean isCanceledOnTouchOutside() {
64 | return true;
65 | }
66 |
67 | @Override
68 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
69 | View view = super.onCreateView(inflater, container, savedInstanceState);
70 | view.findViewById(R.id.btnSample).setOnClickListener(new View.OnClickListener() {
71 | @Override
72 | public void onClick(View view) {
73 | Toast.makeText(getContext(), "Button inside Dialog!!", Toast.LENGTH_SHORT).show();
74 | }
75 | });
76 |
77 | return view;
78 | }
79 | }
80 |
81 |
82 | }
83 |
--------------------------------------------------------------------------------
/sample/src/main/res/drawable/header.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/sample/src/main/res/drawable/header.png
--------------------------------------------------------------------------------
/sample/src/main/res/drawable/ic_up_arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/sample/src/main/res/drawable/ic_up_arrow.png
--------------------------------------------------------------------------------
/sample/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/sample/src/main/res/layout/dialog_sample_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
18 |
19 |
26 |
27 |
33 |
34 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/sample/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/sample/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/sample/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/sample/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/sample/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kingfisherphuoc/QuickActionDialogFragment/67cda4d67efa8414cbd69b7c06ce8dddea2e6856/sample/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/sample/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/sample/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Sample
3 |
4 | Hello world!
5 | Settings
6 |
7 |
--------------------------------------------------------------------------------
/sample/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':quick-action-dialog-fragment', ':sample'
2 |
--------------------------------------------------------------------------------