├── screenshots ├── phone.png ├── tablet.png └── big_icon.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── DragSource ├── src │ └── main │ │ ├── res │ │ ├── drawable │ │ │ ├── image1.png │ │ │ └── image2.png │ │ ├── drawable-hdpi │ │ │ └── tile.9.png │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ │ ├── base-colors.xml │ │ │ └── base-template-styles.xml │ │ ├── values │ │ │ ├── fragmentview_strings.xml │ │ │ ├── colors.xml │ │ │ ├── dimen.xml │ │ │ ├── template-dimens.xml │ │ │ ├── strings.xml │ │ │ └── template-styles.xml │ │ ├── xml │ │ │ └── file_paths.xml │ │ ├── values-v11 │ │ │ └── template-styles.xml │ │ ├── menu │ │ │ └── main.xml │ │ ├── values-sw600dp │ │ │ ├── template-dimens.xml │ │ │ └── template-styles.xml │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ └── fragment_dragsource.xml │ │ └── layout-w720dp │ │ │ └── activity_main.xml │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── android │ │ │ ├── common │ │ │ ├── activities │ │ │ │ └── SampleActivityBase.java │ │ │ └── logger │ │ │ │ ├── MessageOnlyLogFilter.java │ │ │ │ ├── LogNode.java │ │ │ │ ├── LogWrapper.java │ │ │ │ ├── LogFragment.java │ │ │ │ ├── LogView.java │ │ │ │ └── Log.java │ │ │ └── dragsource │ │ │ ├── ImageDragListener.java │ │ │ ├── MainActivity.java │ │ │ └── DragSourceFragment.java │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── DropTarget ├── src │ └── main │ │ ├── res │ │ ├── drawable-hdpi │ │ │ └── tile.9.png │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ │ ├── base-colors.xml │ │ │ └── base-template-styles.xml │ │ ├── values │ │ │ ├── fragmentview_strings.xml │ │ │ ├── colors.xml │ │ │ ├── dimen.xml │ │ │ ├── template-dimens.xml │ │ │ ├── strings.xml │ │ │ └── template-styles.xml │ │ ├── values-v11 │ │ │ └── template-styles.xml │ │ ├── menu │ │ │ └── main.xml │ │ ├── values-sw600dp │ │ │ ├── template-dimens.xml │ │ │ └── template-styles.xml │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ └── fragment_droptarget.xml │ │ └── layout-w720dp │ │ │ └── activity_main.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── example │ │ └── android │ │ ├── common │ │ ├── activities │ │ │ └── SampleActivityBase.java │ │ └── logger │ │ │ ├── LogNode.java │ │ │ ├── MessageOnlyLogFilter.java │ │ │ ├── LogWrapper.java │ │ │ ├── LogFragment.java │ │ │ ├── LogView.java │ │ │ └── Log.java │ │ └── droptarget │ │ ├── ImageDragListener.java │ │ ├── MainActivity.java │ │ └── DropTargetFragment.java ├── proguard-rules.pro └── build.gradle ├── README.md ├── NOTICE ├── settings.gradle ├── .google └── packaging.yaml ├── CONTRIBUTING.md ├── gradlew.bat ├── gradlew └── LICENSE /screenshots/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/screenshots/phone.png -------------------------------------------------------------------------------- /screenshots/tablet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/screenshots/tablet.png -------------------------------------------------------------------------------- /screenshots/big_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/screenshots/big_icon.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /DragSource/src/main/res/drawable/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/drawable/image1.png -------------------------------------------------------------------------------- /DragSource/src/main/res/drawable/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/drawable/image2.png -------------------------------------------------------------------------------- /DragSource/src/main/res/drawable-hdpi/tile.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/drawable-hdpi/tile.9.png -------------------------------------------------------------------------------- /DropTarget/src/main/res/drawable-hdpi/tile.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DropTarget/src/main/res/drawable-hdpi/tile.9.png -------------------------------------------------------------------------------- /DragSource/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /DragSource/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /DropTarget/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DropTarget/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /DropTarget/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DropTarget/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /DragSource/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /DragSource/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /DropTarget/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DropTarget/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /DropTarget/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DropTarget/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /DragSource/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DragSource/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /DropTarget/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlearchive/android-DragAndDropAcrossApps/master/DropTarget/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon May 02 14:15:55 AEST 2016 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-4.4-all.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Android DragAndDropAcrossApps-new Sample 3 | ======================================== 4 | 5 | This repo has been migrated to [github.com/android/user-interface][1]. Please check that repo for future updates. Thank you! 6 | 7 | [1]: https://github.com/android/user-interface 8 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | 2 | This sample uses the following software: 3 | 4 | Copyright 2018 The Android Open Source Project 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 | http://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 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | include ':DragSource', ':DropTarget' 18 | -------------------------------------------------------------------------------- /DragSource/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 /usr/local/google/home/rkc/Android/Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values-v21/base-colors.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values-v21/base-colors.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.google/packaging.yaml: -------------------------------------------------------------------------------- 1 | 2 | # GOOGLE SAMPLE PACKAGING DATA 3 | # 4 | # This file is used by Google as part of our samples packaging process. 5 | # End users may safely ignore this file. It has no relevance to other systems. 6 | --- 7 | status: PUBLISHED 8 | technologies: [Android] 9 | categories: [UI] 10 | languages: [Java] 11 | solutions: [Mobile] 12 | github: android-DragAndDropAcrossApps-new 13 | level: ADVANCED 14 | icon: screenshots/big_icon.png 15 | apiRefs: 16 | - android:android.content.ClipDescription 17 | - android:android.os.PersistableBundle 18 | - android:android.view.DragEvent 19 | - android:android.support.v13.view.DragAndDropPermissionsCompat 20 | - android:android.support.v13.view.DragStartHelper 21 | license: apache2 22 | -------------------------------------------------------------------------------- /DropTarget/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 /usr/local/google/home/rkc/work/android/master/out/host/linux-x86/sdk/sdk/android-sdk_eng.rkc_linux-x86/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 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values/fragmentview_strings.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | Show Log 18 | Hide Log 19 | 20 | -------------------------------------------------------------------------------- /DragSource/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values/fragmentview_strings.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | Show Log 18 | Hide Log 19 | 20 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values-v11/template-styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values-v21/base-template-styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /DragSource/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values-sw600dp/template-dimens.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | @dimen/margin_huge 22 | @dimen/margin_medium 23 | 24 | 25 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values-sw600dp/template-dimens.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | @dimen/margin_huge 22 | @dimen/margin_medium 23 | 24 | 25 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values-sw600dp/template-styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values-sw600dp/template-styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values/dimen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 20 | 16dp 21 | 22 | 150dp 23 | 24 | 0dp 25 | 10dp 26 | 6dp 27 | 28 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values/dimen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 20 | 16dp 21 | 0dp 22 | 16dp 23 | 16dp 24 | 25 | 80dp 26 | 16dp 27 | 28 | 0dp 29 | 10dp 30 | 6dp 31 | 32 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values/template-dimens.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 4dp 22 | 8dp 23 | 16dp 24 | 32dp 25 | 64dp 26 | 27 | 28 | 29 | @dimen/margin_medium 30 | @dimen/margin_medium 31 | 32 | 33 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values/template-dimens.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 4dp 22 | 8dp 23 | 16dp 24 | 32dp 25 | 64dp 26 | 27 | 28 | 29 | @dimen/margin_medium 30 | @dimen/margin_medium 31 | 32 | 33 | -------------------------------------------------------------------------------- /DropTarget/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 20 | These images can be dragged to any app.\nTry dragging it to the area below. 21 | This sample demonstrates drag and drop functionality and is the \'source\' app for this sample. It shows how data can be moved between views within an app or between different apps.\nTry dragging one of the images to the highlighted target in this app.\nOpen the \'DropTarget\' sample app next to this app and try dragging an image between the two apps.\nImages are served through a content provider. The target app must request permission to access the dropped content. 22 | 23 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 20 | 21 | Drop image here.\nThe app will request permission from the source app before displaying the image. 22 | 23 | This sample demonstrates drag and drop functionality and is the \'target\' app for this sample. It shows how data can be received when dragged from another app.\nOpen the \'DragSource\' sample app next to this one and try dragging an image into the space below. 24 | 25 | Release permissions immediately after a drop 26 | 27 | Releasing permissions will prevent the image from being properly restored after the activity has been resized. 28 | 29 | -------------------------------------------------------------------------------- /DragSource/src/main/res/values/template-styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 34 | 35 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/values/template-styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 34 | 35 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /DragSource/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | buildscript { 17 | repositories { 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | classpath 'com.android.tools.build:gradle:3.0.0' 23 | } 24 | } 25 | 26 | apply plugin: 'com.android.application' 27 | 28 | android { 29 | compileSdkVersion 24 30 | buildToolsVersion "23.0.2" 31 | 32 | defaultConfig { 33 | applicationId "com.example.android.dragsource" 34 | minSdkVersion 24 35 | targetSdkVersion 24 36 | versionCode 1 37 | versionName "1.0" 38 | } 39 | buildTypes { 40 | release { 41 | minifyEnabled false 42 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 43 | } 44 | } 45 | } 46 | 47 | dependencies { 48 | compile fileTree(dir: 'libs', include: ['*.jar']) 49 | compile 'com.android.support:appcompat-v7:24.1.1' 50 | compile 'com.android.support:support-v13:24.1.1' 51 | 52 | } 53 | -------------------------------------------------------------------------------- /DropTarget/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | buildscript { 18 | repositories { 19 | jcenter() 20 | } 21 | 22 | dependencies { 23 | classpath 'com.android.tools.build:gradle:3.0.0' 24 | } 25 | } 26 | 27 | apply plugin: 'com.android.application' 28 | 29 | android { 30 | compileSdkVersion 24 31 | buildToolsVersion "23.0.2" 32 | 33 | defaultConfig { 34 | applicationId "com.example.android.droptarget" 35 | minSdkVersion 24 36 | targetSdkVersion 24 37 | versionCode 1 38 | versionName "1.0" 39 | } 40 | buildTypes { 41 | release { 42 | minifyEnabled false 43 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 44 | } 45 | } 46 | } 47 | 48 | dependencies { 49 | compile fileTree(dir: 'libs', include: ['*.jar']) 50 | compile 'com.android.support:appcompat-v7:24.0.0' 51 | compile 'com.android.support:support-v13:24.0.0' 52 | } 53 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to become a contributor and submit your own code 2 | 3 | ## Contributor License Agreements 4 | 5 | We'd love to accept your sample apps and patches! Before we can take them, we 6 | have to jump a couple of legal hurdles. 7 | 8 | Please fill out either the individual or corporate Contributor License Agreement (CLA). 9 | 10 | * If you are an individual writing original source code and you're sure you 11 | own the intellectual property, then you'll need to sign an [individual CLA] 12 | (https://cla.developers.google.com). 13 | * If you work for a company that wants to allow you to contribute your work, 14 | then you'll need to sign a [corporate CLA] 15 | (https://cla.developers.google.com). 16 | 17 | Follow either of the two links above to access the appropriate CLA and 18 | instructions for how to sign and return it. Once we receive it, we'll be able to 19 | accept your pull requests. 20 | 21 | ## Contributing A Patch 22 | 23 | 1. Submit an issue describing your proposed change to the repo in question. 24 | 1. The repo owner will respond to your issue promptly. 25 | 1. If your proposed change is accepted, and you haven't already done so, sign a 26 | Contributor License Agreement (see details above). 27 | 1. Fork the desired repo, develop and test your code changes. 28 | 1. Ensure that your code adheres to the existing style in the sample to which 29 | you are contributing. Refer to the 30 | [Android Code Style Guide] 31 | (https://source.android.com/source/code-style.html) for the 32 | recommended coding standards for this organization. 33 | 1. Ensure that your code has an appropriate set of unit tests which all pass. 34 | 1. Submit a pull request. 35 | 36 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/activities/SampleActivityBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.common.activities; 18 | 19 | import com.example.android.common.logger.Log; 20 | import com.example.android.common.logger.LogWrapper; 21 | 22 | import android.os.Bundle; 23 | import android.support.v4.app.FragmentActivity; 24 | 25 | /** 26 | * Base launcher activity, to handle most of the common plumbing for samples. 27 | */ 28 | public class SampleActivityBase extends FragmentActivity { 29 | 30 | public static final String TAG = "SampleActivityBase"; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | } 36 | 37 | @Override 38 | protected void onStart() { 39 | super.onStart(); 40 | initializeLogging(); 41 | } 42 | 43 | /** Set up targets to receive log data */ 44 | public void initializeLogging() { 45 | // Using Log, front-end to the logging chain, emulates android.util.log method signatures. 46 | // Wraps Android's native log framework 47 | LogWrapper logWrapper = new LogWrapper(); 48 | Log.setLogNode(logWrapper); 49 | 50 | Log.i(TAG, "Ready"); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/activities/SampleActivityBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.common.activities; 18 | 19 | import android.os.Bundle; 20 | import android.support.v4.app.FragmentActivity; 21 | 22 | import com.example.android.common.logger.Log; 23 | import com.example.android.common.logger.LogWrapper; 24 | 25 | /** 26 | * Base launcher activity, to handle most of the common plumbing for samples. 27 | */ 28 | public class SampleActivityBase extends FragmentActivity { 29 | 30 | public static final String TAG = "SampleActivityBase"; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | } 36 | 37 | @Override 38 | protected void onStart() { 39 | super.onStart(); 40 | initializeLogging(); 41 | } 42 | 43 | /** Set up targets to receive log data */ 44 | public void initializeLogging() { 45 | // Using Log, front-end to the logging chain, emulates android.util.log method signatures. 46 | // Wraps Android's native log framework 47 | LogWrapper logWrapper = new LogWrapper(); 48 | Log.setLogNode(logWrapper); 49 | 50 | Log.i(TAG, "Ready"); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/logger/LogNode.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | /** 19 | * Basic interface for a logging system that can output to one or more targets. 20 | * Note that in addition to classes that will output these logs in some format, 21 | * one can also implement this interface over a filter and insert that in the chain, 22 | * such that no targets further down see certain data, or see manipulated forms of the data. 23 | * You could, for instance, write a "ToHtmlLoggerNode" that just converted all the log data 24 | * it received to HTML and sent it along to the next node in the chain, without printing it 25 | * anywhere. 26 | */ 27 | public interface LogNode { 28 | 29 | /** 30 | * Instructs first LogNode in the list to print the log data provided. 31 | * @param priority Log level of the data being logged. Verbose, Error, etc. 32 | * @param tag Tag for for the log data. Can be used to organize log statements. 33 | * @param msg The actual message to be logged. The actual message to be logged. 34 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 35 | * to extract and print useful information. 36 | */ 37 | public void println(int priority, String tag, String msg, Throwable tr); 38 | 39 | } 40 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/logger/MessageOnlyLogFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | /** 19 | * Simple {@link LogNode} filter, removes everything except the message. 20 | * Useful for situations like on-screen log output where you don't want a lot of metadata displayed, 21 | * just easy-to-read message updates as they're happening. 22 | */ 23 | public class MessageOnlyLogFilter implements LogNode { 24 | 25 | LogNode mNext; 26 | 27 | /** 28 | * Takes the "next" LogNode as a parameter, to simplify chaining. 29 | * 30 | * @param next The next LogNode in the pipeline. 31 | */ 32 | public MessageOnlyLogFilter(LogNode next) { 33 | mNext = next; 34 | } 35 | 36 | public MessageOnlyLogFilter() { 37 | } 38 | 39 | @Override 40 | public void println(int priority, String tag, String msg, Throwable tr) { 41 | if (mNext != null) { 42 | getNext().println(Log.NONE, null, msg, null); 43 | } 44 | } 45 | 46 | /** 47 | * Returns the next LogNode in the chain. 48 | */ 49 | public LogNode getNext() { 50 | return mNext; 51 | } 52 | 53 | /** 54 | * Sets the LogNode data will be sent to.. 55 | */ 56 | public void setNext(LogNode node) { 57 | mNext = node; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/logger/MessageOnlyLogFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | /** 19 | * Simple {@link LogNode} filter, removes everything except the message. 20 | * Useful for situations like on-screen log output where you don't want a lot of metadata 21 | * displayed, 22 | * just easy-to-read message updates as they're happening. 23 | */ 24 | public class MessageOnlyLogFilter implements LogNode { 25 | 26 | LogNode mNext; 27 | 28 | /** 29 | * Takes the "next" LogNode as a parameter, to simplify chaining. 30 | * 31 | * @param next The next LogNode in the pipeline. 32 | */ 33 | public MessageOnlyLogFilter(LogNode next) { 34 | mNext = next; 35 | } 36 | 37 | public MessageOnlyLogFilter() { 38 | } 39 | 40 | @Override 41 | public void println(int priority, String tag, String msg, Throwable tr) { 42 | if (mNext != null) { 43 | getNext().println(Log.NONE, null, msg, null); 44 | } 45 | } 46 | 47 | /** 48 | * Returns the next LogNode in the chain. 49 | */ 50 | public LogNode getNext() { 51 | return mNext; 52 | } 53 | 54 | /** 55 | * Sets the LogNode data will be sent to.. 56 | */ 57 | public void setNext(LogNode node) { 58 | mNext = node; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/logger/LogNode.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | /** 19 | * Basic interface for a logging system that can output to one or more targets. 20 | * Note that in addition to classes that will output these logs in some format, 21 | * one can also implement this interface over a filter and insert that in the chain, 22 | * such that no targets further down see certain data, or see manipulated forms of the data. 23 | * You could, for instance, write a "ToHtmlLoggerNode" that just converted all the log data 24 | * it received to HTML and sent it along to the next node in the chain, without printing it 25 | * anywhere. 26 | */ 27 | public interface LogNode { 28 | 29 | /** 30 | * Instructs first LogNode in the list to print the log data provided. 31 | * 32 | * @param priority Log level of the data being logged. Verbose, Error, etc. 33 | * @param tag Tag for for the log data. Can be used to organize log statements. 34 | * @param msg The actual message to be logged. The actual message to be logged. 35 | * @param tr If an exception was thrown, this can be sent along for the logging 36 | * facilities 37 | * to extract and print useful information. 38 | */ 39 | public void println(int priority, String tag, String msg, Throwable tr); 40 | 41 | } 42 | -------------------------------------------------------------------------------- /DragSource/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 43 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /DragSource/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 22 | 27 | 28 | 32 | 33 | 42 | 43 | 44 | 49 | 50 | 51 | 52 | 56 | 57 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 22 | 27 | 28 | 32 | 33 | 42 | 43 | 44 | 49 | 50 | 51 | 52 | 56 | 57 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/layout/fragment_droptarget.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 23 | 24 | 30 | 31 | 38 | 39 | 45 | 50 | 55 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /DragSource/src/main/res/layout-w720dp/activity_main.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 22 | 28 | 29 | 33 | 34 | 43 | 44 | 45 | 49 | 50 | 56 | 57 | 58 | 59 | 63 | 64 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /DropTarget/src/main/res/layout-w720dp/activity_main.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 22 | 28 | 29 | 33 | 34 | 43 | 44 | 45 | 49 | 50 | 56 | 57 | 58 | 59 | 63 | 64 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/logger/LogWrapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | import android.util.Log; 19 | 20 | /** 21 | * Helper class which wraps Android's native Log utility in the Logger interface. This way 22 | * normal DDMS output can be one of the many targets receiving and outputting logs simultaneously. 23 | */ 24 | public class LogWrapper implements LogNode { 25 | 26 | // For piping: The next node to receive Log data after this one has done its work. 27 | private LogNode mNext; 28 | 29 | /** 30 | * Returns the next LogNode in the linked list. 31 | */ 32 | public LogNode getNext() { 33 | return mNext; 34 | } 35 | 36 | /** 37 | * Sets the LogNode data will be sent to.. 38 | */ 39 | public void setNext(LogNode node) { 40 | mNext = node; 41 | } 42 | 43 | /** 44 | * Prints data out to the console using Android's native log mechanism. 45 | * @param priority Log level of the data being logged. Verbose, Error, etc. 46 | * @param tag Tag for for the log data. Can be used to organize log statements. 47 | * @param msg The actual message to be logged. The actual message to be logged. 48 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 49 | * to extract and print useful information. 50 | */ 51 | @Override 52 | public void println(int priority, String tag, String msg, Throwable tr) { 53 | // There actually are log methods that don't take a msg parameter. For now, 54 | // if that's the case, just convert null to the empty string and move on. 55 | String useMsg = msg; 56 | if (useMsg == null) { 57 | useMsg = ""; 58 | } 59 | 60 | // If an exeption was provided, convert that exception to a usable string and attach 61 | // it to the end of the msg method. 62 | if (tr != null) { 63 | msg += "\n" + Log.getStackTraceString(tr); 64 | } 65 | 66 | // This is functionally identical to Log.x(tag, useMsg); 67 | // For instance, if priority were Log.VERBOSE, this would be the same as Log.v(tag, useMsg) 68 | Log.println(priority, tag, useMsg); 69 | 70 | // If this isn't the last node in the chain, move things along. 71 | if (mNext != null) { 72 | mNext.println(priority, tag, msg, tr); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/logger/LogWrapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | import android.util.Log; 19 | 20 | /** 21 | * Helper class which wraps Android's native Log utility in the Logger interface. This way 22 | * normal DDMS output can be one of the many targets receiving and outputting logs simultaneously. 23 | */ 24 | public class LogWrapper implements LogNode { 25 | 26 | // For piping: The next node to receive Log data after this one has done its work. 27 | private LogNode mNext; 28 | 29 | /** 30 | * Returns the next LogNode in the linked list. 31 | */ 32 | public LogNode getNext() { 33 | return mNext; 34 | } 35 | 36 | /** 37 | * Sets the LogNode data will be sent to.. 38 | */ 39 | public void setNext(LogNode node) { 40 | mNext = node; 41 | } 42 | 43 | /** 44 | * Prints data out to the console using Android's native log mechanism. 45 | * 46 | * @param priority Log level of the data being logged. Verbose, Error, etc. 47 | * @param tag Tag for for the log data. Can be used to organize log statements. 48 | * @param msg The actual message to be logged. The actual message to be logged. 49 | * @param tr If an exception was thrown, this can be sent along for the logging 50 | * facilities 51 | * to extract and print useful information. 52 | */ 53 | @Override 54 | public void println(int priority, String tag, String msg, Throwable tr) { 55 | // There actually are log methods that don't take a msg parameter. For now, 56 | // if that's the case, just convert null to the empty string and move on. 57 | String useMsg = msg; 58 | if (useMsg == null) { 59 | useMsg = ""; 60 | } 61 | 62 | // If an exeption was provided, convert that exception to a usable string and attach 63 | // it to the end of the msg method. 64 | if (tr != null) { 65 | msg += "\n" + Log.getStackTraceString(tr); 66 | } 67 | 68 | // This is functionally identical to Log.x(tag, useMsg); 69 | // For instance, if priority were Log.VERBOSE, this would be the same as Log.v(tag, useMsg) 70 | Log.println(priority, tag, useMsg); 71 | 72 | // If this isn't the last node in the chain, move things along. 73 | if (mNext != null) { 74 | mNext.println(priority, tag, msg, tr); 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/droptarget/ImageDragListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016, The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.droptarget; 18 | 19 | import android.content.ClipData; 20 | import android.net.Uri; 21 | import android.view.DragEvent; 22 | import android.view.View; 23 | import android.widget.ImageView; 24 | 25 | public class ImageDragListener implements View.OnDragListener { 26 | 27 | private static final int COLOR_INACTIVE = 0xFF888888; 28 | 29 | private static final int COLOR_ACTIVE = 0xFFCCCCCC; 30 | 31 | private static final int COLOR_HOVER = 0xFFEEEEEE; 32 | 33 | @Override 34 | public boolean onDrag(View view, DragEvent event) { 35 | switch (event.getAction()) { 36 | case DragEvent.ACTION_DRAG_STARTED: 37 | setTargetColor(view, COLOR_ACTIVE); 38 | return true; 39 | 40 | case DragEvent.ACTION_DRAG_ENTERED: 41 | setTargetColor(view, COLOR_HOVER); 42 | return true; 43 | 44 | case DragEvent.ACTION_DRAG_LOCATION: 45 | processLocation(event.getX(), event.getY()); 46 | return true; 47 | 48 | case DragEvent.ACTION_DRAG_EXITED: 49 | setTargetColor(view, COLOR_ACTIVE); 50 | return true; 51 | 52 | case DragEvent.ACTION_DROP: 53 | return processDrop(view, event); 54 | 55 | case DragEvent.ACTION_DRAG_ENDED: 56 | setTargetColor(view, COLOR_INACTIVE); 57 | return true; 58 | 59 | default: 60 | break; 61 | } 62 | 63 | return false; 64 | } 65 | 66 | private void setTargetColor(View view, int color) { 67 | view.setBackgroundColor(color); 68 | } 69 | 70 | private boolean processDrop(View view, DragEvent event) { 71 | ClipData clipData = event.getClipData(); 72 | if (clipData == null || clipData.getItemCount() == 0) { 73 | return false; 74 | } 75 | ClipData.Item item = clipData.getItemAt(0); 76 | if (item == null) { 77 | return false; 78 | } 79 | Uri uri = item.getUri(); 80 | if (uri == null) { 81 | return false; 82 | } 83 | return setImageUri(view, event, uri); 84 | } 85 | 86 | protected void processLocation(float x, float y) { 87 | } 88 | 89 | protected boolean setImageUri(View view, DragEvent event, Uri uri) { 90 | if (!(view instanceof ImageView)) { 91 | return false; 92 | } 93 | ((ImageView) view).setImageURI(uri); 94 | return true; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/logger/LogFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.common.logger; 18 | 19 | import android.graphics.Typeface; 20 | import android.os.Bundle; 21 | import android.support.v4.app.Fragment; 22 | import android.text.Editable; 23 | import android.text.TextWatcher; 24 | import android.view.Gravity; 25 | import android.view.LayoutInflater; 26 | import android.view.View; 27 | import android.view.ViewGroup; 28 | import android.widget.ScrollView; 29 | 30 | /** 31 | * Simple fragment which contains a LogView and uses is to output log data it receives 32 | * through the LogNode interface. 33 | */ 34 | public class LogFragment extends Fragment { 35 | 36 | private LogView mLogView; 37 | private ScrollView mScrollView; 38 | 39 | public LogFragment() {} 40 | 41 | public View inflateViews() { 42 | mScrollView = new ScrollView(getActivity()); 43 | ViewGroup.LayoutParams scrollParams = new ViewGroup.LayoutParams( 44 | ViewGroup.LayoutParams.MATCH_PARENT, 45 | ViewGroup.LayoutParams.MATCH_PARENT); 46 | mScrollView.setLayoutParams(scrollParams); 47 | 48 | mLogView = new LogView(getActivity()); 49 | ViewGroup.LayoutParams logParams = new ViewGroup.LayoutParams(scrollParams); 50 | logParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; 51 | mLogView.setLayoutParams(logParams); 52 | mLogView.setClickable(true); 53 | mLogView.setFocusable(true); 54 | mLogView.setTypeface(Typeface.MONOSPACE); 55 | 56 | // Want to set padding as 16 dips, setPadding takes pixels. Hooray math! 57 | int paddingDips = 16; 58 | double scale = getResources().getDisplayMetrics().density; 59 | int paddingPixels = (int) ((paddingDips * (scale)) + .5); 60 | mLogView.setPadding(paddingPixels, paddingPixels, paddingPixels, paddingPixels); 61 | mLogView.setCompoundDrawablePadding(paddingPixels); 62 | 63 | mLogView.setGravity(Gravity.BOTTOM); 64 | mLogView.setTextAppearance(getActivity(), android.R.style.TextAppearance_Holo_Medium); 65 | 66 | mScrollView.addView(mLogView); 67 | return mScrollView; 68 | } 69 | 70 | @Override 71 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 72 | Bundle savedInstanceState) { 73 | 74 | View result = inflateViews(); 75 | 76 | mLogView.addTextChangedListener(new TextWatcher() { 77 | @Override 78 | public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 79 | 80 | @Override 81 | public void onTextChanged(CharSequence s, int start, int before, int count) {} 82 | 83 | @Override 84 | public void afterTextChanged(Editable s) { 85 | mScrollView.fullScroll(ScrollView.FOCUS_DOWN); 86 | } 87 | }); 88 | return result; 89 | } 90 | 91 | public LogView getLogView() { 92 | return mLogView; 93 | } 94 | } -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/logger/LogFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.common.logger; 18 | 19 | import android.graphics.Typeface; 20 | import android.os.Bundle; 21 | import android.support.v4.app.Fragment; 22 | import android.text.Editable; 23 | import android.text.TextWatcher; 24 | import android.view.Gravity; 25 | import android.view.LayoutInflater; 26 | import android.view.View; 27 | import android.view.ViewGroup; 28 | import android.widget.ScrollView; 29 | 30 | /** 31 | * Simple fragment which contains a LogView and uses is to output log data it receives 32 | * through the LogNode interface. 33 | */ 34 | public class LogFragment extends Fragment { 35 | 36 | private LogView mLogView; 37 | 38 | private ScrollView mScrollView; 39 | 40 | public LogFragment() { 41 | } 42 | 43 | public View inflateViews() { 44 | mScrollView = new ScrollView(getActivity()); 45 | ViewGroup.LayoutParams scrollParams = new ViewGroup.LayoutParams( 46 | ViewGroup.LayoutParams.MATCH_PARENT, 47 | ViewGroup.LayoutParams.MATCH_PARENT); 48 | mScrollView.setLayoutParams(scrollParams); 49 | 50 | mLogView = new LogView(getActivity()); 51 | ViewGroup.LayoutParams logParams = new ViewGroup.LayoutParams(scrollParams); 52 | logParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; 53 | mLogView.setLayoutParams(logParams); 54 | mLogView.setClickable(true); 55 | mLogView.setFocusable(true); 56 | mLogView.setTypeface(Typeface.MONOSPACE); 57 | 58 | // Want to set padding as 16 dips, setPadding takes pixels. Hooray math! 59 | int paddingDips = 16; 60 | double scale = getResources().getDisplayMetrics().density; 61 | int paddingPixels = (int) ((paddingDips * (scale)) + .5); 62 | mLogView.setPadding(paddingPixels, paddingPixels, paddingPixels, paddingPixels); 63 | mLogView.setCompoundDrawablePadding(paddingPixels); 64 | 65 | mLogView.setGravity(Gravity.BOTTOM); 66 | mLogView.setTextAppearance(getActivity(), android.R.style.TextAppearance_Holo_Medium); 67 | 68 | mScrollView.addView(mLogView); 69 | return mScrollView; 70 | } 71 | 72 | @Override 73 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 74 | Bundle savedInstanceState) { 75 | 76 | View result = inflateViews(); 77 | 78 | mLogView.addTextChangedListener(new TextWatcher() { 79 | @Override 80 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 81 | } 82 | 83 | @Override 84 | public void onTextChanged(CharSequence s, int start, int before, int count) { 85 | } 86 | 87 | @Override 88 | public void afterTextChanged(Editable s) { 89 | mScrollView.fullScroll(ScrollView.FOCUS_DOWN); 90 | } 91 | }); 92 | return result; 93 | } 94 | 95 | public LogView getLogView() { 96 | return mLogView; 97 | } 98 | } -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/dragsource/ImageDragListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016, The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.dragsource; 18 | 19 | import android.content.ClipData; 20 | import android.net.Uri; 21 | import android.view.DragEvent; 22 | import android.view.View; 23 | import android.widget.ImageView; 24 | 25 | /** 26 | * OnDragListener for ImageViews. 27 | * Sets colors of the target when DragEvents fire. When a drop is received, the {@link Uri} backing 28 | * the first {@link android.content.ClipData.Item} in the {@link DragEvent} is set as the image 29 | * resource of the ImageView. 30 | */ 31 | public class ImageDragListener implements View.OnDragListener { 32 | 33 | private static final int COLOR_INACTIVE = 0xFF888888; 34 | 35 | private static final int COLOR_ACTIVE = 0xFFCCCCCC; 36 | 37 | private static final int COLOR_HOVER = 0xFFEEEEEE; 38 | 39 | @Override 40 | public boolean onDrag(View view, DragEvent event) { 41 | // Change the color of the target for all events. 42 | // For the drop action, set the view to the dropped image. 43 | switch (event.getAction()) { 44 | case DragEvent.ACTION_DRAG_STARTED: 45 | setTargetColor(view, COLOR_ACTIVE); 46 | return true; 47 | 48 | case DragEvent.ACTION_DRAG_ENTERED: 49 | setTargetColor(view, COLOR_HOVER); 50 | return true; 51 | 52 | case DragEvent.ACTION_DRAG_LOCATION: 53 | processLocation(event.getX(), event.getY()); 54 | return true; 55 | 56 | case DragEvent.ACTION_DRAG_EXITED: 57 | setTargetColor(view, COLOR_ACTIVE); 58 | return true; 59 | 60 | case DragEvent.ACTION_DROP: 61 | return processDrop(view, event); 62 | 63 | case DragEvent.ACTION_DRAG_ENDED: 64 | setTargetColor(view, COLOR_INACTIVE); 65 | return true; 66 | 67 | default: 68 | break; 69 | } 70 | 71 | return false; 72 | } 73 | 74 | private void setTargetColor(View view, int color) { 75 | view.setBackgroundColor(color); 76 | } 77 | 78 | private boolean processDrop(View view, DragEvent event) { 79 | ClipData clipData = event.getClipData(); 80 | if (clipData == null || clipData.getItemCount() == 0) { 81 | return false; 82 | } 83 | ClipData.Item item = clipData.getItemAt(0); 84 | if (item == null) { 85 | return false; 86 | } 87 | Uri uri = item.getUri(); 88 | if (uri == null) { 89 | return false; 90 | } 91 | return setImageUri(view, event, uri); 92 | } 93 | 94 | protected void processLocation(float x, float y) { 95 | } 96 | 97 | protected boolean setImageUri(View view, DragEvent event, Uri uri) { 98 | if (!(view instanceof ImageView)) { 99 | return false; 100 | } 101 | ((ImageView) view).setImageURI(uri); 102 | return true; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /DragSource/src/main/res/layout/fragment_dragsource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 23 | 24 | 28 | 29 | 38 | 39 | 47 | 48 | 56 | 57 | 58 | 59 | 65 | 66 | 75 | 76 | 84 | 85 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/dragsource/MainActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 18 | package com.example.android.dragsource; 19 | 20 | import com.example.android.common.activities.SampleActivityBase; 21 | import com.example.android.common.logger.Log; 22 | import com.example.android.common.logger.LogFragment; 23 | import com.example.android.common.logger.LogWrapper; 24 | import com.example.android.common.logger.MessageOnlyLogFilter; 25 | 26 | import android.os.Bundle; 27 | import android.support.v4.app.FragmentTransaction; 28 | import android.view.Menu; 29 | import android.view.MenuItem; 30 | import android.widget.ViewAnimator; 31 | 32 | /** 33 | * A simple launcher activity containing a summary sample description, sample log and a custom 34 | * {@link android.support.v4.app.Fragment} which can display a view. 35 | *

