/* * Copyright (C) 2016 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.dialer.common; import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import javax.annotation.CheckReturnValue; /** Assertions which will result in program termination unless disabled by flags. */ public class Assert { private static boolean areThreadAssertsEnabled = true; public static void setAreThreadAssertsEnabled(boolean areThreadAssertsEnabled) { Assert.areThreadAssertsEnabled = areThreadAssertsEnabled; } /** * Called when a truly exceptional case occurs. * * @throws AssertionError * @deprecated Use throw Assert.create*FailException() instead. */ @Deprecated public static void fail() { throw new AssertionError("Fail"); } /** * Called when a truly exceptional case occurs. * * @param reason the optional reason to supply as the exception message * @throws AssertionError * @deprecated Use throw Assert.create*FailException() instead. */ @Deprecated public static void fail(String reason) { throw new AssertionError(reason); } @CheckReturnValue public static AssertionError createAssertionFailException(String msg) { return new AssertionError(msg); } @CheckReturnValue public static AssertionError createAssertionFailException(String msg, Throwable reason) { return new AssertionError(msg, reason); } @CheckReturnValue public static UnsupportedOperationException createUnsupportedOperationFailException() { return new UnsupportedOperationException(); } @CheckReturnValue public static UnsupportedOperationException createUnsupportedOperationFailException(String msg) { return new UnsupportedOperationException(msg); } @CheckReturnValue public static IllegalStateException createIllegalStateFailException() { return new IllegalStateException(); } @CheckReturnValue public static IllegalStateException createIllegalStateFailException(String msg) { return new IllegalStateException(msg); } /** * Ensures the truth of an expression involving one or more parameters to the calling method. * * @param expression a boolean expression * @throws IllegalArgumentException if {@code expression} is false */ public static void checkArgument(boolean expression) { checkArgument(expression, null); } /** * Ensures the truth of an expression involving one or more parameters to the calling method. * * @param expression a boolean expression * @param messageTemplate the message to log, possible with format arguments. * @param args optional arguments to be used in the formatted string. * @throws IllegalArgumentException if {@code expression} is false */ public static void checkArgument( boolean expression, @Nullable String messageTemplate, Object... args) { if (!expression) { throw new IllegalArgumentException(format(messageTemplate, args)); } } /** * Ensures the truth of an expression involving the state of the calling instance, but not * involving any parameters to the calling method. * * @param expression a boolean expression * @throws IllegalStateException if {@code expression} is false */ public static void checkState(boolean expression) { checkState(expression, null); } /** * Ensures the truth of an expression involving the state of the calling instance, but not * involving any parameters to the calling method. * * @param expression a boolean expression * @param messageTemplate the message to log, possible with format arguments. * @param args optional arguments to be used in the formatted string. * @throws IllegalStateException if {@code expression} is false */ public static void checkState( boolean expression, @Nullable String messageTemplate, Object... args) { if (!expression) { throw new IllegalStateException(format(messageTemplate, args)); } } /** * Ensures that an object reference passed as a parameter to the calling method is not null. * * @param reference an object reference * @return the non-null reference that was validated * @throws NullPointerException if {@code reference} is null */ @NonNull public static T isNotNull(@Nullable T reference) { return isNotNull(reference, null); } /** * Ensures that an object reference passed as a parameter to the calling method is not null. * * @param reference an object reference * @param messageTemplate the message to log, possible with format arguments. * @param args optional arguments to be used in the formatted string. * @return the non-null reference that was validated * @throws NullPointerException if {@code reference} is null */ @NonNull public static T isNotNull( @Nullable T reference, @Nullable String messageTemplate, Object... args) { if (reference == null) { throw new NullPointerException(format(messageTemplate, args)); } return reference; } /** * Ensures that the current thread is the main thread. * * @throws IllegalStateException if called on a background thread */ public static void isMainThread() { isMainThread(null); } /** * Ensures that the current thread is the main thread. * * @param messageTemplate the message to log, possible with format arguments. * @param args optional arguments to be used in the formatted string. * @throws IllegalStateException if called on a background thread */ public static void isMainThread(@Nullable String messageTemplate, Object... args) { if (!areThreadAssertsEnabled) { return; } checkState(Looper.getMainLooper().equals(Looper.myLooper()), messageTemplate, args); } /** * Ensures that the current thread is a worker thread. * * @throws IllegalStateException if called on the main thread */ public static void isWorkerThread() { isWorkerThread(null); } /** * Ensures that the current thread is a worker thread. * * @param messageTemplate the message to log, possible with format arguments. * @param args optional arguments to be used in the formatted string. * @throws IllegalStateException if called on the main thread */ public static void isWorkerThread(@Nullable String messageTemplate, Object... args) { if (!areThreadAssertsEnabled) { return; } checkState(!Looper.getMainLooper().equals(Looper.myLooper()), messageTemplate, args); } private static String format(@Nullable String messageTemplate, Object... args) { if (messageTemplate == null) { return null; } return String.format(messageTemplate, args); } }