summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmds/monkey/src/com/android/commands/monkey/Monkey.java79
-rw-r--r--cmds/monkey/src/com/android/commands/monkey/MonkeyEvent.java3
-rw-r--r--cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java58
-rw-r--r--cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java178
-rw-r--r--cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java42
-rw-r--r--cmds/monkey/src/com/android/commands/monkey/MonkeyUtils.java72
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java15
-rw-r--r--samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java2
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.gitignore7
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/.name1
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/compiler.xml22
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/copyright/profiles_settings.xml3
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/gradle.xml18
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/misc.xml22
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/modules.xml9
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/.idea/vcs.xml6
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/README7
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle43
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSampleProject.iml19
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/.gitignore1
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/app.iml95
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/build.gradle25
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/proguard-rules.pro17
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/AndroidManifest.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/MainActivity.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java)10
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/Utils.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/service/MessagingService.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/service/RespondService.java (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-hdpi/ic_launcher.png (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png)bin3964 -> 3964 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-mdpi/ic_launcher.png (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png)bin2424 -> 2424 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-xhdpi/ic_launcher.png (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png)bin5527 -> 5527 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-xxhdpi/ic_launcher.png (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png)bin9889 -> 9889 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/layout/activity_main.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/menu/main.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values-v11/styles.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values-v19/bools.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/bools.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/colors.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/dimens.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/strings.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/styles.xml (renamed from samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml)0
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/build.gradle18
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/gradle.properties18
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.jarbin0 -> 49896 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xsamples/devbytes/telephony/SmsSampleProject/gradlew164
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/gradlew.bat90
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/local.properties.sample7
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/settings.gradle2
-rw-r--r--testrunner/test_defs.xml7
55 files changed, 938 insertions, 128 deletions
diff --git a/cmds/monkey/src/com/android/commands/monkey/Monkey.java b/cmds/monkey/src/com/android/commands/monkey/Monkey.java
index dfcb4b02c..93bfcf0bb 100644
--- a/cmds/monkey/src/com/android/commands/monkey/Monkey.java
+++ b/cmds/monkey/src/com/android/commands/monkey/Monkey.java
@@ -31,15 +31,12 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.view.IWindowManager;
import android.view.Surface;
import java.io.BufferedReader;
import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
@@ -47,12 +44,12 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Writer;
-import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
+import java.util.Set;
/**
* Application that injects random key events and other actions into the system.
@@ -181,12 +178,6 @@ public class Monkey {
/** Package whitelist file. */
private String mPkgWhitelistFile;
- /** Packages we are allowed to run, or empty if no restriction. */
- private HashSet<String> mValidPackages = new HashSet<String>();
-
- /** Packages we are not allowed to run. */
- private HashSet<String> mInvalidPackages = new HashSet<String>();
-
/** Categories we are allowed to launch **/
private ArrayList<String> mMainCategories = new ArrayList<String>();
@@ -251,36 +242,20 @@ public class Monkey {
private MonkeyNetworkMonitor mNetworkMonitor = new MonkeyNetworkMonitor();
+ private boolean mPermissionTargetSystem = false;
+
// information on the current activity.
public static Intent currentIntent;
public static String currentPackage;
/**
- * Check whether we should run against the givn package.
- *
- * @param pkg The package name.
- * @return Returns true if we should run against pkg.
- */
- private boolean checkEnteringPackage(String pkg) {
- if (mInvalidPackages.size() > 0) {
- if (mInvalidPackages.contains(pkg)) {
- return false;
- }
- } else if (mValidPackages.size() > 0) {
- if (!mValidPackages.contains(pkg)) {
- return false;
- }
- }
- return true;
- }
-
- /**
* Monitor operations happening in the system.
*/
private class ActivityController extends IActivityController.Stub {
public boolean activityStarting(Intent intent, String pkg) {
- boolean allow = checkEnteringPackage(pkg) || (DEBUG_ALLOW_ANY_STARTS != 0);
+ boolean allow = MonkeyUtils.getPackageFilter().checkEnteringPackage(pkg)
+ || (DEBUG_ALLOW_ANY_STARTS != 0);
if (mVerbose > 0) {
// StrictMode's disk checks end up catching this on
// userdebug/eng builds due to PrintStream going to a
@@ -301,7 +276,8 @@ public class Monkey {
public boolean activityResuming(String pkg) {
StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();
System.out.println(" // activityResuming(" + pkg + ")");
- boolean allow = checkEnteringPackage(pkg) || (DEBUG_ALLOW_ANY_RESTARTS != 0);
+ boolean allow = MonkeyUtils.getPackageFilter().checkEnteringPackage(pkg)
+ || (DEBUG_ALLOW_ANY_RESTARTS != 0);
if (!allow) {
if (mVerbose > 0) {
System.out.println(" // " + (allow ? "Allowing" : "Rejecting")
@@ -559,18 +535,7 @@ public class Monkey {
if (mVerbose > 0) {
System.out.println(":Monkey: seed=" + mSeed + " count=" + mCount);
- if (mValidPackages.size() > 0) {
- Iterator<String> it = mValidPackages.iterator();
- while (it.hasNext()) {
- System.out.println(":AllowPackage: " + it.next());
- }
- }
- if (mInvalidPackages.size() > 0) {
- Iterator<String> it = mInvalidPackages.iterator();
- while (it.hasNext()) {
- System.out.println(":DisallowPackage: " + it.next());
- }
- }
+ MonkeyUtils.getPackageFilter().dump();
if (mMainCategories.size() != 0) {
Iterator<String> it = mMainCategories.iterator();
while (it.hasNext()) {
@@ -626,7 +591,8 @@ public class Monkey {
if (mVerbose >= 2) { // check seeding performance
System.out.println("// Seeded: " + mSeed);
}
- mEventSource = new MonkeySourceRandom(mRandom, mMainApps, mThrottle, mRandomizeThrottle);
+ mEventSource = new MonkeySourceRandom(mRandom, mMainApps,
+ mThrottle, mRandomizeThrottle, mPermissionTargetSystem);
mEventSource.setVerbose(mVerbose);
// set any of the factors that has been set
for (int i = 0; i < MonkeySourceRandom.FACTORZ_COUNT; i++) {
@@ -756,11 +722,12 @@ public class Monkey {
try {
String opt;
+ Set<String> validPackages = new HashSet<>();
while ((opt = nextOption()) != null) {
if (opt.equals("-s")) {
mSeed = nextOptionLong("Seed");
} else if (opt.equals("-p")) {
- mValidPackages.add(nextOptionData());
+ validPackages.add(nextOptionData());
} else if (opt.equals("-c")) {
mMainCategories.add(nextOptionData());
} else if (opt.equals("-v")) {
@@ -812,6 +779,9 @@ public class Monkey {
} else if (opt.equals("--pct-pinchzoom")) {
int i = MonkeySourceRandom.FACTOR_PINCHZOOM;
mFactors[i] = -nextOptionLong("pinch zoom events percentage");
+ } else if (opt.equals("--pct-permission")) {
+ int i = MonkeySourceRandom.FACTOR_PERMISSION;
+ mFactors[i] = -nextOptionLong("runtime permission toggle events percentage");
} else if (opt.equals("--pkg-blacklist-file")) {
mPkgBlacklistFile = nextOptionData();
} else if (opt.equals("--pkg-whitelist-file")) {
@@ -845,6 +815,8 @@ public class Monkey {
} else if (opt.equals("--periodic-bugreport")){
mGetPeriodicBugreport = true;
mBugreportFrequency = nextOptionLong("Number of iterations");
+ } else if (opt.equals("--permission-target-system")){
+ mPermissionTargetSystem = true;
} else if (opt.equals("-h")) {
showUsage();
return false;
@@ -854,6 +826,7 @@ public class Monkey {
return false;
}
}
+ MonkeyUtils.getPackageFilter().addValidPackages(validPackages);
} catch (RuntimeException ex) {
System.err.println("** Error: " + ex.toString());
showUsage();
@@ -889,7 +862,7 @@ public class Monkey {
* @param list The destination list.
* @return Returns false if any error occurs.
*/
- private static boolean loadPackageListFromFile(String fileName, HashSet<String> list) {
+ private static boolean loadPackageListFromFile(String fileName, Set<String> list) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(fileName));
@@ -921,20 +894,24 @@ public class Monkey {
* @return Returns false if any error occurs.
*/
private boolean loadPackageLists() {
- if (((mPkgWhitelistFile != null) || (mValidPackages.size() > 0))
+ if (((mPkgWhitelistFile != null) || (MonkeyUtils.getPackageFilter().hasValidPackages()))
&& (mPkgBlacklistFile != null)) {
System.err.println("** Error: you can not specify a package blacklist "
+ "together with a whitelist or individual packages (via -p).");
return false;
}
+ Set<String> validPackages = new HashSet<>();
if ((mPkgWhitelistFile != null)
- && (!loadPackageListFromFile(mPkgWhitelistFile, mValidPackages))) {
+ && (!loadPackageListFromFile(mPkgWhitelistFile, validPackages))) {
return false;
}
+ MonkeyUtils.getPackageFilter().addValidPackages(validPackages);
+ Set<String> invalidPackages = new HashSet<>();
if ((mPkgBlacklistFile != null)
- && (!loadPackageListFromFile(mPkgBlacklistFile, mInvalidPackages))) {
+ && (!loadPackageListFromFile(mPkgBlacklistFile, invalidPackages))) {
return false;
}
+ MonkeyUtils.getPackageFilter().addInvalidPackages(invalidPackages);
return true;
}
@@ -1014,7 +991,7 @@ public class Monkey {
for (int a = 0; a < NA; a++) {
ResolveInfo r = mainApps.get(a);
String packageName = r.activityInfo.applicationInfo.packageName;
- if (checkEnteringPackage(packageName)) {
+ if (MonkeyUtils.getPackageFilter().checkEnteringPackage(packageName)) {
if (mVerbose >= 2) { // very verbose
System.out.println("// + Using main activity " + r.activityInfo.name
+ " (from package " + packageName + ")");
@@ -1352,6 +1329,7 @@ public class Monkey {
usage.append(" [--pct-nav PERCENT] [--pct-majornav PERCENT]\n");
usage.append(" [--pct-appswitch PERCENT] [--pct-flip PERCENT]\n");
usage.append(" [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]\n");
+ usage.append(" [--pct-permission PERCENT]\n");
usage.append(" [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]\n");
usage.append(" [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]\n");
usage.append(" [--wait-dbg] [--dbg-no-events]\n");
@@ -1365,6 +1343,7 @@ public class Monkey {
usage.append(" [--script-log]\n");
usage.append(" [--bugreport]\n");
usage.append(" [--periodic-bugreport]\n");
+ usage.append(" [--permission-target-system]\n");
usage.append(" COUNT\n");
System.err.println(usage.toString());
}
diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyEvent.java
index 0a06604ac..ccae799bd 100644
--- a/cmds/monkey/src/com/android/commands/monkey/MonkeyEvent.java
+++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyEvent.java
@@ -31,7 +31,8 @@ public abstract class MonkeyEvent {
public static final int EVENT_TYPE_ACTIVITY = 4;
public static final int EVENT_TYPE_FLIP = 5; // Keyboard flip
public static final int EVENT_TYPE_THROTTLE = 6;
- public static final int EVENT_TYPE_NOOP = 7;
+ public static final int EVENT_TYPE_PERMISSION = 7;
+ public static final int EVENT_TYPE_NOOP = 8;
public static final int INJECT_SUCCESS = 1;
public static final int INJECT_FAIL = 0;
diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java
new file mode 100644
index 000000000..130827b2c
--- /dev/null
+++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.commands.monkey;
+
+import android.app.IActivityManager;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.view.IWindowManager;
+
+public class MonkeyPermissionEvent extends MonkeyEvent {
+ private String mPkg;
+ private PermissionInfo mPermissionInfo;
+
+ public MonkeyPermissionEvent(String pkg, PermissionInfo permissionInfo) {
+ super(EVENT_TYPE_PERMISSION);
+ mPkg = pkg;
+ mPermissionInfo = permissionInfo;
+ }
+
+ @Override
+ public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) {
+ IPackageManager pm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ try {
+ // determine if we should grant or revoke permission
+ int perm = pm.checkPermission(mPermissionInfo.name, mPkg, UserHandle.myUserId());
+ boolean grant = perm == PackageManager.PERMISSION_DENIED;
+ // log before calling pm in case we hit an error
+ System.out.println(String.format(":Permission %s %s to package %s",
+ grant ? "grant" : "revoke", mPermissionInfo.name, mPkg));
+ if (grant) {
+ pm.grantRuntimePermission(mPkg, mPermissionInfo.name, UserHandle.myUserId());
+ } else {
+ pm.revokeRuntimePermission(mPkg, mPermissionInfo.name, UserHandle.myUserId());
+ }
+ return MonkeyEvent.INJECT_SUCCESS;
+ } catch (RemoteException re) {
+ return MonkeyEvent.INJECT_ERROR_REMOTE_EXCEPTION;
+ }
+ }
+}
diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java
new file mode 100644
index 000000000..8ab49370b
--- /dev/null
+++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.commands.monkey;
+
+import android.Manifest;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
+import android.os.Build;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+/**
+ * Utility class that encapsulates runtime permission related methods for monkey
+ *
+ */
+public class MonkeyPermissionUtil {
+
+ private static final String PERMISSION_PREFIX = "android.permission.";
+ private static final String PERMISSION_GROUP_PREFIX = "android.permission-group.";
+
+ // from com.android.packageinstaller.permission.utils
+ private static final String[] MODERN_PERMISSION_GROUPS = {
+ Manifest.permission_group.CALENDAR, Manifest.permission_group.CAMERA,
+ Manifest.permission_group.CONTACTS, Manifest.permission_group.LOCATION,
+ Manifest.permission_group.SENSORS, Manifest.permission_group.SMS,
+ Manifest.permission_group.PHONE, Manifest.permission_group.MICROPHONE,
+ Manifest.permission_group.STORAGE
+ };
+
+ // from com.android.packageinstaller.permission.utils
+ private static boolean isModernPermissionGroup(String name) {
+ for (String modernGroup : MODERN_PERMISSION_GROUPS) {
+ if (modernGroup.equals(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * actual list of packages to target, with invalid packages excluded, and may optionally include
+ * system packages
+ */
+ private List<String> mTargetedPackages;
+ /** if we should target system packages regardless if they are listed */
+ private boolean mTargetSystemPackages;
+ private IPackageManager mPm;
+
+ /** keep track of runtime permissions requested for each package targeted */
+ private Map<String, List<PermissionInfo>> mPermissionMap;
+
+ public MonkeyPermissionUtil() {
+ mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ }
+
+ public void setTargetSystemPackages(boolean targetSystemPackages) {
+ mTargetSystemPackages = targetSystemPackages;
+ }
+
+ /**
+ * Decide if a package should be targeted by permission monkey
+ * @param info
+ * @return
+ */
+ private boolean shouldTargetPackage(PackageInfo info) {
+ // target if permitted by white listing / black listing rules
+ if (MonkeyUtils.getPackageFilter().checkEnteringPackage(info.packageName)) {
+ return true;
+ }
+ if (mTargetSystemPackages
+ // not explicitly black listed
+ && !MonkeyUtils.getPackageFilter().isPackageInvalid(info.packageName)
+ // is a system app
+ && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean shouldTargetPermission(String pkg, PermissionInfo pi) throws RemoteException {
+ int flags = mPm.getPermissionFlags(pi.name, pkg, UserHandle.myUserId());
+ int fixedPermFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
+ | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
+ return pi.group != null && pi.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS
+ && ((flags & fixedPermFlags) == 0)
+ && isModernPermissionGroup(pi.group);
+ }
+
+ public boolean populatePermissionsMapping() {
+ mPermissionMap = new HashMap<>();
+ try {
+ List<?> pkgInfos = mPm.getInstalledPackages(
+ PackageManager.GET_PERMISSIONS, UserHandle.myUserId()).getList();
+ for (Object o : pkgInfos) {
+ PackageInfo info = (PackageInfo)o;
+ if (!shouldTargetPackage(info)) {
+ continue;
+ }
+ List<PermissionInfo> permissions = new ArrayList<>();
+ if (info.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1) {
+ // skip apps targetting lower API level
+ continue;
+ }
+ if (info.requestedPermissions == null) {
+ continue;
+ }
+ for (String perm : info.requestedPermissions) {
+ PermissionInfo pi = mPm.getPermissionInfo(perm, 0);
+ if (pi != null && shouldTargetPermission(info.packageName, pi)) {
+ permissions.add(pi);
+ }
+ }
+ if (!permissions.isEmpty()) {
+ mPermissionMap.put(info.packageName, permissions);
+ }
+ }
+ } catch (RemoteException re) {
+ System.err.println("** Failed talking with package manager!");
+ return false;
+ }
+ if (!mPermissionMap.isEmpty()) {
+ mTargetedPackages = new ArrayList<>(mPermissionMap.keySet());
+ }
+ return true;
+ }
+
+ public void dump() {
+ System.out.println("// Targeted packages and permissions:");
+ for (Map.Entry<String, List<PermissionInfo>> e : mPermissionMap.entrySet()) {
+ System.out.println(String.format("// + Using %s", e.getKey()));
+ for (PermissionInfo pi : e.getValue()) {
+ String name = pi.name;
+ if (name != null) {
+ if (name.startsWith(PERMISSION_PREFIX)) {
+ name = name.substring(PERMISSION_PREFIX.length());
+ }
+ }
+ String group = pi.group;
+ if (group != null) {
+ if (group.startsWith(PERMISSION_GROUP_PREFIX)) {
+ group = group.substring(PERMISSION_GROUP_PREFIX.length());
+ }
+ }
+ System.out.println(String.format("// Permission: %s [%s]", name, group));
+ }
+ }
+ }
+
+ public MonkeyPermissionEvent generateRandomPermissionEvent(Random random) {
+ String pkg = mTargetedPackages.get(random.nextInt(mTargetedPackages.size()));
+ List<PermissionInfo> infos = mPermissionMap.get(pkg);
+ return new MonkeyPermissionEvent(pkg, infos.get(random.nextInt(infos.size())));
+ }
+}
diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java
index af6a231be..80c7e5066 100644
--- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java
+++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java
@@ -26,7 +26,7 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
-import java.util.ArrayList;
+import java.util.List;
import java.util.Random;
/**
@@ -77,13 +77,14 @@ public class MonkeySourceRandom implements MonkeyEventSource {
public static final int FACTOR_PINCHZOOM = 2;
public static final int FACTOR_TRACKBALL = 3;
public static final int FACTOR_ROTATION = 4;
- public static final int FACTOR_NAV = 5;
- public static final int FACTOR_MAJORNAV = 6;
- public static final int FACTOR_SYSOPS = 7;
- public static final int FACTOR_APPSWITCH = 8;
- public static final int FACTOR_FLIP = 9;
- public static final int FACTOR_ANYTHING = 10;
- public static final int FACTORZ_COUNT = 11; // should be last+1
+ public static final int FACTOR_PERMISSION = 5;
+ public static final int FACTOR_NAV = 6;
+ public static final int FACTOR_MAJORNAV = 7;
+ public static final int FACTOR_SYSOPS = 8;
+ public static final int FACTOR_APPSWITCH = 9;
+ public static final int FACTOR_FLIP = 10;
+ public static final int FACTOR_ANYTHING = 11;
+ public static final int FACTORZ_COUNT = 12; // should be last+1
private static final int GESTURE_TAP = 0;
private static final int GESTURE_DRAG = 1;
@@ -93,12 +94,13 @@ public class MonkeySourceRandom implements MonkeyEventSource {
* values after we read any optional values.
**/
private float[] mFactors = new float[FACTORZ_COUNT];
- private ArrayList<ComponentName> mMainApps;
+ private List<ComponentName> mMainApps;
private int mEventCount = 0; //total number of events generated so far
private MonkeyEventQueue mQ;
private Random mRandom;
private int mVerbose = 0;
private long mThrottle = 0;
+ private MonkeyPermissionUtil mPermissionUtil;
private boolean mKeyboardOpen = false;
@@ -117,8 +119,8 @@ public class MonkeySourceRandom implements MonkeyEventSource {
return KeyEvent.keyCodeFromString(keyName);
}
- public MonkeySourceRandom(Random random, ArrayList<ComponentName> MainApps,
- long throttle, boolean randomizeThrottle) {
+ public MonkeySourceRandom(Random random, List<ComponentName> MainApps,
+ long throttle, boolean randomizeThrottle, boolean permissionTargetSystem) {
// default values for random distributions
// note, these are straight percentages, to match user input (cmd line args)
// but they will be converted to 0..1 values before the main loop runs.
@@ -132,12 +134,16 @@ public class MonkeySourceRandom implements MonkeyEventSource {
mFactors[FACTOR_SYSOPS] = 2.0f;
mFactors[FACTOR_APPSWITCH] = 2.0f;
mFactors[FACTOR_FLIP] = 1.0f;
+ // disbale permission by default
+ mFactors[FACTOR_PERMISSION] = 0.0f;
mFactors[FACTOR_ANYTHING] = 13.0f;
mFactors[FACTOR_PINCHZOOM] = 2.0f;
mRandom = random;
mMainApps = MainApps;
mQ = new MonkeyEventQueue(random, throttle, randomizeThrottle);
+ mPermissionUtil = new MonkeyPermissionUtil();
+ mPermissionUtil.setTargetSystemPackages(permissionTargetSystem);
}
/**
@@ -410,6 +416,9 @@ public class MonkeySourceRandom implements MonkeyEventSource {
} else if (cls < mFactors[FACTOR_ROTATION]) {
generateRotationEvent(mRandom);
return;
+ } else if (cls < mFactors[FACTOR_PERMISSION]) {
+ mQ.add(mPermissionUtil.generateRandomPermissionEvent(mRandom));
+ return;
}
// The remaining event categories are injected as key events
@@ -450,8 +459,15 @@ public class MonkeySourceRandom implements MonkeyEventSource {
}
public boolean validate() {
- //check factors
- return adjustEventFactors();
+ boolean ret = true;
+ // only populate & dump permissions if enabled
+ if (mFactors[FACTOR_PERMISSION] != 0.0f) {
+ ret &= mPermissionUtil.populatePermissionsMapping();
+ if (ret && mVerbose >= 2) {
+ mPermissionUtil.dump();
+ }
+ }
+ return ret & adjustEventFactors();
}
public void setVerbose(int verbose) {
diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyUtils.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyUtils.java
index aa7a666e1..8b447c04d 100644
--- a/cmds/monkey/src/com/android/commands/monkey/MonkeyUtils.java
+++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyUtils.java
@@ -17,6 +17,9 @@
package com.android.commands.monkey;
import java.text.SimpleDateFormat;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
/**
* Misc utilities.
@@ -26,6 +29,7 @@ public abstract class MonkeyUtils {
private static final java.util.Date DATE = new java.util.Date();
private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss.SSS ");
+ private static PackageFilter sFilter;
private MonkeyUtils() {
}
@@ -38,4 +42,72 @@ public abstract class MonkeyUtils {
return DATE_FORMATTER.format(DATE);
}
+ public static PackageFilter getPackageFilter() {
+ if (sFilter == null) {
+ sFilter = new PackageFilter();
+ }
+ return sFilter;
+ }
+
+ public static class PackageFilter {
+ private Set<String> mValidPackages = new HashSet<>();
+ private Set<String> mInvalidPackages = new HashSet<>();
+
+ private PackageFilter() {
+ }
+
+ public void addValidPackages(Set<String> validPackages) {
+ mValidPackages.addAll(validPackages);
+ }
+
+ public void addInvalidPackages(Set<String> invalidPackages) {
+ mInvalidPackages.addAll(invalidPackages);
+ }
+
+ public boolean hasValidPackages() {
+ return mValidPackages.size() > 0;
+ }
+
+ public boolean isPackageValid(String pkg) {
+ return mValidPackages.contains(pkg);
+ }
+
+ public boolean isPackageInvalid(String pkg) {
+ return mInvalidPackages.contains(pkg);
+ }
+
+ /**
+ * Check whether we should run against the given package.
+ *
+ * @param pkg The package name.
+ * @return Returns true if we should run against pkg.
+ */
+ public boolean checkEnteringPackage(String pkg) {
+ if (mInvalidPackages.size() > 0) {
+ if (mInvalidPackages.contains(pkg)) {
+ return false;
+ }
+ } else if (mValidPackages.size() > 0) {
+ if (!mValidPackages.contains(pkg)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void dump() {
+ if (mValidPackages.size() > 0) {
+ Iterator<String> it = mValidPackages.iterator();
+ while (it.hasNext()) {
+ System.out.println(":AllowPackage: " + it.next());
+ }
+ }
+ if (mInvalidPackages.size() > 0) {
+ Iterator<String> it = mInvalidPackages.iterator();
+ while (it.hasNext()) {
+ System.out.println(":DisallowPackage: " + it.next());
+ }
+ }
+ }
+ }
}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
index 4c56933e7..566332b82 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
@@ -132,7 +132,7 @@ public class AnimatedRecyclerView extends Activity {
mAdapter.notifyItemChanged(position);
}
- public void deleteItem(View view) {
+ public void deleteSelectedItems() {
int numItems = mItems.size();
if (numItems > 0) {
for (int i = numItems - 1; i >= 0; --i) {
@@ -156,11 +156,16 @@ public class AnimatedRecyclerView extends Activity {
}
private void removeAtPosition(int position) {
- mItems.remove(position);
- mAdapter.notifyItemRemoved(position);
+ if(position < mItems.size()) {
+ mItems.remove(position);
+ mAdapter.notifyItemRemoved(position);
+ }
}
private void addAtPosition(int position, String text) {
+ if (position > mItems.size()) {
+ position = mItems.size();
+ }
mItems.add(position, text);
mAdapter.mSelected.put(text, Boolean.FALSE);
mAdapter.mExpanded.put(text, Boolean.FALSE);
@@ -169,11 +174,11 @@ public class AnimatedRecyclerView extends Activity {
public void addDeleteItem(View view) {
addItem(view);
- deleteItem(view);
+ deleteSelectedItems();
}
public void deleteAddItem(View view) {
- deleteItem(view);
+ deleteSelectedItems();
addItem(view);
}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
index 8b0b04d05..c1b60f41c 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
@@ -42,7 +42,7 @@ public class MainActivity extends Activity {
GuidedStepFragment.add(getFragmentManager(), mGuidedStepFragment);
}
- private static class StepFragment extends GuidedStepFragment {
+ public static class StepFragment extends GuidedStepFragment {
@Override
public Guidance onCreateGuidance(Bundle savedInstanceState) {
String title = getString(R.string.main_title);
diff --git a/samples/devbytes/telephony/SmsSampleProject/.gitignore b/samples/devbytes/telephony/SmsSampleProject/.gitignore
new file mode 100644
index 000000000..9c4de5825
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.gitignore
@@ -0,0 +1,7 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/.name b/samples/devbytes/telephony/SmsSampleProject/.idea/.name
new file mode 100644
index 000000000..1c26a73bd
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/.name
@@ -0,0 +1 @@
+smssample \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/compiler.xml b/samples/devbytes/telephony/SmsSampleProject/.idea/compiler.xml
new file mode 100644
index 000000000..96cc43efa
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/compiler.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <resourceExtensions />
+ <wildcardResourcePatterns>
+ <entry name="!?*.java" />
+ <entry name="!?*.form" />
+ <entry name="!?*.class" />
+ <entry name="!?*.groovy" />
+ <entry name="!?*.scala" />
+ <entry name="!?*.flex" />
+ <entry name="!?*.kt" />
+ <entry name="!?*.clj" />
+ <entry name="!?*.aj" />
+ </wildcardResourcePatterns>
+ <annotationProcessing>
+ <profile default="true" name="Default" enabled="false">
+ <processorPath useClasspath="true" />
+ </profile>
+ </annotationProcessing>
+ </component>
+</project> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/copyright/profiles_settings.xml b/samples/devbytes/telephony/SmsSampleProject/.idea/copyright/profiles_settings.xml
new file mode 100644
index 000000000..e7bedf337
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+<component name="CopyrightManager">
+ <settings default="" />
+</component> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/gradle.xml b/samples/devbytes/telephony/SmsSampleProject/.idea/gradle.xml
new file mode 100644
index 000000000..1bbc21dc2
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/gradle.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="GradleSettings">
+ <option name="linkedExternalProjectsSettings">
+ <GradleProjectSettings>
+ <option name="distributionType" value="DEFAULT_WRAPPED" />
+ <option name="externalProjectPath" value="$PROJECT_DIR$" />
+ <option name="gradleJvm" value="1.7" />
+ <option name="modules">
+ <set>
+ <option value="$PROJECT_DIR$" />
+ <option value="$PROJECT_DIR$/app" />
+ </set>
+ </option>
+ </GradleProjectSettings>
+ </option>
+ </component>
+</project> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/misc.xml b/samples/devbytes/telephony/SmsSampleProject/.idea/misc.xml
new file mode 100644
index 000000000..e93090500
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/misc.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="EntryPointsManager">
+ <entry_points version="2.0" />
+ </component>
+ <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+ <OptionsSetting value="true" id="Add" />
+ <OptionsSetting value="true" id="Remove" />
+ <OptionsSetting value="true" id="Checkout" />
+ <OptionsSetting value="true" id="Update" />
+ <OptionsSetting value="true" id="Status" />
+ <OptionsSetting value="true" id="Edit" />
+ <ConfirmationsSetting value="0" id="Add" />
+ <ConfirmationsSetting value="0" id="Remove" />
+ </component>
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/build/classes" />
+ </component>
+ <component name="ProjectType">
+ <option name="id" value="Android" />
+ </component>
+</project> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/modules.xml b/samples/devbytes/telephony/SmsSampleProject/.idea/modules.xml
new file mode 100644
index 000000000..3c327c4e8
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/modules.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/SmsSampleProject.iml" filepath="$PROJECT_DIR$/SmsSampleProject.iml" />
+ <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
+ </modules>
+ </component>
+</project> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/.idea/vcs.xml b/samples/devbytes/telephony/SmsSampleProject/.idea/vcs.xml
new file mode 100644
index 000000000..6564d52db
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="" vcs="" />
+ </component>
+</project> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/README b/samples/devbytes/telephony/SmsSampleProject/README
deleted file mode 100644
index a26768cab..000000000
--- a/samples/devbytes/telephony/SmsSampleProject/README
+++ /dev/null
@@ -1,7 +0,0 @@
-This is an Android Studio project:
-http://developer.android.com/sdk/installing/studio.html
-
-To build you should first copy local.properties.sample to
-local.properties and set your SDK path.
-
-Then use Android Studio to import the project.
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle b/samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle
deleted file mode 100644
index d0f9b9766..000000000
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:0.6.+'
- }
-}
-apply plugin: 'android'
-
-repositories {
- mavenCentral()
-}
-
-android {
- compileSdkVersion 19
- buildToolsVersion "18.1.1"
-
- defaultConfig {
- minSdkVersion 10
- targetSdkVersion 19
- }
-}
-
-dependencies {
- compile 'com.android.support:support-v4:18.0.0'
-}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSampleProject.iml b/samples/devbytes/telephony/SmsSampleProject/SmsSampleProject.iml
new file mode 100644
index 000000000..4954b7e80
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSampleProject.iml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="SmsSampleProject" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="java-gradle" name="Java-Gradle">
+ <configuration>
+ <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
+ <option name="BUILDABLE" value="false" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/app/.gitignore b/samples/devbytes/telephony/SmsSampleProject/app/.gitignore
new file mode 100644
index 000000000..796b96d1c
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/samples/devbytes/telephony/SmsSampleProject/app/app.iml b/samples/devbytes/telephony/SmsSampleProject/app/app.iml
new file mode 100644
index 000000000..4951e4356
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/app/app.iml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="SmsSampleProject" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="android-gradle" name="Android-Gradle">
+ <configuration>
+ <option name="GRADLE_PROJECT_PATH" value=":app" />
+ </configuration>
+ </facet>
+ <facet type="android" name="Android">
+ <configuration>
+ <option name="SELECTED_BUILD_VARIANT" value="debug" />
+ <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
+ <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
+ <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
+ <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
+ <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
+ <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
+ <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
+ <option name="ALLOW_USER_CONFIGURATION" value="false" />
+ <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
+ <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
+ <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
+ <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
+ <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.2.0/jars" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/22.2.0/jars" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
+ <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+ </content>
+ <orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="library" exported="" name="support-annotations-22.2.0" level="project" />
+ <orderEntry type="library" exported="" name="support-v4-22.2.0" level="project" />
+ <orderEntry type="library" exported="" name="appcompat-v7-22.2.0" level="project" />
+ </component>
+</module> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/app/build.gradle b/samples/devbytes/telephony/SmsSampleProject/app/build.gradle
new file mode 100644
index 000000000..01b041ea4
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/app/build.gradle
@@ -0,0 +1,25 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 22
+ buildToolsVersion "23.0.0 rc2"
+
+ defaultConfig {
+ applicationId "android.example.com.smssample"
+ minSdkVersion 15
+ targetSdkVersion 22
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:22.2.0'
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/app/proguard-rules.pro b/samples/devbytes/telephony/SmsSampleProject/app/proguard-rules.pro
new file mode 100644
index 000000000..f7d1389ef
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/app/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /usr/local/google/home/omakoto/Android/Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/AndroidManifest.xml
index d6d43799d..d6d43799d 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/AndroidManifest.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/MainActivity.java
index c94939704..832118160 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/MainActivity.java
@@ -16,6 +16,7 @@
package com.example.android.smssample;
+import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
@@ -26,6 +27,7 @@ import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
@@ -147,6 +149,14 @@ public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cu
});
}
}
+ String phoneNumberToast = "Unable to obtain phone number (not default SMS app?)";
+ final TelephonyManager telephony =
+ (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+ try {
+ phoneNumberToast = "Phone number: " + telephony.getLine1Number();
+ } catch (SecurityException e) {
+ }
+ Toast.makeText(this, phoneNumberToast, Toast.LENGTH_SHORT).show();
}
@Override
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/Utils.java
index 00dc7d600..00dc7d600 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/Utils.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java
index 4dcb05533..4dcb05533 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java
index 40f04bb60..40f04bb60 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java
index 181fe45c5..181fe45c5 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java
index 0c4a2cc76..0c4a2cc76 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java
index a02d18813..a02d18813 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/service/MessagingService.java
index af191e8b2..af191e8b2 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/service/MessagingService.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/service/RespondService.java
index d88a762bc..d88a762bc 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/java/com/example/android/smssample/service/RespondService.java
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-hdpi/ic_launcher.png
index 98cfcc5a8..98cfcc5a8 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-mdpi/ic_launcher.png
index 6ccb6e05e..6ccb6e05e 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-xhdpi/ic_launcher.png
index 893b1ee4c..893b1ee4c 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-xxhdpi/ic_launcher.png
index c51e62f69..c51e62f69 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/layout/activity_main.xml
index 3005568e3..3005568e3 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/layout/activity_main.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/menu/main.xml
index e4ee086db..e4ee086db 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/menu/main.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values-v11/styles.xml
index 425c775b3..425c775b3 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values-v11/styles.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values-v19/bools.xml
index 20c993a7c..20c993a7c 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values-v19/bools.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/bools.xml
index 1bded920c..1bded920c 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/bools.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/colors.xml
index 7f13ecd5a..7f13ecd5a 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/colors.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/dimens.xml
index 020e4d3f6..020e4d3f6 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/dimens.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/strings.xml
index c0f18e3de..c0f18e3de 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/strings.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/styles.xml
index 848be93ad..848be93ad 100644
--- a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml
+++ b/samples/devbytes/telephony/SmsSampleProject/app/src/main/res/values/styles.xml
diff --git a/samples/devbytes/telephony/SmsSampleProject/build.gradle b/samples/devbytes/telephony/SmsSampleProject/build.gradle
index 495c5038e..9405f3fd1 100644
--- a/samples/devbytes/telephony/SmsSampleProject/build.gradle
+++ b/samples/devbytes/telephony/SmsSampleProject/build.gradle
@@ -1 +1,19 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.2.3'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/gradle.properties b/samples/devbytes/telephony/SmsSampleProject/gradle.properties
new file mode 100644
index 000000000..1d3591c8a
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/gradle.properties
@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.jar b/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..8c0fb64a8
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.properties b/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..0c71e760d
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/samples/devbytes/telephony/SmsSampleProject/gradlew b/samples/devbytes/telephony/SmsSampleProject/gradlew
new file mode 100755
index 000000000..91a7e269e
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples/devbytes/telephony/SmsSampleProject/gradlew.bat b/samples/devbytes/telephony/SmsSampleProject/gradlew.bat
new file mode 100644
index 000000000..aec99730b
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/samples/devbytes/telephony/SmsSampleProject/local.properties.sample b/samples/devbytes/telephony/SmsSampleProject/local.properties.sample
deleted file mode 100644
index 37317f492..000000000
--- a/samples/devbytes/telephony/SmsSampleProject/local.properties.sample
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file should be copied to local.properties and path set to point
-# to your Android SDK.
-
-# Location of the SDK. This is only used by Gradle.
-# For customization when using a Version Control System, please read the
-# header note.
-sdk.dir=/usr/local/lib/android-sdk \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/settings.gradle b/samples/devbytes/telephony/SmsSampleProject/settings.gradle
index e0867f09e..e7b4def49 100644
--- a/samples/devbytes/telephony/SmsSampleProject/settings.gradle
+++ b/samples/devbytes/telephony/SmsSampleProject/settings.gradle
@@ -1 +1 @@
-include ':SmsSample' \ No newline at end of file
+include ':app'
diff --git a/testrunner/test_defs.xml b/testrunner/test_defs.xml
index 237cec322..07bb9a461 100644
--- a/testrunner/test_defs.xml
+++ b/testrunner/test_defs.xml
@@ -356,6 +356,13 @@ See test_defs.xsd for more information.
coverage_target="framework"
suite="cts" />
+<test name="cts-telecom"
+ build_path="cts/tests/tests/telecom"
+ package="com.android.cts.telecom"
+ runner="android.support.test.runner.AndroidJUnitRunner"
+ coverage_target="framework"
+ suite="cts" />
+
<test name="cts-telephony"
build_path="cts/tests/tests/telephony"
package="com.android.cts.telephony"