Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b84665e8 authored by Yuri Lin's avatar Yuri Lin Committed by Automerger Merge Worker
Browse files

Merge "Write to Zen Log for recording callers & when checking on repeat...

Merge "Write to Zen Log for recording callers & when checking on repeat callers" into tm-qpr-dev am: 403a1356 am: e18b857c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19633079



Change-Id: I5d2b573f77384936a55d332d83454f6239a9fa5d
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents ceaaf3f4 e18b857c
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -5170,7 +5170,8 @@ public class NotificationManagerService extends SystemService {
                    extras,
                    mRankingHelper.findExtractor(ValidateNotificationPeople.class),
                    MATCHES_CALL_FILTER_CONTACTS_TIMEOUT_MS,
                    MATCHES_CALL_FILTER_TIMEOUT_AFFINITY);
                    MATCHES_CALL_FILTER_TIMEOUT_AFFINITY,
                    Binder.getCallingUid());
        }
        @Override
+24 −3
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ public class ZenLog {
    private static final int TYPE_SET_NOTIFICATION_POLICY = 16;
    private static final int TYPE_SET_CONSOLIDATED_ZEN_POLICY = 17;
    private static final int TYPE_MATCHES_CALL_FILTER = 18;
    private static final int TYPE_RECORD_CALLER = 19;
    private static final int TYPE_CHECK_REPEAT_CALLER = 20;

    private static int sNext;
    private static int sSize;
@@ -167,11 +169,28 @@ public class ZenLog {
            + hintsToString(newHints) + ",listeners=" + listenerCount);
    }

    /*
    /**
     * Trace calls to matchesCallFilter with the result of the call and the reason for the result.
     */
    public static void traceMatchesCallFilter(boolean result, String reason) {
        append(TYPE_MATCHES_CALL_FILTER, "result=" + result + ", reason=" + reason);
    public static void traceMatchesCallFilter(boolean result, String reason, int callingUid) {
        append(TYPE_MATCHES_CALL_FILTER, "result=" + result + ", reason=" + reason
                + ", calling uid=" + callingUid);
    }

    /**
     * Trace what information is available about an incoming call when it's recorded
     */
    public static void traceRecordCaller(boolean hasPhone, boolean hasUri) {
        append(TYPE_RECORD_CALLER, "has phone number=" + hasPhone + ", has uri=" + hasUri);
    }

    /**
     * Trace what information was provided about a caller when checking whether it is from a repeat
     * caller
     */
    public static void traceCheckRepeatCaller(boolean found, boolean hasPhone, boolean hasUri) {
        append(TYPE_CHECK_REPEAT_CALLER, "res=" + found + ", given phone number=" + hasPhone
                + ", given uri=" + hasUri);
    }

    private static String subscribeResult(IConditionProvider provider, RemoteException e) {
@@ -198,6 +217,8 @@ public class ZenLog {
            case TYPE_SET_NOTIFICATION_POLICY: return "set_notification_policy";
            case TYPE_SET_CONSOLIDATED_ZEN_POLICY: return "set_consolidated_policy";
            case TYPE_MATCHES_CALL_FILTER: return "matches_call_filter";
            case TYPE_RECORD_CALLER: return "record_caller";
            case TYPE_CHECK_REPEAT_CALLER: return "check_repeat_caller";
            default: return "unknown";
        }
    }
+35 −13
Original line number Diff line number Diff line
@@ -101,23 +101,24 @@ public class ZenModeFiltering {
     */
    public static boolean matchesCallFilter(Context context, int zen, NotificationManager.Policy
            consolidatedPolicy, UserHandle userHandle, Bundle extras,
            ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity) {
            ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity,
            int callingUid) {
        if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
            ZenLog.traceMatchesCallFilter(false, "no interruptions");
            ZenLog.traceMatchesCallFilter(false, "no interruptions", callingUid);
            return false; // nothing gets through
        }
        if (zen == Global.ZEN_MODE_ALARMS) {
            ZenLog.traceMatchesCallFilter(false, "alarms only");
            ZenLog.traceMatchesCallFilter(false, "alarms only", callingUid);
            return false; // not an alarm
        }
        if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
            if (consolidatedPolicy.allowRepeatCallers()
                    && REPEAT_CALLERS.isRepeat(context, extras, null)) {
                ZenLog.traceMatchesCallFilter(true, "repeat caller");
                ZenLog.traceMatchesCallFilter(true, "repeat caller", callingUid);
                return true;
            }
            if (!consolidatedPolicy.allowCalls()) {
                ZenLog.traceMatchesCallFilter(false, "calls not allowed");
                ZenLog.traceMatchesCallFilter(false, "calls not allowed", callingUid);
                return false; // no other calls get through
            }
            if (validator != null) {
@@ -125,11 +126,12 @@ public class ZenModeFiltering {
                        contactsTimeoutMs, timeoutAffinity);
                boolean match =
                        audienceMatches(consolidatedPolicy.allowCallsFrom(), contactAffinity);
                ZenLog.traceMatchesCallFilter(match, "contact affinity " + contactAffinity);
                ZenLog.traceMatchesCallFilter(match, "contact affinity " + contactAffinity,
                        callingUid);
                return match;
            }
        }
        ZenLog.traceMatchesCallFilter(true, "no restrictions");
        ZenLog.traceMatchesCallFilter(true, "no restrictions", callingUid);
        return true;
    }

