diff options
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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differnew file mode 100644 index 000000000..8c0fb64a8 --- /dev/null +++ b/samples/devbytes/telephony/SmsSampleProject/gradle/wrapper/gradle-wrapper.jar 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" |