From 2ccd4a1f40d371100b94c676c4c39c97829e153b Mon Sep 17 00:00:00 2001 From: twyen Date: Mon, 22 Jan 2018 11:52:16 -0800 Subject: Implement blocking commands Test: Unit tests PiperOrigin-RevId: 182813080 Change-Id: I952f49352fb57c02c4efb9cc4ede84dc7c32c893 --- .../android/dialer/commandline/impl/Blocking.java | 96 ++++++++++++++++++++++ java/com/android/dialer/commandline/impl/Echo.java | 24 ++++-- java/com/android/dialer/commandline/impl/Help.java | 36 ++++---- .../android/dialer/commandline/impl/Version.java | 22 +++-- 4 files changed, 144 insertions(+), 34 deletions(-) create mode 100644 java/com/android/dialer/commandline/impl/Blocking.java (limited to 'java/com/android/dialer/commandline/impl') diff --git a/java/com/android/dialer/commandline/impl/Blocking.java b/java/com/android/dialer/commandline/impl/Blocking.java new file mode 100644 index 000000000..2afd16522 --- /dev/null +++ b/java/com/android/dialer/commandline/impl/Blocking.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2018 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.commandline.impl; + +import android.content.Context; +import android.support.annotation.NonNull; +import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; +import com.android.dialer.commandline.Arguments; +import com.android.dialer.commandline.Command; +import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; +import com.android.dialer.inject.ApplicationContext; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import javax.inject.Inject; + +/** Block or unblock a number. */ +public class Blocking implements Command { + + @NonNull + @Override + public String getShortDescription() { + return "block or unblock numbers"; + } + + @NonNull + @Override + public String getUsage() { + return "blocking block|unblock|isblocked number\n\n" + "number should be e.164 formatted"; + } + + private final Context appContext; + private final ListeningExecutorService executorService; + + @Inject + Blocking( + @ApplicationContext Context context, + @BackgroundExecutor ListeningExecutorService executorService) { + this.appContext = context; + this.executorService = executorService; + } + + @Override + public ListenableFuture run(Arguments args) throws IllegalCommandLineArgumentException { + // AsyncQueryHandler must be created on a thread with looper. + // TODO(a bug): Use blocking version + FilteredNumberAsyncQueryHandler asyncQueryHandler = + new FilteredNumberAsyncQueryHandler(appContext); + return executorService.submit(() -> doInBackground(args, asyncQueryHandler)); + } + + private String doInBackground(Arguments args, FilteredNumberAsyncQueryHandler asyncQueryHandler) { + if (args.getPositionals().isEmpty()) { + return getUsage(); + } + + String command = args.getPositionals().get(0); + + if ("block".equals(command)) { + String number = args.getPositionals().get(1); + asyncQueryHandler.blockNumber((unused) -> {}, number, null); + return "blocked " + number; + } + + if ("unblock".equals(command)) { + String number = args.getPositionals().get(1); + Integer id = asyncQueryHandler.getBlockedIdSynchronous(number, null); + if (id == null) { + return number + " is not blocked"; + } + asyncQueryHandler.unblock((unusedRows, unusedValues) -> {}, id); + return "unblocked " + number; + } + + if ("isblocked".equals(command)) { + String number = args.getPositionals().get(1); + Integer id = asyncQueryHandler.getBlockedIdSynchronous(number, null); + return id == null ? "false" : "true"; + } + + return getUsage(); + } +} diff --git a/java/com/android/dialer/commandline/impl/Echo.java b/java/com/android/dialer/commandline/impl/Echo.java index b5f2f084b..2741a4042 100644 --- a/java/com/android/dialer/commandline/impl/Echo.java +++ b/java/com/android/dialer/commandline/impl/Echo.java @@ -19,8 +19,8 @@ package com.android.dialer.commandline.impl; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; +import com.android.dialer.commandline.Arguments; import com.android.dialer.commandline.Command; -import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import javax.inject.Inject; @@ -28,18 +28,24 @@ import javax.inject.Inject; /** Print arguments. */ public class Echo implements Command { - @VisibleForTesting - @Inject - public Echo() {} - + @NonNull @Override - public ListenableFuture run(ImmutableList args) { - return Futures.immediateFuture(TextUtils.join(" ", args)); + public String getShortDescription() { + return "@hide Print all arguments."; } @NonNull @Override - public String getShortDescription() { - return "@hide Print all arguments."; + public String getUsage() { + return "echo [arguments...]"; + } + + @VisibleForTesting + @Inject + public Echo() {} + + @Override + public ListenableFuture run(Arguments args) throws IllegalCommandLineArgumentException { + return Futures.immediateFuture(TextUtils.join(" ", args.getPositionals())); } } diff --git a/java/com/android/dialer/commandline/impl/Help.java b/java/com/android/dialer/commandline/impl/Help.java index d0e008014..357b10762 100644 --- a/java/com/android/dialer/commandline/impl/Help.java +++ b/java/com/android/dialer/commandline/impl/Help.java @@ -18,13 +18,14 @@ package com.android.dialer.commandline.impl; import android.content.Context; import android.support.annotation.NonNull; +import com.android.dialer.commandline.Arguments; import com.android.dialer.commandline.Command; import com.android.dialer.commandline.CommandLineComponent; import com.android.dialer.inject.ApplicationContext; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import java.util.Locale; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import javax.inject.Inject; @@ -32,6 +33,18 @@ import javax.inject.Inject; /** List available commands */ public class Help implements Command { + @NonNull + @Override + public String getShortDescription() { + return "Print this message"; + } + + @NonNull + @Override + public String getUsage() { + return "help"; + } + private final Context context; @Inject @@ -40,8 +53,8 @@ public class Help implements Command { } @Override - public ListenableFuture run(ImmutableList args) { - boolean showHidden = args.contains("--showHidden"); + public ListenableFuture run(Arguments args) throws IllegalCommandLineArgumentException { + boolean showHidden = args.getFlags().containsKey("showHidden"); StringBuilder stringBuilder = new StringBuilder(); ImmutableMap commands = @@ -59,20 +72,15 @@ public class Help implements Command { if (!showHidden && description.startsWith("@hide ")) { continue; } - stringBuilder - .append("\t") - .append(entry.getKey()) - .append("\t") - .append(description) - .append("\n"); + stringBuilder.append(String.format(Locale.US, " %20s %s\n", entry.getKey(), description)); } return Futures.immediateFuture(stringBuilder.toString()); } - private static String runOrThrow(Command command) { + private static String runOrThrow(Command command) throws IllegalCommandLineArgumentException { try { - return command.run(ImmutableList.of()).get(); + return command.run(Arguments.EMPTY).get(); } catch (InterruptedException e) { Thread.interrupted(); throw new RuntimeException(e); @@ -80,10 +88,4 @@ public class Help implements Command { throw new RuntimeException(e); } } - - @NonNull - @Override - public String getShortDescription() { - return "Print this message"; - } } diff --git a/java/com/android/dialer/commandline/impl/Version.java b/java/com/android/dialer/commandline/impl/Version.java index 5dfad9ae1..70476ea3e 100644 --- a/java/com/android/dialer/commandline/impl/Version.java +++ b/java/com/android/dialer/commandline/impl/Version.java @@ -20,9 +20,9 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.support.annotation.NonNull; +import com.android.dialer.commandline.Arguments; import com.android.dialer.commandline.Command; import com.android.dialer.inject.ApplicationContext; -import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.Locale; @@ -31,6 +31,18 @@ import javax.inject.Inject; /** Print the version name and code. */ public class Version implements Command { + @NonNull + @Override + public String getShortDescription() { + return "Print dialer version"; + } + + @NonNull + @Override + public String getUsage() { + return "version"; + } + private final Context appContext; @Inject @@ -39,7 +51,7 @@ public class Version implements Command { } @Override - public ListenableFuture run(ImmutableList args) { + public ListenableFuture run(Arguments args) throws IllegalCommandLineArgumentException { try { PackageInfo info = appContext.getPackageManager().getPackageInfo(appContext.getPackageName(), 0); @@ -49,10 +61,4 @@ public class Version implements Command { throw new RuntimeException(e); } } - - @NonNull - @Override - public String getShortDescription() { - return "Print dialer version"; - } } -- cgit v1.2.3