36 | * For devices with displays with a width of 720dp or greater, the sample log is always visible, 37 | * on other devices it's visibility is controlled by an item on the Action Bar. 38 | */ 39 | public class MainActivity extends SampleActivityBase { 40 | 41 | public static final String TAG = "MainActivity"; 42 | 43 | // Whether the Log Fragment is currently shown 44 | private boolean mLogShown; 45 | 46 | @Override 47 | protected void onCreate(Bundle savedInstanceState) { 48 | super.onCreate(savedInstanceState); 49 | setContentView(R.layout.activity_main); 50 | 51 | if (savedInstanceState == null) { 52 | FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 53 | DragSourceFragment fragment = new DragSourceFragment(); 54 | transaction.replace(R.id.sample_content_fragment, fragment); 55 | transaction.commit(); 56 | } 57 | } 58 | 59 | @Override 60 | public boolean onCreateOptionsMenu(Menu menu) { 61 | getMenuInflater().inflate(R.menu.main, menu); 62 | return true; 63 | } 64 | 65 | @Override 66 | public boolean onPrepareOptionsMenu(Menu menu) { 67 | MenuItem logToggle = menu.findItem(R.id.menu_toggle_log); 68 | logToggle.setVisible(findViewById(R.id.sample_output) instanceof ViewAnimator); 69 | logToggle.setTitle(mLogShown ? R.string.sample_hide_log : R.string.sample_show_log); 70 | 71 | return super.onPrepareOptionsMenu(menu); 72 | } 73 | 74 | @Override 75 | public boolean onOptionsItemSelected(MenuItem item) { 76 | switch (item.getItemId()) { 77 | case R.id.menu_toggle_log: 78 | mLogShown = !mLogShown; 79 | ViewAnimator output = (ViewAnimator) findViewById(R.id.sample_output); 80 | if (mLogShown) { 81 | output.setDisplayedChild(1); 82 | } else { 83 | output.setDisplayedChild(0); 84 | } 85 | supportInvalidateOptionsMenu(); 86 | return true; 87 | } 88 | return super.onOptionsItemSelected(item); 89 | } 90 | 91 | /** Create a chain of targets that will receive log data */ 92 | @Override 93 | public void initializeLogging() { 94 | // Wraps Android's native log framework. 95 | LogWrapper logWrapper = new LogWrapper(); 96 | // Using Log, front-end to the logging chain, emulates android.util.log method signatures. 97 | Log.setLogNode(logWrapper); 98 | 99 | // Filter strips out everything except the message text. 100 | MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter(); 101 | logWrapper.setNext(msgFilter); 102 | 103 | // On screen logging via a fragment with a TextView. 104 | LogFragment logFragment = (LogFragment) getSupportFragmentManager() 105 | .findFragmentById(R.id.log_fragment); 106 | msgFilter.setNext(logFragment.getLogView()); 107 | 108 | Log.i(TAG, "Ready"); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/droptarget/MainActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 18 | package com.example.android.droptarget; 19 | 20 | import android.os.Bundle; 21 | import android.support.v4.app.FragmentTransaction; 22 | import android.view.Menu; 23 | import android.view.MenuItem; 24 | import android.widget.ViewAnimator; 25 | 26 | import com.example.android.common.activities.SampleActivityBase; 27 | import com.example.android.common.logger.Log; 28 | import com.example.android.common.logger.LogFragment; 29 | import com.example.android.common.logger.LogWrapper; 30 | import com.example.android.common.logger.MessageOnlyLogFilter; 31 | 32 | /** 33 | * A simple launcher activity containing a summary sample description, sample log and a custom 34 | * {@link android.support.v4.app.Fragment} which can display a view. 35 | *