@@ -419,6 +421,7 @@ public class ZenModeFiltering {

        private synchronized void recordCallers(String[] people, ArraySet<String> phoneNumbers,
                long now) {
            boolean recorded = false, hasTel = false, hasOther = false;
            for (int i = 0; i < people.length; i++) {
                String person = people[i];
                if (person == null) continue;
@@ -427,10 +430,16 @@ public class ZenModeFiltering {
                    // while ideally we should not need to decode this, sometimes we have seen tel
                    // numbers given in an encoded format
                    String tel = Uri.decode(uri.getSchemeSpecificPart());
                    if (tel != null) mTelCalls.put(tel, now);
                    if (tel != null) {
                        mTelCalls.put(tel, now);
                        recorded = true;
                        hasTel = true;
                    }
                } else {
                    // for non-tel calls, store the entire string, uri-component and all
                    mOtherCalls.put(person, now);
                    recorded = true;
                    hasOther = true;
                }
            }

@@ -438,9 +447,16 @@ public class ZenModeFiltering {
            // provided; these are in the format of just a phone number string
            if (phoneNumbers != null) {
                for (String num : phoneNumbers) {
                    if (num != null) mTelCalls.put(num, now);
                    if (num != null) {
                        mTelCalls.put(num, now);
                        recorded = true;
                        hasTel = true;
                    }
                }
            }
            if (recorded) {
                ZenLog.traceRecordCaller(hasTel, hasOther);
            }
        }

        // helper function to check mTelCalls array for a number, and also check its decoded
@@ -468,6 +484,8 @@ public class ZenModeFiltering {
        // previously recorded phone call.
        private synchronized boolean checkCallers(Context context, String[] people,
                ArraySet<String> phoneNumbers) {
            boolean found = false, checkedTel = false, checkedOther = false;

            // get the default country code for checking telephone numbers
            final String defaultCountryCode =
                    context.getSystemService(TelephonyManager.class).getNetworkCountryIso();
@@ -477,12 +495,14 @@ public class ZenModeFiltering {
                final Uri uri = Uri.parse(person);
                if ("tel".equals(uri.getScheme())) {
                    String number = uri.getSchemeSpecificPart();
                    checkedTel = true;
                    if (checkForNumber(number, defaultCountryCode)) {
                        return true;
                        found = true;
                    }
                } else {
                    checkedOther = true;
                    if (mOtherCalls.containsKey(person)) {
                        return true;
                        found = true;
                    }
                }
            }
@@ -490,14 +510,16 @@ public class ZenModeFiltering {
            // also check any passed-in phone numbers
            if (phoneNumbers != null) {
                for (String num : phoneNumbers) {
                    checkedTel = true;
                    if (checkForNumber(num, defaultCountryCode)) {
                        return true;
                        found = true;
                    }
                }
            }

            // no matches
            return false;
            ZenLog.traceCheckRepeatCaller(found, checkedTel, checkedOther);
            return found;
        }
    }

+4 −2
Original line number Diff line number Diff line
@@ -177,10 +177,12 @@ public class ZenModeHelper {
    }

    public boolean matchesCallFilter(UserHandle userHandle, Bundle extras,
            ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity) {
            ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity,
            int callingUid) {
        synchronized (mConfig) {
            return ZenModeFiltering.matchesCallFilter(mContext, mZenMode, mConsolidatedPolicy,
                    userHandle, extras, validator, contactsTimeoutMs, timeoutAffinity);
                    userHandle, extras, validator, contactsTimeoutMs, timeoutAffinity,
                    callingUid);
        }
    }

+15 −15
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distriZenbuted on an "AS IS" BASIS,
 * 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.
@@ -397,10 +397,10 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
        Bundle inputWrong = makeExtrasBundleWithPeople(new String[]{"mailto:nope"});
        assertTrue(ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                policy, UserHandle.SYSTEM,
                inputMatches, null, 0, 0));
                inputMatches, null, 0, 0, 0));
        assertFalse(ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                policy, UserHandle.SYSTEM,
                inputWrong, null, 0, 0));
                inputWrong, null, 0, 0, 0));
    }

    @Test
@@ -428,19 +428,19 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
        assertTrue("identical numbers should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                policy, UserHandle.SYSTEM,
                identical, null, 0, 0));
                identical, null, 0, 0, 0));
        assertTrue("equivalent but non-identical numbers should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                policy, UserHandle.SYSTEM,
                same, null, 0, 0));
                same, null, 0, 0, 0));
        assertFalse("non-equivalent numbers should not match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                policy, UserHandle.SYSTEM,
                different, null, 0, 0));
                different, null, 0, 0, 0));
        assertFalse("non-tel strings should not match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                policy, UserHandle.SYSTEM,
                garbage, null, 0, 0));
                garbage, null, 0, 0, 0));
    }

    @Test
@@ -469,23 +469,23 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
        assertTrue("same number 1 should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        same1, null, 0, 0));
                        same1, null, 0, 0, 0));
        assertTrue("same number 2 should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        same2, null, 0, 0));
                        same2, null, 0, 0, 0));
        assertTrue("same number 3 should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        same3, null, 0, 0));
                        same3, null, 0, 0, 0));
        assertFalse("different number 1 should not match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        different1, null, 0, 0));
                        different1, null, 0, 0, 0));
        assertFalse("different number 2 should not match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        different2, null, 0, 0));
                        different2, null, 0, 0, 0));
    }

    @Test
@@ -516,14 +516,14 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
        assertTrue("contact number 1 should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        tel1, null, 0, 0));
                        tel1, null, 0, 0, 0));
        assertTrue("contact number 2 should match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        tel2, null, 0, 0));
                        tel2, null, 0, 0, 0));
        assertFalse("different number should not match",
                ZenModeFiltering.matchesCallFilter(mContext, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                        policy, UserHandle.SYSTEM,
                        different, null, 0, 0));
                        different, null, 0, 0, 0));
    }
}