36 | * For devices with displays with a width of 720dp or greater, the sample log is always visible, 37 | * on other devices it's visibility is controlled by an item on the Action Bar. 38 | */ 39 | public class MainActivity extends SampleActivityBase { 40 | 41 | public static final String TAG = "MainActivity"; 42 | 43 | // Whether the Log Fragment is currently shown 44 | private boolean mLogShown; 45 | 46 | @Override 47 | protected void onCreate(Bundle savedInstanceState) { 48 | super.onCreate(savedInstanceState); 49 | setContentView(R.layout.activity_main); 50 | 51 | if (savedInstanceState == null) { 52 | FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 53 | DropTargetFragment fragment = new DropTargetFragment(); 54 | transaction.replace(R.id.sample_content_fragment, fragment); 55 | transaction.commit(); 56 | } 57 | } 58 | 59 | @Override 60 | public boolean onCreateOptionsMenu(Menu menu) { 61 | getMenuInflater().inflate(R.menu.main, menu); 62 | return true; 63 | } 64 | 65 | @Override 66 | public boolean onPrepareOptionsMenu(Menu menu) { 67 | MenuItem logToggle = menu.findItem(R.id.menu_toggle_log); 68 | logToggle.setVisible(findViewById(R.id.sample_output) instanceof ViewAnimator); 69 | logToggle.setTitle(mLogShown ? R.string.sample_hide_log : R.string.sample_show_log); 70 | 71 | return super.onPrepareOptionsMenu(menu); 72 | } 73 | 74 | @Override 75 | public boolean onOptionsItemSelected(MenuItem item) { 76 | switch(item.getItemId()) { 77 | case R.id.menu_toggle_log: 78 | mLogShown = !mLogShown; 79 | ViewAnimator output = (ViewAnimator) findViewById(R.id.sample_output); 80 | if (mLogShown) { 81 | output.setDisplayedChild(1); 82 | } else { 83 | output.setDisplayedChild(0); 84 | } 85 | supportInvalidateOptionsMenu(); 86 | return true; 87 | } 88 | return super.onOptionsItemSelected(item); 89 | } 90 | 91 | /** Create a chain of targets that will receive log data */ 92 | @Override 93 | public void initializeLogging() { 94 | // Wraps Android's native log framework. 95 | LogWrapper logWrapper = new LogWrapper(); 96 | // Using Log, front-end to the logging chain, emulates android.util.log method signatures. 97 | Log.setLogNode(logWrapper); 98 | 99 | // Filter strips out everything except the message text. 100 | MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter(); 101 | logWrapper.setNext(msgFilter); 102 | 103 | // On screen logging via a fragment with a TextView. 104 | LogFragment logFragment = (LogFragment) getSupportFragmentManager() 105 | .findFragmentById(R.id.log_fragment); 106 | msgFilter.setNext(logFragment.getLogView()); 107 | 108 | Log.i(TAG, "Ready"); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/logger/LogView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | import android.app.Activity; 19 | import android.content.Context; 20 | import android.util.*; 21 | import android.widget.TextView; 22 | 23 | /** Simple TextView which is used to output log data received through the LogNode interface. 24 | */ 25 | public class LogView extends TextView implements LogNode { 26 | 27 | public LogView(Context context) { 28 | super(context); 29 | } 30 | 31 | public LogView(Context context, AttributeSet attrs) { 32 | super(context, attrs); 33 | } 34 | 35 | public LogView(Context context, AttributeSet attrs, int defStyle) { 36 | super(context, attrs, defStyle); 37 | } 38 | 39 | /** 40 | * Formats the log data and prints it out to the LogView. 41 | * @param priority Log level of the data being logged. Verbose, Error, etc. 42 | * @param tag Tag for for the log data. Can be used to organize log statements. 43 | * @param msg The actual message to be logged. The actual message to be logged. 44 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 45 | * to extract and print useful information. 46 | */ 47 | @Override 48 | public void println(int priority, String tag, String msg, Throwable tr) { 49 | 50 | 51 | String priorityStr = null; 52 | 53 | // For the purposes of this View, we want to print the priority as readable text. 54 | switch(priority) { 55 | case android.util.Log.VERBOSE: 56 | priorityStr = "VERBOSE"; 57 | break; 58 | case android.util.Log.DEBUG: 59 | priorityStr = "DEBUG"; 60 | break; 61 | case android.util.Log.INFO: 62 | priorityStr = "INFO"; 63 | break; 64 | case android.util.Log.WARN: 65 | priorityStr = "WARN"; 66 | break; 67 | case android.util.Log.ERROR: 68 | priorityStr = "ERROR"; 69 | break; 70 | case android.util.Log.ASSERT: 71 | priorityStr = "ASSERT"; 72 | break; 73 | default: 74 | break; 75 | } 76 | 77 | // Handily, the Log class has a facility for converting a stack trace into a usable string. 78 | String exceptionStr = null; 79 | if (tr != null) { 80 | exceptionStr = android.util.Log.getStackTraceString(tr); 81 | } 82 | 83 | // Take the priority, tag, message, and exception, and concatenate as necessary 84 | // into one usable line of text. 85 | final StringBuilder outputBuilder = new StringBuilder(); 86 | 87 | String delimiter = "\t"; 88 | appendIfNotNull(outputBuilder, priorityStr, delimiter); 89 | appendIfNotNull(outputBuilder, tag, delimiter); 90 | appendIfNotNull(outputBuilder, msg, delimiter); 91 | appendIfNotNull(outputBuilder, exceptionStr, delimiter); 92 | 93 | // In case this was originally called from an AsyncTask or some other off-UI thread, 94 | // make sure the update occurs within the UI thread. 95 | ((Activity) getContext()).runOnUiThread( (new Thread(new Runnable() { 96 | @Override 97 | public void run() { 98 | // Display the text we just generated within the LogView. 99 | appendToLog(outputBuilder.toString()); 100 | } 101 | }))); 102 | 103 | if (mNext != null) { 104 | mNext.println(priority, tag, msg, tr); 105 | } 106 | } 107 | 108 | public LogNode getNext() { 109 | return mNext; 110 | } 111 | 112 | public void setNext(LogNode node) { 113 | mNext = node; 114 | } 115 | 116 | /** Takes a string and adds to it, with a separator, if the bit to be added isn't null. Since 117 | * the logger takes so many arguments that might be null, this method helps cut out some of the 118 | * agonizing tedium of writing the same 3 lines over and over. 119 | * @param source StringBuilder containing the text to append to. 120 | * @param addStr The String to append 121 | * @param delimiter The String to separate the source and appended strings. A tab or comma, 122 | * for instance. 123 | * @return The fully concatenated String as a StringBuilder 124 | */ 125 | private StringBuilder appendIfNotNull(StringBuilder source, String addStr, String delimiter) { 126 | if (addStr != null) { 127 | if (addStr.length() == 0) { 128 | delimiter = ""; 129 | } 130 | 131 | return source.append(addStr).append(delimiter); 132 | } 133 | return source; 134 | } 135 | 136 | // The next LogNode in the chain. 137 | LogNode mNext; 138 | 139 | /** Outputs the string as a new line of log data in the LogView. */ 140 | public void appendToLog(String s) { 141 | append("\n" + s); 142 | } 143 | 144 | 145 | } 146 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/logger/LogView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | import android.app.Activity; 19 | import android.content.Context; 20 | import android.util.AttributeSet; 21 | import android.widget.TextView; 22 | 23 | /** 24 | * Simple TextView which is used to output log data received through the LogNode interface. 25 | */ 26 | public class LogView extends TextView implements LogNode { 27 | 28 | public LogView(Context context) { 29 | super(context); 30 | } 31 | 32 | public LogView(Context context, AttributeSet attrs) { 33 | super(context, attrs); 34 | } 35 | 36 | public LogView(Context context, AttributeSet attrs, int defStyle) { 37 | super(context, attrs, defStyle); 38 | } 39 | 40 | /** 41 | * Formats the log data and prints it out to the LogView. 42 | * 43 | * @param priority Log level of the data being logged. Verbose, Error, etc. 44 | * @param tag Tag for for the log data. Can be used to organize log statements. 45 | * @param msg The actual message to be logged. The actual message to be logged. 46 | * @param tr If an exception was thrown, this can be sent along for the logging 47 | * facilities 48 | * to extract and print useful information. 49 | */ 50 | @Override 51 | public void println(int priority, String tag, String msg, Throwable tr) { 52 | 53 | String priorityStr = null; 54 | 55 | // For the purposes of this View, we want to print the priority as readable text. 56 | switch (priority) { 57 | case android.util.Log.VERBOSE: 58 | priorityStr = "VERBOSE"; 59 | break; 60 | case android.util.Log.DEBUG: 61 | priorityStr = "DEBUG"; 62 | break; 63 | case android.util.Log.INFO: 64 | priorityStr = "INFO"; 65 | break; 66 | case android.util.Log.WARN: 67 | priorityStr = "WARN"; 68 | break; 69 | case android.util.Log.ERROR: 70 | priorityStr = "ERROR"; 71 | break; 72 | case android.util.Log.ASSERT: 73 | priorityStr = "ASSERT"; 74 | break; 75 | default: 76 | break; 77 | } 78 | 79 | // Handily, the Log class has a facility for converting a stack trace into a usable string. 80 | String exceptionStr = null; 81 | if (tr != null) { 82 | exceptionStr = android.util.Log.getStackTraceString(tr); 83 | } 84 | 85 | // Take the priority, tag, message, and exception, and concatenate as necessary 86 | // into one usable line of text. 87 | final StringBuilder outputBuilder = new StringBuilder(); 88 | 89 | String delimiter = "\t"; 90 | appendIfNotNull(outputBuilder, priorityStr, delimiter); 91 | appendIfNotNull(outputBuilder, tag, delimiter); 92 | appendIfNotNull(outputBuilder, msg, delimiter); 93 | appendIfNotNull(outputBuilder, exceptionStr, delimiter); 94 | 95 | // In case this was originally called from an AsyncTask or some other off-UI thread, 96 | // make sure the update occurs within the UI thread. 97 | ((Activity) getContext()).runOnUiThread((new Thread(new Runnable() { 98 | @Override 99 | public void run() { 100 | // Display the text we just generated within the LogView. 101 | appendToLog(outputBuilder.toString()); 102 | } 103 | }))); 104 | 105 | if (mNext != null) { 106 | mNext.println(priority, tag, msg, tr); 107 | } 108 | } 109 | 110 | public LogNode getNext() { 111 | return mNext; 112 | } 113 | 114 | public void setNext(LogNode node) { 115 | mNext = node; 116 | } 117 | 118 | /** 119 | * Takes a string and adds to it, with a separator, if the bit to be added isn't null. Since 120 | * the logger takes so many arguments that might be null, this method helps cut out some of the 121 | * agonizing tedium of writing the same 3 lines over and over. 122 | * 123 | * @param source StringBuilder containing the text to append to. 124 | * @param addStr The String to append 125 | * @param delimiter The String to separate the source and appended strings. A tab or comma, 126 | * for instance. 127 | * @return The fully concatenated String as a StringBuilder 128 | */ 129 | private StringBuilder appendIfNotNull(StringBuilder source, String addStr, String delimiter) { 130 | if (addStr != null) { 131 | if (addStr.length() == 0) { 132 | delimiter = ""; 133 | } 134 | 135 | return source.append(addStr).append(delimiter); 136 | } 137 | return source; 138 | } 139 | 140 | // The next LogNode in the chain. 141 | LogNode mNext; 142 | 143 | /** Outputs the string as a new line of log data in the LogView. */ 144 | public void appendToLog(String s) { 145 | append("\n" + s); 146 | } 147 | 148 | 149 | } 150 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/droptarget/DropTargetFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.droptarget; 18 | 19 | import com.example.android.common.logger.Log; 20 | 21 | import android.app.Activity; 22 | import android.content.ClipDescription; 23 | import android.content.ContentResolver; 24 | import android.net.Uri; 25 | import android.os.Bundle; 26 | import android.os.PersistableBundle; 27 | import android.support.annotation.Nullable; 28 | import android.support.v13.app.ActivityCompat; 29 | import android.support.v13.view.DragAndDropPermissionsCompat; 30 | import android.support.v4.app.Fragment; 31 | import android.view.DragEvent; 32 | import android.view.LayoutInflater; 33 | import android.view.View; 34 | import android.view.ViewGroup; 35 | import android.widget.CheckBox; 36 | import android.widget.ImageView; 37 | 38 | /** 39 | * This sample demonstrates data can be moved between views in different applications via 40 | * drag and drop. 41 | *

This is the Target app for the drag and drop process. This app uses a 42 | * {@link android.widget.ImageView} as the drop target. Images onto this 43 | * view from the DragSource app that is also part of this sample. 44 | *

45 | * There is also a {@link android.widget.EditText} widget that can accept dropped text (no 46 | * extra setup is necessary). 47 | * To access content URIs requiring permissions, the target app needs to request the 48 | * {@link android.view.DragAndDropPermissions} from the Activity via 49 | * {@link ActivityCompat#requestDragAndDropPermissions(Activity, DragEvent)}. This permission will 50 | * stay either as long as the activity is alive, or until the release() method is called on the 51 | * {@link android.view.DragAndDropPermissions} object. 52 | */ 53 | public class DropTargetFragment extends Fragment { 54 | 55 | private static final String IMAGE_URI = "IMAGE_URI"; 56 | 57 | public static final String EXTRA_IMAGE_INFO = "IMAGE_INFO"; 58 | 59 | private static final String TAG = "DropTargetFragment"; 60 | 61 | private Uri mImageUri; 62 | 63 | private CheckBox mReleasePermissionCheckBox; 64 | 65 | @Nullable 66 | @Override 67 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 68 | @Nullable Bundle savedInstanceState) { 69 | 70 | View rootView = inflater.inflate(R.layout.fragment_droptarget, container, false); 71 | final ImageView imageView = (ImageView) rootView.findViewById(R.id.image_target); 72 | 73 | ImageDragListener imageDragListener = new PermissionAwareImageDragListener(); 74 | 75 | imageView.setOnDragListener(imageDragListener); 76 | 77 | // Restore the application state if an image was being displayed. 78 | if (savedInstanceState != null) { 79 | final String uriString = savedInstanceState.getString(IMAGE_URI); 80 | if (uriString != null) { 81 | mImageUri = Uri.parse(uriString); 82 | imageView.setImageURI(mImageUri); 83 | } 84 | } 85 | 86 | mReleasePermissionCheckBox = (CheckBox) rootView.findViewById(R.id.release_checkbox); 87 | 88 | return rootView; 89 | } 90 | 91 | @Override 92 | public void onSaveInstanceState(Bundle savedInstanceState) { 93 | if (mImageUri != null) { 94 | savedInstanceState.putString(IMAGE_URI, mImageUri.toString()); 95 | } 96 | super.onSaveInstanceState(savedInstanceState); 97 | } 98 | 99 | private class PermissionAwareImageDragListener extends ImageDragListener { 100 | 101 | @Override 102 | protected void processLocation(float x, float y) { 103 | // Callback is received when the dragged image enters the drop area. 104 | } 105 | 106 | @Override 107 | protected boolean setImageUri(View view, DragEvent event, Uri uri) { 108 | // Read the string from the clip description extras. 109 | Log.d(TAG, "ClipDescription extra: " + getExtra(event)); 110 | 111 | Log.d(TAG, "Setting image source to: " + uri.toString()); 112 | mImageUri = uri; 113 | 114 | if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) { 115 | // Accessing a "content" scheme Uri requires a permission grant. 116 | DragAndDropPermissionsCompat dropPermissions = ActivityCompat 117 | .requestDragAndDropPermissions(getActivity(), event); 118 | Log.d(TAG, "Requesting permissions."); 119 | 120 | if (dropPermissions == null) { 121 | // Permission could not be obtained. 122 | Log.d(TAG, "Drop permission request failed."); 123 | return false; 124 | } 125 | 126 | final boolean result = super.setImageUri(view, event, uri); 127 | 128 | if (mReleasePermissionCheckBox.isChecked()) { 129 | /* Release the permissions if you are done with the URI. 130 | Note that you may need to hold onto the permission until later if other 131 | operations are performed on the content. For instance, releasing the 132 | permissions here will prevent onCreateView from properly restoring the 133 | ImageView state. 134 | If permissions are not explicitly released, the permission grant will be 135 | revoked when the activity is destroyed. 136 | */ 137 | dropPermissions.release(); 138 | Log.d(TAG, "Permissions released."); 139 | } 140 | 141 | return result; 142 | } else { 143 | // Other schemes (such as "android.resource") do not require a permission grant. 144 | return super.setImageUri(view, event, uri); 145 | } 146 | } 147 | 148 | @Override 149 | public boolean onDrag(View view, DragEvent event) { 150 | // DragTarget is peeking into the MIME types of the dragged event in order to ignore 151 | // non-image drags completely. 152 | // DragSource does not do that but rejects non-image content once a drop has happened. 153 | ClipDescription clipDescription = event.getClipDescription(); 154 | if (clipDescription != null && !clipDescription.hasMimeType("image/*")) { 155 | return false; 156 | } 157 | // Callback received when image is being dragged. 158 | return super.onDrag(view, event); 159 | } 160 | } 161 | 162 | /** 163 | * DragEvents can contain additional data packaged in a {@link PersistableBundle}. 164 | * Extract the extras from the event and return the String stored for the 165 | * {@link #EXTRA_IMAGE_INFO} entry. 166 | */ 167 | private String getExtra(DragEvent event) { 168 | // The extras are contained in the ClipDescription in the DragEvent. 169 | ClipDescription clipDescription = event.getClipDescription(); 170 | if (clipDescription != null) { 171 | PersistableBundle extras = clipDescription.getExtras(); 172 | if (extras != null) { 173 | return extras.getString(EXTRA_IMAGE_INFO); 174 | } 175 | } 176 | return null; 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /DropTarget/src/main/java/com/example/android/common/logger/Log.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | /** 19 | * Helper class for a list (or tree) of LoggerNodes. 20 | * 21 | *

When this is set as the head of the list, 22 | * an instance of it can function as a drop-in replacement for {@link android.util.Log}. 23 | * Most of the methods in this class server only to map a method call in Log to its equivalent 24 | * in LogNode.

25 | */ 26 | public class Log { 27 | // Grabbing the native values from Android's native logging facilities, 28 | // to make for easy migration and interop. 29 | public static final int NONE = -1; 30 | public static final int VERBOSE = android.util.Log.VERBOSE; 31 | public static final int DEBUG = android.util.Log.DEBUG; 32 | public static final int INFO = android.util.Log.INFO; 33 | public static final int WARN = android.util.Log.WARN; 34 | public static final int ERROR = android.util.Log.ERROR; 35 | public static final int ASSERT = android.util.Log.ASSERT; 36 | 37 | // Stores the beginning of the LogNode topology. 38 | private static LogNode mLogNode; 39 | 40 | /** 41 | * Returns the next LogNode in the linked list. 42 | */ 43 | public static LogNode getLogNode() { 44 | return mLogNode; 45 | } 46 | 47 | /** 48 | * Sets the LogNode data will be sent to. 49 | */ 50 | public static void setLogNode(LogNode node) { 51 | mLogNode = node; 52 | } 53 | 54 | /** 55 | * Instructs the LogNode to print the log data provided. Other LogNodes can 56 | * be chained to the end of the LogNode as desired. 57 | * 58 | * @param priority Log level of the data being logged. Verbose, Error, etc. 59 | * @param tag Tag for for the log data. Can be used to organize log statements. 60 | * @param msg The actual message to be logged. 61 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 62 | * to extract and print useful information. 63 | */ 64 | public static void println(int priority, String tag, String msg, Throwable tr) { 65 | if (mLogNode != null) { 66 | mLogNode.println(priority, tag, msg, tr); 67 | } 68 | } 69 | 70 | /** 71 | * Instructs the LogNode to print the log data provided. Other LogNodes can 72 | * be chained to the end of the LogNode as desired. 73 | * 74 | * @param priority Log level of the data being logged. Verbose, Error, etc. 75 | * @param tag Tag for for the log data. Can be used to organize log statements. 76 | * @param msg The actual message to be logged. The actual message to be logged. 77 | */ 78 | public static void println(int priority, String tag, String msg) { 79 | println(priority, tag, msg, null); 80 | } 81 | 82 | /** 83 | * Prints a message at VERBOSE priority. 84 | * 85 | * @param tag Tag for for the log data. Can be used to organize log statements. 86 | * @param msg The actual message to be logged. 87 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 88 | * to extract and print useful information. 89 | */ 90 | public static void v(String tag, String msg, Throwable tr) { 91 | println(VERBOSE, tag, msg, tr); 92 | } 93 | 94 | /** 95 | * Prints a message at VERBOSE priority. 96 | * 97 | * @param tag Tag for for the log data. Can be used to organize log statements. 98 | * @param msg The actual message to be logged. 99 | */ 100 | public static void v(String tag, String msg) { 101 | v(tag, msg, null); 102 | } 103 | 104 | 105 | /** 106 | * Prints a message at DEBUG priority. 107 | * 108 | * @param tag Tag for for the log data. Can be used to organize log statements. 109 | * @param msg The actual message to be logged. 110 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 111 | * to extract and print useful information. 112 | */ 113 | public static void d(String tag, String msg, Throwable tr) { 114 | println(DEBUG, tag, msg, tr); 115 | } 116 | 117 | /** 118 | * Prints a message at DEBUG priority. 119 | * 120 | * @param tag Tag for for the log data. Can be used to organize log statements. 121 | * @param msg The actual message to be logged. 122 | */ 123 | public static void d(String tag, String msg) { 124 | d(tag, msg, null); 125 | } 126 | 127 | /** 128 | * Prints a message at INFO priority. 129 | * 130 | * @param tag Tag for for the log data. Can be used to organize log statements. 131 | * @param msg The actual message to be logged. 132 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 133 | * to extract and print useful information. 134 | */ 135 | public static void i(String tag, String msg, Throwable tr) { 136 | println(INFO, tag, msg, tr); 137 | } 138 | 139 | /** 140 | * Prints a message at INFO priority. 141 | * 142 | * @param tag Tag for for the log data. Can be used to organize log statements. 143 | * @param msg The actual message to be logged. 144 | */ 145 | public static void i(String tag, String msg) { 146 | i(tag, msg, null); 147 | } 148 | 149 | /** 150 | * Prints a message at WARN priority. 151 | * 152 | * @param tag Tag for for the log data. Can be used to organize log statements. 153 | * @param msg The actual message to be logged. 154 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 155 | * to extract and print useful information. 156 | */ 157 | public static void w(String tag, String msg, Throwable tr) { 158 | println(WARN, tag, msg, tr); 159 | } 160 | 161 | /** 162 | * Prints a message at WARN priority. 163 | * 164 | * @param tag Tag for for the log data. Can be used to organize log statements. 165 | * @param msg The actual message to be logged. 166 | */ 167 | public static void w(String tag, String msg) { 168 | w(tag, msg, null); 169 | } 170 | 171 | /** 172 | * Prints a message at WARN priority. 173 | * 174 | * @param tag Tag for for the log data. Can be used to organize log statements. 175 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 176 | * to extract and print useful information. 177 | */ 178 | public static void w(String tag, Throwable tr) { 179 | w(tag, null, tr); 180 | } 181 | 182 | /** 183 | * Prints a message at ERROR priority. 184 | * 185 | * @param tag Tag for for the log data. Can be used to organize log statements. 186 | * @param msg The actual message to be logged. 187 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 188 | * to extract and print useful information. 189 | */ 190 | public static void e(String tag, String msg, Throwable tr) { 191 | println(ERROR, tag, msg, tr); 192 | } 193 | 194 | /** 195 | * Prints a message at ERROR priority. 196 | * 197 | * @param tag Tag for for the log data. Can be used to organize log statements. 198 | * @param msg The actual message to be logged. 199 | */ 200 | public static void e(String tag, String msg) { 201 | e(tag, msg, null); 202 | } 203 | 204 | /** 205 | * Prints a message at ASSERT priority. 206 | * 207 | * @param tag Tag for for the log data. Can be used to organize log statements. 208 | * @param msg The actual message to be logged. 209 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 210 | * to extract and print useful information. 211 | */ 212 | public static void wtf(String tag, String msg, Throwable tr) { 213 | println(ASSERT, tag, msg, tr); 214 | } 215 | 216 | /** 217 | * Prints a message at ASSERT priority. 218 | * 219 | * @param tag Tag for for the log data. Can be used to organize log statements. 220 | * @param msg The actual message to be logged. 221 | */ 222 | public static void wtf(String tag, String msg) { 223 | wtf(tag, msg, null); 224 | } 225 | 226 | /** 227 | * Prints a message at ASSERT priority. 228 | * 229 | * @param tag Tag for for the log data. Can be used to organize log statements. 230 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 231 | * to extract and print useful information. 232 | */ 233 | public static void wtf(String tag, Throwable tr) { 234 | wtf(tag, null, tr); 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/common/logger/Log.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.android.common.logger; 17 | 18 | /** 19 | * Helper class for a list (or tree) of LoggerNodes. 20 | * 21 | *

When this is set as the head of the list, 22 | * an instance of it can function as a drop-in replacement for {@link android.util.Log}. 23 | * Most of the methods in this class server only to map a method call in Log to its equivalent 24 | * in LogNode.

25 | */ 26 | public class Log { 27 | 28 | // Grabbing the native values from Android's native logging facilities, 29 | // to make for easy migration and interop. 30 | public static final int NONE = -1; 31 | 32 | public static final int VERBOSE = android.util.Log.VERBOSE; 33 | 34 | public static final int DEBUG = android.util.Log.DEBUG; 35 | 36 | public static final int INFO = android.util.Log.INFO; 37 | 38 | public static final int WARN = android.util.Log.WARN; 39 | 40 | public static final int ERROR = android.util.Log.ERROR; 41 | 42 | public static final int ASSERT = android.util.Log.ASSERT; 43 | 44 | // Stores the beginning of the LogNode topology. 45 | private static LogNode mLogNode; 46 | 47 | /** 48 | * Returns the next LogNode in the linked list. 49 | */ 50 | public static LogNode getLogNode() { 51 | return mLogNode; 52 | } 53 | 54 | /** 55 | * Sets the LogNode data will be sent to. 56 | */ 57 | public static void setLogNode(LogNode node) { 58 | mLogNode = node; 59 | } 60 | 61 | /** 62 | * Instructs the LogNode to print the log data provided. Other LogNodes can 63 | * be chained to the end of the LogNode as desired. 64 | * 65 | * @param priority Log level of the data being logged. Verbose, Error, etc. 66 | * @param tag Tag for for the log data. Can be used to organize log statements. 67 | * @param msg The actual message to be logged. 68 | * @param tr If an exception was thrown, this can be sent along for the logging 69 | * facilities 70 | * to extract and print useful information. 71 | */ 72 | public static void println(int priority, String tag, String msg, Throwable tr) { 73 | if (mLogNode != null) { 74 | mLogNode.println(priority, tag, msg, tr); 75 | } 76 | } 77 | 78 | /** 79 | * Instructs the LogNode to print the log data provided. Other LogNodes can 80 | * be chained to the end of the LogNode as desired. 81 | * 82 | * @param priority Log level of the data being logged. Verbose, Error, etc. 83 | * @param tag Tag for for the log data. Can be used to organize log statements. 84 | * @param msg The actual message to be logged. The actual message to be logged. 85 | */ 86 | public static void println(int priority, String tag, String msg) { 87 | println(priority, tag, msg, null); 88 | } 89 | 90 | /** 91 | * Prints a message at VERBOSE priority. 92 | * 93 | * @param tag Tag for for the log data. Can be used to organize log statements. 94 | * @param msg The actual message to be logged. 95 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 96 | * to extract and print useful information. 97 | */ 98 | public static void v(String tag, String msg, Throwable tr) { 99 | println(VERBOSE, tag, msg, tr); 100 | } 101 | 102 | /** 103 | * Prints a message at VERBOSE priority. 104 | * 105 | * @param tag Tag for for the log data. Can be used to organize log statements. 106 | * @param msg The actual message to be logged. 107 | */ 108 | public static void v(String tag, String msg) { 109 | v(tag, msg, null); 110 | } 111 | 112 | 113 | /** 114 | * Prints a message at DEBUG priority. 115 | * 116 | * @param tag Tag for for the log data. Can be used to organize log statements. 117 | * @param msg The actual message to be logged. 118 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 119 | * to extract and print useful information. 120 | */ 121 | public static void d(String tag, String msg, Throwable tr) { 122 | println(DEBUG, tag, msg, tr); 123 | } 124 | 125 | /** 126 | * Prints a message at DEBUG priority. 127 | * 128 | * @param tag Tag for for the log data. Can be used to organize log statements. 129 | * @param msg The actual message to be logged. 130 | */ 131 | public static void d(String tag, String msg) { 132 | d(tag, msg, null); 133 | } 134 | 135 | /** 136 | * Prints a message at INFO priority. 137 | * 138 | * @param tag Tag for for the log data. Can be used to organize log statements. 139 | * @param msg The actual message to be logged. 140 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 141 | * to extract and print useful information. 142 | */ 143 | public static void i(String tag, String msg, Throwable tr) { 144 | println(INFO, tag, msg, tr); 145 | } 146 | 147 | /** 148 | * Prints a message at INFO priority. 149 | * 150 | * @param tag Tag for for the log data. Can be used to organize log statements. 151 | * @param msg The actual message to be logged. 152 | */ 153 | public static void i(String tag, String msg) { 154 | i(tag, msg, null); 155 | } 156 | 157 | /** 158 | * Prints a message at WARN priority. 159 | * 160 | * @param tag Tag for for the log data. Can be used to organize log statements. 161 | * @param msg The actual message to be logged. 162 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 163 | * to extract and print useful information. 164 | */ 165 | public static void w(String tag, String msg, Throwable tr) { 166 | println(WARN, tag, msg, tr); 167 | } 168 | 169 | /** 170 | * Prints a message at WARN priority. 171 | * 172 | * @param tag Tag for for the log data. Can be used to organize log statements. 173 | * @param msg The actual message to be logged. 174 | */ 175 | public static void w(String tag, String msg) { 176 | w(tag, msg, null); 177 | } 178 | 179 | /** 180 | * Prints a message at WARN priority. 181 | * 182 | * @param tag Tag for for the log data. Can be used to organize log statements. 183 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 184 | * to extract and print useful information. 185 | */ 186 | public static void w(String tag, Throwable tr) { 187 | w(tag, null, tr); 188 | } 189 | 190 | /** 191 | * Prints a message at ERROR priority. 192 | * 193 | * @param tag Tag for for the log data. Can be used to organize log statements. 194 | * @param msg The actual message to be logged. 195 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 196 | * to extract and print useful information. 197 | */ 198 | public static void e(String tag, String msg, Throwable tr) { 199 | println(ERROR, tag, msg, tr); 200 | } 201 | 202 | /** 203 | * Prints a message at ERROR priority. 204 | * 205 | * @param tag Tag for for the log data. Can be used to organize log statements. 206 | * @param msg The actual message to be logged. 207 | */ 208 | public static void e(String tag, String msg) { 209 | e(tag, msg, null); 210 | } 211 | 212 | /** 213 | * Prints a message at ASSERT priority. 214 | * 215 | * @param tag Tag for for the log data. Can be used to organize log statements. 216 | * @param msg The actual message to be logged. 217 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 218 | * to extract and print useful information. 219 | */ 220 | public static void wtf(String tag, String msg, Throwable tr) { 221 | println(ASSERT, tag, msg, tr); 222 | } 223 | 224 | /** 225 | * Prints a message at ASSERT priority. 226 | * 227 | * @param tag Tag for for the log data. Can be used to organize log statements. 228 | * @param msg The actual message to be logged. 229 | */ 230 | public static void wtf(String tag, String msg) { 231 | wtf(tag, msg, null); 232 | } 233 | 234 | /** 235 | * Prints a message at ASSERT priority. 236 | * 237 | * @param tag Tag for for the log data. Can be used to organize log statements. 238 | * @param tr If an exception was thrown, this can be sent along for the logging facilities 239 | * to extract and print useful information. 240 | */ 241 | public static void wtf(String tag, Throwable tr) { 242 | wtf(tag, null, tr); 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /DragSource/src/main/java/com/example/android/dragsource/DragSourceFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015, The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.example.android.dragsource; 18 | 19 | import com.example.android.common.logger.Log; 20 | 21 | import android.content.ClipData; 22 | import android.content.ClipDescription; 23 | import android.content.Context; 24 | import android.graphics.Bitmap; 25 | import android.graphics.BitmapFactory; 26 | import android.graphics.Point; 27 | import android.net.Uri; 28 | import android.os.Bundle; 29 | import android.os.PersistableBundle; 30 | import android.support.annotation.Nullable; 31 | import android.support.v13.view.DragStartHelper; 32 | import android.support.v4.app.Fragment; 33 | import android.support.v4.content.FileProvider; 34 | import android.view.DragEvent; 35 | import android.view.LayoutInflater; 36 | import android.view.View; 37 | import android.view.ViewGroup; 38 | import android.widget.ImageView; 39 | 40 | import java.io.File; 41 | import java.io.FileOutputStream; 42 | import java.io.IOException; 43 | import java.util.Date; 44 | 45 | 46 | /** 47 | * This sample demonstrates data can be moved between views within the app or between different 48 | * apps via drag and drop. 49 | *

This is the source app for the drag and drop sample. This app contains several 50 | * {@link android.widget.ImageView} widgets which can be a drag source. Images can be dropped 51 | * to a drop target area within the same app or in the DropTarget app (a separate app in this 52 | * sample). 53 | *

54 | * There is also one {@link android.widget.EditText} widget that can be a drag source (no extra 55 | * setup is necessary). 56 | *

57 | * To enable cross application drag and drop, the {@link android.view.View#DRAG_FLAG_GLOBAL} 58 | * permission needs to be passed to the {@link android.view.View#startDragAndDrop(ClipData, 59 | * View.DragShadowBuilder, Object, int)} method. If a Uri 60 | * requiring permission grants is being sent, then the 61 | * {@link android.view.View#DRAG_FLAG_GLOBAL_URI_READ} and/or the 62 | * {@link android.view.View#DRAG_FLAG_GLOBAL_URI_WRITE} flags must be used also. 63 | */ 64 | public class DragSourceFragment extends Fragment { 65 | 66 | /** 67 | * Name of saved data that stores the dropped image URI on the local ImageView when set. 68 | */ 69 | private static final String IMAGE_URI = "IMAGE_URI"; 70 | 71 | /** 72 | * Name of the parameter for a {@link ClipData} extra that stores a text describing the dragged 73 | * image. 74 | */ 75 | public static final String EXTRA_IMAGE_INFO = "IMAGE_INFO"; 76 | 77 | /** 78 | * Uri of the ImageView source when set. 79 | */ 80 | private Uri mLocalImageUri; 81 | 82 | private static final String TAG = "DragSourceFragment"; 83 | 84 | private static final String CONTENT_AUTHORITY = "com.example.android.dragsource.fileprovider"; 85 | 86 | @Nullable 87 | @Override 88 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 89 | @Nullable Bundle savedInstanceState) { 90 | 91 | View view = inflater.inflate(R.layout.fragment_dragsource, null); 92 | 93 | // Set up two image views for global drag and drop with a permission grant. 94 | Uri imageUri = getFileUri(R.drawable.image1, "image1.png"); 95 | ImageView imageView = (ImageView) view.findViewById(R.id.image_one); 96 | setUpDraggableImage(imageView, imageUri); 97 | imageView.setImageURI(imageUri); 98 | 99 | imageUri = getFileUri(R.drawable.image2, "image2.png"); 100 | imageView = (ImageView) view.findViewById(R.id.image_two); 101 | setUpDraggableImage(imageView, imageUri); 102 | imageView.setImageURI(imageUri); 103 | 104 | // Set up the local drop target area. 105 | final ImageView localImageTarget = (ImageView) view.findViewById(R.id.local_target); 106 | localImageTarget.setOnDragListener(new ImageDragListener() { 107 | @Override 108 | protected boolean setImageUri(View view, DragEvent event, Uri uri) { 109 | mLocalImageUri = uri; 110 | Log.d(TAG, "Setting local image to: " + uri); 111 | return super.setImageUri(view, event, uri); 112 | } 113 | }); 114 | 115 | if (savedInstanceState != null) { 116 | final String uriString = savedInstanceState.getString(IMAGE_URI); 117 | if (uriString != null) { 118 | mLocalImageUri = Uri.parse(uriString); 119 | Log.d(TAG, "Restoring local image to: " + mLocalImageUri); 120 | localImageTarget.setImageURI(mLocalImageUri); 121 | } 122 | } 123 | return view; 124 | } 125 | 126 | @Override 127 | public void onSaveInstanceState(Bundle savedInstanceState) { 128 | if (mLocalImageUri != null) { 129 | savedInstanceState.putString(IMAGE_URI, mLocalImageUri.toString()); 130 | } 131 | super.onSaveInstanceState(savedInstanceState); 132 | } 133 | 134 | private void setUpDraggableImage(ImageView imageView, final Uri imageUri) { 135 | 136 | // Set up a listener that starts the drag and drop event with flags and extra data. 137 | DragStartHelper.OnDragStartListener listener = new DragStartHelper.OnDragStartListener() { 138 | @Override 139 | public boolean onDragStart(View view, final DragStartHelper helper) { 140 | Log.d(TAG, "Drag start event received from helper."); 141 | 142 | // Use a DragShadowBuilder 143 | View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view) { 144 | @Override 145 | public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { 146 | super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); 147 | // Notify the DragStartHelper of point where the view was touched. 148 | helper.getTouchPosition(shadowTouchPoint); 149 | Log.d(TAG, "View was touched at: " + shadowTouchPoint); 150 | } 151 | }; 152 | 153 | // Set up the flags for the drag event. 154 | // Enable drag and drop across apps (global) 155 | // and require read permissions for this URI. 156 | int flags = View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_GLOBAL_URI_READ; 157 | 158 | // Add an optional clip description that that contains an extra String that is 159 | // read out by the target app. 160 | final ClipDescription clipDescription = new ClipDescription("", new String[]{ 161 | getContext().getContentResolver().getType(imageUri)}); 162 | // Extras are stored within a PersistableBundle. 163 | PersistableBundle extras = new PersistableBundle(1); 164 | // Add a String that the target app will display. 165 | extras.putString(EXTRA_IMAGE_INFO, 166 | "Drag Started at " + new Date()); 167 | clipDescription.setExtras(extras); 168 | 169 | // The ClipData object describes the object that is being dragged and dropped. 170 | final ClipData clipData = 171 | new ClipData(clipDescription, new ClipData.Item(imageUri)); 172 | 173 | Log.d(TAG, "Created ClipDescription. Starting drag and drop."); 174 | // Start the drag and drop event. 175 | return view.startDragAndDrop(clipData, shadowBuilder, null, flags); 176 | 177 | } 178 | 179 | }; 180 | 181 | // Use the DragStartHelper to detect drag and drop events and use the OnDragStartListener 182 | // defined above to start the event when it has been detected. 183 | DragStartHelper helper = new DragStartHelper(imageView, listener); 184 | helper.attach(); 185 | Log.d(TAG, "DragStartHelper attached to view."); 186 | } 187 | 188 | /** 189 | * Copy a drawable resource into local storage and makes it available via the 190 | * {@link FileProvider}. 191 | * 192 | * @see Context#getFilesDir() 193 | * @see FileProvider 194 | * @see FileProvider#getUriForFile(Context, String, File) 195 | */ 196 | private Uri getFileUri(int sourceResourceId, String targetName) { 197 | // Create the images/ sub directory if it does not exist yet. 198 | File filePath = new File(getContext().getFilesDir(), "images"); 199 | if (!filePath.exists() && !filePath.mkdir()) { 200 | return null; 201 | } 202 | 203 | // Copy a drawable from resources to the internal directory. 204 | File newFile = new File(filePath, targetName); 205 | if (!newFile.exists()) { 206 | copyImageResourceToFile(sourceResourceId, newFile); 207 | } 208 | 209 | // Make the file accessible via the FileProvider and retrieve its URI. 210 | return FileProvider.getUriForFile(getContext(), CONTENT_AUTHORITY, newFile); 211 | } 212 | 213 | 214 | /** 215 | * Copy a PNG resource drawable to a {@File}. 216 | */ 217 | private void copyImageResourceToFile(int resourceId, File filePath) { 218 | Bitmap image = BitmapFactory.decodeResource(getResources(), resourceId); 219 | 220 | FileOutputStream out = null; 221 | try { 222 | out = new FileOutputStream(filePath); 223 | image.compress(Bitmap.CompressFormat.PNG, 100, out); 224 | } catch (Exception e) { 225 | e.printStackTrace(); 226 | } finally { 227 | try { 228 | if (out != null) { 229 | out.close(); 230 | } 231 | } catch (IOException e) { 232 | e.printStackTrace(); 233 | } 234 | } 235 | } 236 | 237 | } 238 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | -------------- 3 | 4 | Version 2.0, January 2004 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, 12 | and distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by 15 | the copyright owner that is granting the License. 16 | 17 | "Legal Entity" shall mean the union of the acting entity and all 18 | other entities that control, are controlled by, or are under common 19 | control with that entity. For the purposes of this definition, 20 | "control" means (i) the power, direct or indirect, to cause the 21 | direction or management of such entity, whether by contract or 22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 23 | outstanding shares, or (iii) beneficial ownership of such entity. 24 | 25 | "You" (or "Your") shall mean an individual or Legal Entity 26 | exercising permissions granted by this License. 27 | 28 | "Source" form shall mean the preferred form for making modifications, 29 | including but not limited to software source code, documentation 30 | source, and configuration files. 31 | 32 | "Object" form shall mean any form resulting from mechanical 33 | transformation or translation of a Source form, including but 34 | not limited to compiled object code, generated documentation, 35 | and conversions to other media types. 36 | 37 | "Work" shall mean the work of authorship, whether in Source or 38 | Object form, made available under the License, as indicated by a 39 | copyright notice that is included in or attached to the work 40 | (an example is provided in the Appendix below). 41 | 42 | "Derivative Works" shall mean any work, whether in Source or Object 43 | form, that is based on (or derived from) the Work and for which the 44 | editorial revisions, annotations, elaborations, or other modifications 45 | represent, as a whole, an original work of authorship. For the purposes 46 | of this License, Derivative Works shall not include works that remain 47 | separable from, or merely link (or bind by name) to the interfaces of, 48 | the Work and Derivative Works thereof. 49 | 50 | "Contribution" shall mean any work of authorship, including 51 | the original version of the Work and any modifications or additions 52 | to that Work or Derivative Works thereof, that is intentionally 53 | submitted to Licensor for inclusion in the Work by the copyright owner 54 | or by an individual or Legal Entity authorized to submit on behalf of 55 | the copyright owner. For the purposes of this definition, "submitted" 56 | means any form of electronic, verbal, or written communication sent 57 | to the Licensor or its representatives, including but not limited to 58 | communication on electronic mailing lists, source code control systems, 59 | and issue tracking systems that are managed by, or on behalf of, the 60 | Licensor for the purpose of discussing and improving the Work, but 61 | excluding communication that is conspicuously marked or otherwise 62 | designated in writing by the copyright owner as "Not a Contribution." 63 | 64 | "Contributor" shall mean Licensor and any individual or Legal Entity 65 | on behalf of whom a Contribution has been received by Licensor and 66 | subsequently incorporated within the Work. 67 | 68 | 2. Grant of Copyright License. Subject to the terms and conditions of 69 | this License, each Contributor hereby grants to You a perpetual, 70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 71 | copyright license to reproduce, prepare Derivative Works of, 72 | publicly display, publicly perform, sublicense, and distribute the 73 | Work and such Derivative Works in Source or Object form. 74 | 75 | 3. Grant of Patent License. Subject to the terms and conditions of 76 | this License, each Contributor hereby grants to You a perpetual, 77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 78 | (except as stated in this section) patent license to make, have made, 79 | use, offer to sell, sell, import, and otherwise transfer the Work, 80 | where such license applies only to those patent claims licensable 81 | by such Contributor that are necessarily infringed by their 82 | Contribution(s) alone or by combination of their Contribution(s) 83 | with the Work to which such Contribution(s) was submitted. If You 84 | institute patent litigation against any entity (including a 85 | cross-claim or counterclaim in a lawsuit) alleging that the Work 86 | or a Contribution incorporated within the Work constitutes direct 87 | or contributory patent infringement, then any patent licenses 88 | granted to You under this License for that Work shall terminate 89 | as of the date such litigation is filed. 90 | 91 | 4. Redistribution. You may reproduce and distribute copies of the 92 | Work or Derivative Works thereof in any medium, with or without 93 | modifications, and in Source or Object form, provided that You 94 | meet the following conditions: 95 | 96 | (a) You must give any other recipients of the Work or 97 | Derivative Works a copy of this License; and 98 | 99 | (b) You must cause any modified files to carry prominent notices 100 | stating that You changed the files; and 101 | 102 | (c) You must retain, in the Source form of any Derivative Works 103 | that You distribute, all copyright, patent, trademark, and 104 | attribution notices from the Source form of the Work, 105 | excluding those notices that do not pertain to any part of 106 | the Derivative Works; and 107 | 108 | (d) If the Work includes a "NOTICE" text file as part of its 109 | distribution, then any Derivative Works that You distribute must 110 | include a readable copy of the attribution notices contained 111 | within such NOTICE file, excluding those notices that do not 112 | pertain to any part of the Derivative Works, in at least one 113 | of the following places: within a NOTICE text file distributed 114 | as part of the Derivative Works; within the Source form or 115 | documentation, if provided along with the Derivative Works; or, 116 | within a display generated by the Derivative Works, if and 117 | wherever such third-party notices normally appear. The contents 118 | of the NOTICE file are for informational purposes only and 119 | do not modify the License. You may add Your own attribution 120 | notices within Derivative Works that You distribute, alongside 121 | or as an addendum to the NOTICE text from the Work, provided 122 | that such additional attribution notices cannot be construed 123 | as modifying the License. 124 | 125 | You may add Your own copyright statement to Your modifications and 126 | may provide additional or different license terms and conditions 127 | for use, reproduction, or distribution of Your modifications, or 128 | for any such Derivative Works as a whole, provided Your use, 129 | reproduction, and distribution of the Work otherwise complies with 130 | the conditions stated in this License. 131 | 132 | 5. Submission of Contributions. Unless You explicitly state otherwise, 133 | any Contribution intentionally submitted for inclusion in the Work 134 | by You to the Licensor shall be under the terms and conditions of 135 | this License, without any additional terms or conditions. 136 | Notwithstanding the above, nothing herein shall supersede or modify 137 | the terms of any separate license agreement you may have executed 138 | with Licensor regarding such Contributions. 139 | 140 | 6. Trademarks. This License does not grant permission to use the trade 141 | names, trademarks, service marks, or product names of the Licensor, 142 | except as required for reasonable and customary use in describing the 143 | origin of the Work and reproducing the content of the NOTICE file. 144 | 145 | 7. Disclaimer of Warranty. Unless required by applicable law or 146 | agreed to in writing, Licensor provides the Work (and each 147 | Contributor provides its Contributions) on an "AS IS" BASIS, 148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 149 | implied, including, without limitation, any warranties or conditions 150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 151 | PARTICULAR PURPOSE. You are solely responsible for determining the 152 | appropriateness of using or redistributing the Work and assume any 153 | risks associated with Your exercise of permissions under this License. 154 | 155 | 8. Limitation of Liability. In no event and under no legal theory, 156 | whether in tort (including negligence), contract, or otherwise, 157 | unless required by applicable law (such as deliberate and grossly 158 | negligent acts) or agreed to in writing, shall any Contributor be 159 | liable to You for damages, including any direct, indirect, special, 160 | incidental, or consequential damages of any character arising as a 161 | result of this License or out of the use or inability to use the 162 | Work (including but not limited to damages for loss of goodwill, 163 | work stoppage, computer failure or malfunction, or any and all 164 | other commercial damages or losses), even if such Contributor 165 | has been advised of the possibility of such damages. 166 | 167 | 9. Accepting Warranty or Additional Liability. While redistributing 168 | the Work or Derivative Works thereof, You may choose to offer, 169 | and charge a fee for, acceptance of support, warranty, indemnity, 170 | or other liability obligations and/or rights consistent with this 171 | License. However, in accepting such obligations, You may act only 172 | on Your own behalf and on Your sole responsibility, not on behalf 173 | of any other Contributor, and only if You agree to indemnify, 174 | defend, and hold each Contributor harmless for any liability 175 | incurred by, or claims asserted against, such Contributor by reason 176 | of your accepting any such warranty or additional liability. 177 | 178 | END OF TERMS AND CONDITIONS 179 | 180 | APPENDIX: How to apply the Apache License to your work. 181 | 182 | To apply the Apache License to your work, attach the following 183 | boilerplate notice, with the fields enclosed by brackets "{}" 184 | replaced with your own identifying information. (Don't include 185 | the brackets!) The text should be enclosed in the appropriate 186 | comment syntax for the file format. We also recommend that a 187 | file or class name and description of purpose be included on the 188 | same "printed page" as the copyright notice for easier 189 | identification within third-party archives. 190 | 191 | Copyright {yyyy} {name of copyright owner} 192 | 193 | Licensed under the Apache License, Version 2.0 (the "License"); 194 | you may not use this file except in compliance with the License. 195 | You may obtain a copy of the License at 196 | 197 | http://www.apache.org/licenses/LICENSE-2.0 198 | 199 | Unless required by applicable law or agreed to in writing, software 200 | distributed under the License is distributed on an "AS IS" BASIS, 201 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 202 | See the License for the specific language governing permissions and 203 | limitations under the License. 204 | --------------------------------------------------------------------------------