Merge "[DO NOT MERGE] qt-qpr1-sysui-dev @ build 5814791" into qt-qpr1-dev

This commit is contained in:
TreeHugger Robot
2019-08-21 21:19:19 +00:00
committed by Android (Google) Code Review
82 changed files with 434 additions and 244 deletions

View File

@@ -95,7 +95,6 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>

View File

@@ -95,7 +95,6 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎Voicemail messages‎‏‎‎‏‎"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎Wi-Fi calling‎‏‎‎‏‎"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎SIM status‎‏‎‎‏‎"</string>
<string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎High priority SIM status‎‏‎‎‏‎"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎Peer requested TTY Mode FULL‎‏‎‎‏‎"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎Peer requested TTY Mode HCO‎‏‎‎‏‎"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎Peer requested TTY Mode VCO‎‏‎‎‏‎"</string>

View File

@@ -16,6 +16,6 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settingslib.helputils">
package="com.android.settingslib.widget">
</manifest>

View File

@@ -33,11 +33,11 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import com.android.settingslib.widget.R;
import java.net.URISyntaxException;
import java.util.Locale;
import com.android.settingslib.helputils.R;
/**
* Functions to easily prepare contextual help menu option items with an intent that opens up the
* browser to a particular URL, while taking into account the preferred language and app version.

View File

@@ -16,6 +16,6 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settingslib.restrictedlockutils">
package="com.android.settingslib.widget">
</manifest>

View File

@@ -71,10 +71,6 @@ android_library {
"telephony-common",
],
aaptflags: [
"--extra-packages",
"com.android.keyguard",
],
kotlincflags: ["-Xjvm-default=enable"],
plugins: ["dagger2-compiler-2.19"],
@@ -132,7 +128,7 @@ android_library {
kotlincflags: ["-Xjvm-default=enable"],
aaptflags: [
"--extra-packages",
"com.android.keyguard:com.android.systemui",
"com.android.systemui",
],
plugins: ["dagger2-compiler-2.19"],
}
@@ -160,10 +156,6 @@ android_app {
kotlincflags: ["-Xjvm-default=enable"],
dxflags: ["--multi-dex"],
aaptflags: [
"--extra-packages",
"com.android.keyguard",
],
required: ["privapp_whitelist_com.android.systemui"],
}
@@ -180,10 +172,6 @@ android_app {
privileged: true,
dxflags: ["--multi-dex"],
aaptflags: [
"--extra-packages",
"com.android.keyguard",
],
optimize: {
proguard_flags_files: ["proguard.flags", "legacy/recents/proguard.flags"],
},

View File

@@ -273,7 +273,6 @@
<!-- SystemUI Services: The classes of the stuff to start. -->
<string-array name="config_systemUIServiceComponents" translatable="false">
<item>com.android.systemui.Dependency$DependencyCreator</item>
<item>com.android.systemui.util.NotificationChannels</item>
<item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item>
<item>com.android.systemui.keyguard.KeyguardViewMediator</item>
@@ -304,7 +303,6 @@
<!-- SystemUI Services (per user): The classes of the stuff to start for each user. This is a subset of the config_systemUIServiceComponents -->
<string-array name="config_systemUIServiceComponentsPerUser" translatable="false">
<item>com.android.systemui.Dependency$DependencyCreator</item>
<item>com.android.systemui.util.NotificationChannels</item>
</string-array>

View File

@@ -24,6 +24,8 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.android.systemui.R;
import java.util.Locale;
public class CarrierText extends TextView {

View File

@@ -44,6 +44,7 @@ import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import java.util.ArrayList;

View File

@@ -21,6 +21,8 @@ import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.android.systemui.R;
public class EmergencyCarrierArea extends AlphaOptimizedLinearLayout {
private CarrierText mCarrierText;

View File

@@ -33,6 +33,7 @@ import android.widget.LinearLayout;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternChecker;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R;
import java.util.Arrays;

View File

@@ -23,6 +23,8 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
import com.android.systemui.R;
/**
* Replaces fancy colons with regular colons. Only works on TextViews.
*/

View File

@@ -30,6 +30,7 @@ import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.colorextraction.ColorExtractor.OnColorsChangedListener;
import com.android.keyguard.clock.ClockManager;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;

View File

@@ -35,6 +35,7 @@ import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.phone.NavigationBarView;
import com.android.systemui.util.InjectionInflationController;

View File

@@ -32,6 +32,8 @@ import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import com.android.systemui.R;
/***
* This button is used by the device with embedded SIM card to disable current carrier to unlock
* the device with no cellular service.

View File

@@ -35,6 +35,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import java.io.File;

View File

@@ -31,6 +31,7 @@ import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.ConfigurationController;
import java.lang.ref.WeakReference;

View File

@@ -24,6 +24,7 @@ import android.view.animation.AnimationUtils;
import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;
import com.android.systemui.R;
/**
* Displays a PIN pad for unlocking.

View File

@@ -37,6 +37,7 @@ import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import com.android.internal.widget.TextViewInputDisabler;
import com.android.systemui.R;
import java.util.List;
/**

View File

@@ -42,6 +42,7 @@ import com.android.internal.widget.LockPatternView;
import com.android.settingslib.animation.AppearAnimationCreator;
import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;
import com.android.systemui.R;
import java.util.List;

View File

@@ -23,6 +23,8 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import com.android.systemui.R;
/**
* A Pin based Keyguard input view
*/

View File

@@ -45,6 +45,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.util.InjectionInflationController;

View File

@@ -32,6 +32,7 @@ import android.widget.FrameLayout;
import android.widget.ViewFlipper;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R;
/**
* Subclass of the current view flipper that allows us to overload dispatchTouchEvent() so

View File

@@ -41,6 +41,7 @@ import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.PhoneConstants;
import com.android.systemui.R;
/**
* Displays a PIN pad for unlocking.

View File

@@ -40,6 +40,7 @@ import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.PhoneConstants;
import com.android.systemui.R;
/**

View File

@@ -40,6 +40,7 @@ import androidx.core.graphics.ColorUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.ConfigurationController;
import java.io.FileDescriptor;

View File

@@ -94,6 +94,7 @@ import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.R;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.statusbar.phone.KeyguardBypassController;

View File

@@ -29,6 +29,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R;
public class NumPadKey extends ViewGroup {
// list of "ABC", etc per digit, starting with '0'

View File

@@ -42,6 +42,8 @@ import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.EditText;
import com.android.systemui.R;
import java.util.ArrayList;
import java.util.Stack;

View File

@@ -26,7 +26,7 @@ import android.view.View;
import android.widget.TextClock;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.R;
import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ClockPlugin;

View File

@@ -26,7 +26,7 @@ import android.view.View;
import android.widget.TextClock;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.R;
import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ClockPlugin;

View File

@@ -24,7 +24,7 @@ import android.util.MathUtils;
import android.view.View;
import android.widget.FrameLayout;
import com.android.keyguard.R;
import com.android.systemui.R;
/**
* Positions clock faces (analog, digital, typographic) and handles pixel shifting

View File

@@ -26,7 +26,7 @@ import android.view.View;
import android.widget.TextView;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.R;
import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ClockPlugin;

View File

@@ -21,7 +21,7 @@ import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android.keyguard.R;
import com.android.systemui.R;
import java.text.SimpleDateFormat;
import java.util.Calendar;

View File

@@ -20,6 +20,7 @@ import android.content.res.Resources;
import android.util.MathUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
/**
* Computes preferred position of clock by considering height of status bar and lock icon.
@@ -40,10 +41,10 @@ class SmallClockPosition {
private float mDarkAmount;
SmallClockPosition(Resources res) {
this(res.getDimensionPixelSize(com.android.keyguard.R.dimen.status_bar_height),
res.getDimensionPixelSize(com.android.keyguard.R.dimen.keyguard_lock_padding),
res.getDimensionPixelSize(com.android.keyguard.R.dimen.keyguard_lock_height),
res.getDimensionPixelSize(com.android.keyguard.R.dimen.burn_in_prevention_offset_y)
this(res.getDimensionPixelSize(R.dimen.status_bar_height),
res.getDimensionPixelSize(R.dimen.keyguard_lock_padding),
res.getDimensionPixelSize(R.dimen.keyguard_lock_height),
res.getDimensionPixelSize(R.dimen.burn_in_prevention_offset_y)
);
}

View File

@@ -16,7 +16,6 @@ package com.android.systemui;
import android.annotation.Nullable;
import android.app.INotificationManager;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.SensorPrivacyManager;
import android.hardware.display.NightDisplayListener;
@@ -114,7 +113,6 @@ import com.android.systemui.util.leak.LeakReporter;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.function.Consumer;
import javax.inject.Inject;
@@ -138,9 +136,7 @@ import dagger.Subcomponent;
* they have no clients they should not have any registered resources like bound
* services, registered receivers, etc.
*/
public class Dependency extends SystemUI {
private static final String TAG = "Dependency";
public class Dependency {
/**
* Key for getting a background Looper for background work.
*/
@@ -305,8 +301,20 @@ public class Dependency extends SystemUI {
public Dependency() {
}
@Override
public void start() {
/**
* Initialize Depenency.
*/
public static void initDependencies(SystemUIRootComponent rootComponent) {
if (sDependency != null) {
return;
}
sDependency = new Dependency();
rootComponent.createDependency().createSystemUI(sDependency);
sDependency.start();
}
protected void start() {
// TODO: Think about ways to push these creation rules out of Dependency to cut down
// on imports.
mProviders.put(TIME_TICK_HANDLER, mTimeTickHandler::get);
@@ -486,10 +494,14 @@ public class Dependency extends SystemUI {
sDependency = this;
}
@Override
public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
super.dump(fd, pw, args);
static void staticDump(FileDescriptor fd, PrintWriter pw, String[] args) {
sDependency.dump(fd, pw, args);
}
/**
* {@see SystemUI.dump}
*/
public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
// Make sure that the DumpController gets added to mDependencies, as they are only added
// with Dependency#get.
getDependency(DumpController.class);
@@ -509,9 +521,11 @@ public class Dependency extends SystemUI {
.forEach(o -> ((Dumpable) o).dump(fd, pw, args));
}
@Override
protected static void staticOnConfigurationChanged(Configuration newConfig) {
sDependency.onConfigurationChanged(newConfig);
}
protected synchronized void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDependencies.values().stream().filter(obj -> obj instanceof ConfigurationChangedReceiver)
.forEach(o -> ((ConfigurationChangedReceiver) o).onConfigurationChanged(newConfig));
}
@@ -564,20 +578,6 @@ public class Dependency extends SystemUI {
}
}
/**
* Used in separate processes (like tuner settings) to init the dependencies.
*/
public static void initDependencies(Context context) {
if (sDependency != null) return;
Dependency d = new Dependency();
SystemUIFactory.getInstance().getRootComponent()
.createDependency()
.createSystemUI(d);
d.mContext = context;
d.mComponents = new HashMap<>();
d.start();
}
/**
* Used in separate process teardown to ensure the context isn't leaked.
*
@@ -629,15 +629,4 @@ public class Dependency extends SystemUI {
public interface DependencyInjector {
void createSystemUI(Dependency dependency);
}
public static class DependencyCreator implements Injector {
@Override
public SystemUI apply(Context context) {
Dependency dependency = new Dependency();
SystemUIFactory.getInstance().getRootComponent()
.createDependency()
.createSystemUI(dependency);
return dependency;
}
}
}

View File

@@ -75,7 +75,7 @@ public final class ForegroundServicesDialog extends AlertActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Dependency.initDependencies(getApplicationContext());
Dependency.initDependencies(SystemUIFactory.getInstance().getRootComponent());
mMetricsLogger = Dependency.get(MetricsLogger.class);

View File

@@ -62,19 +62,28 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
private final Map<Class<?>, Object> mComponents = new HashMap<>();
private ContextAvailableCallback mContextAvailableCallback;
public SystemUIApplication() {
super();
Log.v(TAG, "SystemUIApplication constructed.");
}
@Override
public void onCreate() {
super.onCreate();
Log.v(TAG, "SystemUIApplication created.");
// This line is used to setup Dagger's dependency injection and should be kept at the
// top of this method.
TimingsTraceLog log = new TimingsTraceLog("SystemUIBootTiming",
Trace.TRACE_TAG_APP);
log.traceBegin("DependencyInjection");
mContextAvailableCallback.onContextAvailable(this);
log.traceEnd();
// Set the application theme that is inherited by all services. Note that setting the
// application theme in the manifest does only work for activities. Keep this in sync with
// the theme set there.
setTheme(R.style.Theme_SystemUI);
if (Process.myUserHandle().equals(UserHandle.SYSTEM)) {
IntentFilter bootCompletedFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
bootCompletedFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
@@ -138,7 +147,7 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
/**
* Ensures that all the Secondary user SystemUI services are running. If they are already
* running, this is a no-op. This is needed to conditinally start all the services, as we only
* running, this is a no-op. This is needed to conditionally start all the services, as we only
* need to have it in the main process.
* <p>This method must only be called from the main thread.</p>
*/
@@ -159,7 +168,9 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
// see ActivityManagerService.finishBooting()
if ("1".equals(SystemProperties.get("sys.boot_completed"))) {
mBootCompleted = true;
if (DEBUG) Log.v(TAG, "BOOT_COMPLETED was already sent");
if (DEBUG) {
Log.v(TAG, "BOOT_COMPLETED was already sent");
}
}
}
@@ -273,6 +284,7 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (mServicesStarted) {
Dependency.staticOnConfigurationChanged(newConfig);
int len = mServices.length;
for (int i = 0; i < len; i++) {
if (mServices[i] != null) {

View File

@@ -0,0 +1,77 @@
/*
* Copyright (C) 2019 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.systemui;
import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME;
import android.content.Context;
import androidx.annotation.Nullable;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManagerImpl;
import com.android.systemui.power.EnhancedEstimates;
import com.android.systemui.power.EnhancedEstimatesImpl;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
/**
* A dagger module for injecting default implementations of components of System UI that may be
* overridden by the System UI implementation.
*/
@Module
abstract class SystemUIDefaultModule {
@Singleton
@Provides
@Named(LEAK_REPORT_EMAIL_NAME)
@Nullable
static String provideLeakReportEmail() {
return null;
}
@Binds
abstract EnhancedEstimates bindEnhancedEstimates(EnhancedEstimatesImpl enhancedEstimates);
@Binds
abstract NotificationLockscreenUserManager bindNotificationLockscreenUserManager(
NotificationLockscreenUserManagerImpl notificationLockscreenUserManager);
@Binds
abstract DockManager bindDockManager(DockManagerImpl dockManager);
@Binds
abstract NotificationData.KeyguardEnvironment bindKeyguardEnvironment(
KeyguardEnvironmentImpl keyguardEnvironment);
@Singleton
@Provides
static ShadeController provideShadeController(Context context) {
return SysUiServiceProvider.getComponent(context, StatusBar.class);
}
}

View File

@@ -16,13 +16,8 @@
package com.android.systemui;
import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME;
import android.annotation.Nullable;
import android.app.AlarmManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
@@ -33,59 +28,40 @@ import com.android.internal.util.function.TriConsumer;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.power.EnhancedEstimates;
import com.android.systemui.power.EnhancedEstimatesImpl;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ScrimState;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.util.AsyncSensorManager;
import com.android.systemui.volume.VolumeDialogComponent;
import java.util.function.Consumer;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
/**
* Class factory to provide customizable SystemUI components.
*/
@Module
public class SystemUIFactory {
private static final String TAG = "SystemUIFactory";
static SystemUIFactory mFactory;
private SystemUIRootComponent mRootComponent;
protected SystemUIRootComponent mRootComponent;
public static <T extends SystemUIFactory> T getInstance() {
return (T) mFactory;
@@ -110,9 +86,16 @@ public class SystemUIFactory {
public SystemUIFactory() {}
protected void init(Context context) {
mRootComponent = DaggerSystemUIRootComponent.builder()
.systemUIFactory(this)
private void init(Context context) {
mRootComponent = buildSystemUIRootComponent(context);
// Every other part of our codebase currently relies on Dependency, so we
// really need to ensure the Dependency gets initialized early on.
Dependency.initDependencies(mRootComponent);
}
protected SystemUIRootComponent buildSystemUIRootComponent(Context context) {
return DaggerSystemUIRootComponent.builder()
.dependencyProvider(new com.android.systemui.DependencyProvider())
.contextHolder(new ContextHolder(context))
.build();
@@ -128,14 +111,15 @@ public class SystemUIFactory {
}
public KeyguardBouncer createKeyguardBouncer(Context context, ViewMediatorCallback callback,
LockPatternUtils lockPatternUtils, ViewGroup container,
LockPatternUtils lockPatternUtils, ViewGroup container,
DismissCallbackRegistry dismissCallbackRegistry,
KeyguardBouncer.BouncerExpansionCallback expansionCallback,
FalsingManager falsingManager) {
FalsingManager falsingManager, KeyguardBypassController bypassController) {
return new KeyguardBouncer(context, callback, lockPatternUtils, container,
dismissCallbackRegistry, falsingManager,
expansionCallback, UnlockMethodCache.getInstance(context),
KeyguardUpdateMonitor.getInstance(context), new Handler(Looper.getMainLooper()));
KeyguardUpdateMonitor.getInstance(context), bypassController,
new Handler(Looper.getMainLooper()));
}
public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
@@ -166,93 +150,8 @@ public class SystemUIFactory {
return new VolumeDialogComponent(systemUi, context);
}
@Singleton
@Provides
public NotificationData.KeyguardEnvironment provideKeyguardEnvironment(Context context) {
return new KeyguardEnvironmentImpl();
}
@Singleton
@Provides
public NotificationLockscreenUserManager provideNotificationLockscreenUserManager(
Context context) {
return new NotificationLockscreenUserManagerImpl(context);
}
@Singleton
@Provides
public AssistManager provideAssistManager(DeviceProvisionedController controller,
Context context) {
return new AssistManager(controller, context);
}
@Singleton
@Provides
@Nullable
public DockManager provideDockManager(Context context) {
return null;
}
@Singleton
@Provides
public NotificationEntryManager provideNotificationEntryManager(Context context) {
return new NotificationEntryManager(context);
}
@Singleton
@Provides
public EnhancedEstimates provideEnhancedEstimates(Context context) {
return new EnhancedEstimatesImpl();
}
@Singleton
@Provides
@Named(LEAK_REPORT_EMAIL_NAME)
@Nullable
public String provideLeakReportEmail() {
return null;
}
@Singleton
@Provides
@Nullable
public KeyguardLiftController provideKeyguardLiftController(Context context,
StatusBarStateController statusBarStateController,
AsyncSensorManager asyncSensorManager) {
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
return null;
}
return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager);
}
@Singleton
@Provides
public NotificationListener provideNotificationListener(Context context) {
return new NotificationListener(context);
}
@Singleton
@Provides
public NotificationInterruptionStateProvider provideNotificationInterruptionStateProvider(
Context context) {
return new NotificationInterruptionStateProvider(context);
}
@Singleton
@Provides
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
public boolean provideAllowNotificationLongPress() {
return true;
}
@Singleton
@Provides
public ShadeController provideShadeController(Context context) {
return SysUiServiceProvider.getComponent(context, StatusBar.class);
}
@Module
protected static class ContextHolder {
public static class ContextHolder {
private Context mContext;
public ContextHolder(Context context) {

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2019 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.systemui;
import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.PackageManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.util.AsyncSensorManager;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
/**
* A dagger module for injecting components of System UI that are not overridden by the System UI
* implementation.
*/
@Module
public abstract class SystemUIModule {
@Singleton
@Provides
@Nullable
static KeyguardLiftController provideKeyguardLiftController(Context context,
StatusBarStateController statusBarStateController,
AsyncSensorManager asyncSensorManager) {
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
return null;
}
return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager);
}
@Singleton
@Provides
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
static boolean provideAllowNotificationLongPress() {
return true;
}
}

View File

@@ -16,11 +16,14 @@
package com.android.systemui;
import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.util.leak.GarbageMonitor;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Component;
@@ -29,8 +32,13 @@ import dagger.Component;
* Root component for Dagger injection.
*/
@Singleton
@Component(modules = {SystemUIFactory.class, DependencyProvider.class, DependencyBinder.class,
ServiceBinder.class, SystemUIFactory.ContextHolder.class})
@Component(modules = {
DependencyProvider.class,
DependencyBinder.class,
ServiceBinder.class,
SystemUIFactory.ContextHolder.class,
SystemUIModule.class,
SystemUIDefaultModule.class})
public interface SystemUIRootComponent {
/**
* Main dependency providing module.
@@ -61,6 +69,12 @@ public interface SystemUIRootComponent {
@Singleton
GarbageMonitor createGarbageMonitor();
/**
* Whether notification long press is allowed.
*/
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
boolean allowNotificationLongPressName();
/**
* Injects into the supplied argument.
*/

View File

@@ -38,25 +38,8 @@ public class SystemUISecondaryUserService extends Service {
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
SystemUI[] services = ((SystemUIApplication) getApplication()).getServices();
if (args == null || args.length == 0) {
for (SystemUI ui: services) {
if (ui != null) {
pw.println("dumping service: " + ui.getClass().getName());
ui.dump(fd, pw, args);
}
}
} else {
String svc = args[0];
for (SystemUI ui: services) {
if (ui != null) {
String name = ui.getClass().getName();
if (name.endsWith(svc)) {
ui.dump(fd, pw, args);
}
}
}
}
SystemUIService.dumpServices(
((SystemUIApplication) getApplication()).getServices(), fd, pw, args);
}
}

View File

@@ -66,8 +66,14 @@ public class SystemUIService extends Service {
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
SystemUI[] services = ((SystemUIApplication) getApplication()).getServices();
dumpServices(((SystemUIApplication) getApplication()).getServices(), fd, pw, args);
}
static void dumpServices(
SystemUI[] services, FileDescriptor fd, PrintWriter pw, String[] args) {
if (args == null || args.length == 0) {
pw.println("dumping service: " + Dependency.class.getName());
Dependency.staticDump(fd, pw, args);
for (SystemUI ui: services) {
pw.println("dumping service: " + ui.getClass().getName());
ui.dump(fd, pw, args);
@@ -78,6 +84,9 @@ public class SystemUIService extends Service {
}
} else {
String svc = args[0].toLowerCase();
if (Dependency.class.getName().endsWith(svc)) {
Dependency.staticDump(fd, pw, args);
}
for (SystemUI ui: services) {
String name = ui.getClass().getName().toLowerCase();
if (name.endsWith(svc)) {

View File

@@ -177,6 +177,12 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
mBehaviorMap.get(mCurrentBehavior).onAssistantGesturePerformed();
}
void onAssistHandlesRequested() {
if (mInGesturalMode) {
mBehaviorMap.get(mCurrentBehavior).onAssistHandlesRequested();
}
}
void setBehavior(AssistHandleBehavior behavior) {
if (mCurrentBehavior == behavior) {
return;
@@ -316,6 +322,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
void onModeActivated(Context context, AssistHandleCallbacks callbacks);
default void onModeDeactivated() {}
default void onAssistantGesturePerformed() {}
default void onAssistHandlesRequested() {}
default void dump(PrintWriter pw, String prefix) {}
}
}

View File

@@ -211,6 +211,13 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mContext.getContentResolver(), LEARNING_EVENT_COUNT_KEY, ++mLearningCount);
}
@Override
public void onAssistHandlesRequested() {
if (mAssistHandleCallbacks != null && !mIsDozing && !mIsNavBarHidden && !mOnLockscreen) {
mAssistHandleCallbacks.showAndGo();
}
}
private static boolean isNavBarHidden(int sysuiStateFlags) {
return (sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0;
}

View File

@@ -48,9 +48,13 @@ import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Class to manage everything related to assist in SystemUI.
*/
@Singleton
public class AssistManager implements ConfigurationChangedReceiver {
/**
@@ -97,6 +101,8 @@ public class AssistManager implements ConfigurationChangedReceiver {
private static final String INVOCATION_TIME_MS_KEY = "invocation_time_ms";
private static final String INVOCATION_PHONE_STATE_KEY = "invocation_phone_state";
public static final String INVOCATION_TYPE_KEY = "invocation_type";
protected static final String ACTION_KEY = "action";
protected static final String SHOW_ASSIST_HANDLES_ACTION = "show_assist_handles";
public static final int INVOCATION_TYPE_GESTURE = 1;
public static final int INVOCATION_TYPE_ACTIVE_EDGE = 2;
@@ -147,6 +153,7 @@ public class AssistManager implements ConfigurationChangedReceiver {
}
};
@Inject
public AssistManager(DeviceProvisionedController controller, Context context) {
mContext = context;
mDeviceProvisionedController = controller;
@@ -204,6 +211,9 @@ public class AssistManager implements ConfigurationChangedReceiver {
if (VERBOSE) {
Log.v(TAG, "UI hints received");
}
if (SHOW_ASSIST_HANDLES_ACTION.equals(hints.getString(ACTION_KEY))) {
requestAssistHandles();
}
}
});
}
@@ -277,6 +287,10 @@ public class AssistManager implements ConfigurationChangedReceiver {
mUiController.onGestureCompletion(velocity);
}
protected void requestAssistHandles() {
mHandleController.onAssistHandlesRequested();
}
public void hideAssist() {
mAssistUtils.hideCurrentSession();
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2019 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.systemui.dock;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class DockManagerImpl implements DockManager {
@Inject
public DockManagerImpl() {
}
@Override
public void addListener(DockEventListener callback) {
}
@Override
public void removeListener(DockEventListener callback) {
}
@Override
public boolean isDocked() {
return false;
}
}

View File

@@ -81,6 +81,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.UiOffloadThread;
@@ -713,8 +714,7 @@ public class KeyguardViewMediator extends SystemUI {
// Assume keyguard is showing (unless it's disabled) until we know for sure, unless Keyguard
// is disabled.
if (mContext.getResources().getBoolean(
com.android.keyguard.R.bool.config_enableKeyguardService)) {
if (mContext.getResources().getBoolean(R.bool.config_enableKeyguardService)) {
setShowingLocked(!shouldWaitForProvisioning()
&& !mLockPatternUtils.isLockScreenDisabled(
KeyguardUpdateMonitor.getCurrentUser()), true /* forceCallbacks */);

View File

@@ -2,8 +2,16 @@ package com.android.systemui.power;
import com.android.settingslib.fuelgauge.Estimate;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class EnhancedEstimatesImpl implements EnhancedEstimates {
@Inject
public EnhancedEstimatesImpl() {
}
@Override
public boolean isHybridNotificationEnabled() {
return false;

View File

@@ -37,11 +37,15 @@ import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
import java.util.ArrayList;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* This class handles listening to notification updates and passing them along to
* NotificationPresenter to be displayed to the user.
*/
@SuppressLint("OverrideAbstract")
@Singleton
public class NotificationListener extends NotificationListenerWithPlugins {
private static final String TAG = "NotificationListener";
@@ -56,6 +60,7 @@ public class NotificationListener extends NotificationListenerWithPlugins {
private final ArrayList<NotificationSettingsListener> mSettingsListeners = new ArrayList<>();
private final Context mContext;
@Inject
public NotificationListener(Context context) {
mContext = context;
}

View File

@@ -58,10 +58,14 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Handles keeping track of the current user, profiles, and various things related to hiding
* contents, redacting notifications, and the lockscreen.
*/
@Singleton
public class NotificationLockscreenUserManagerImpl implements
Dumpable, NotificationLockscreenUserManager, StateListener {
private static final String TAG = "LockscreenUserManager";
@@ -171,6 +175,7 @@ public class NotificationLockscreenUserManagerImpl implements
return mEntryManager;
}
@Inject
public NotificationLockscreenUserManagerImpl(Context context) {
mContext = context;
mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(

View File

@@ -54,11 +54,15 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* NotificationEntryManager is responsible for the adding, removing, and updating of notifications.
* It also handles tasks such as their inflation and their interaction with other
* Notification.*Manager objects.
*/
@Singleton
public class NotificationEntryManager implements
Dumpable,
NotificationContentInflater.InflationCallback,
@@ -118,6 +122,7 @@ public class NotificationEntryManager implements
}
}
@Inject
public NotificationEntryManager(Context context) {
mNotificationData = new NotificationData();
}

View File

@@ -42,9 +42,13 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Provides heads-up and pulsing state for notification entries.
*/
@Singleton
public class NotificationInterruptionStateProvider {
private static final String TAG = "InterruptionStateProvider";
@@ -72,6 +76,7 @@ public class NotificationInterruptionStateProvider {
protected boolean mUseHeadsUp = false;
private boolean mDisableNotificationAlerts;
@Inject
public NotificationInterruptionStateProvider(Context context) {
this(context,
(PowerManager) context.getSystemService(Context.POWER_SERVICE),

View File

@@ -40,9 +40,9 @@ import com.android.keyguard.KeyguardHostView;
import com.android.keyguard.KeyguardSecurityView;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.R;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.systemui.R;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.plugins.FalsingManager;
@@ -77,6 +77,7 @@ public class KeyguardBouncer {
}
};
private final Runnable mRemoveViewRunnable = this::removeView;
private final KeyguardBypassController mKeyguardBypassController;
protected KeyguardHostView mKeyguardView;
private final Runnable mResetRunnable = ()-> {
if (mKeyguardView != null) {
@@ -97,7 +98,8 @@ public class KeyguardBouncer {
LockPatternUtils lockPatternUtils, ViewGroup container,
DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager,
BouncerExpansionCallback expansionCallback, UnlockMethodCache unlockMethodCache,
KeyguardUpdateMonitor keyguardUpdateMonitor, Handler handler) {
KeyguardUpdateMonitor keyguardUpdateMonitor,
KeyguardBypassController keyguardBypassController, Handler handler) {
mContext = context;
mCallback = callback;
mLockPatternUtils = lockPatternUtils;
@@ -109,6 +111,7 @@ public class KeyguardBouncer {
mHandler = handler;
mUnlockMethodCache = unlockMethodCache;
mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
mKeyguardBypassController = keyguardBypassController;
}
public void show(boolean resetSecuritySelection) {
@@ -171,7 +174,8 @@ public class KeyguardBouncer {
// Split up the work over multiple frames.
DejankUtils.removeCallbacks(mResetRunnable);
if (mUnlockMethodCache.isFaceAuthEnabled() && !needsFullscreenBouncer()
&& !mKeyguardUpdateMonitor.userNeedsStrongAuth()) {
&& !mKeyguardUpdateMonitor.userNeedsStrongAuth()
&& !mKeyguardBypassController.getBypassEnabled()) {
mHandler.postDelayed(mShowRunnable, BOUNCER_FACE_DELAY);
} else {
DejankUtils.postAfterTraversal(mShowRunnable);

View File

@@ -25,6 +25,10 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class KeyguardEnvironmentImpl implements KeyguardEnvironment {
private static final String TAG = "KeyguardEnvironmentImpl";
@@ -34,6 +38,7 @@ public class KeyguardEnvironmentImpl implements KeyguardEnvironment {
private final DeviceProvisionedController mDeviceProvisionedController =
Dependency.get(DeviceProvisionedController.class);
@Inject
public KeyguardEnvironmentImpl() {
}

View File

@@ -25,6 +25,7 @@ import static android.app.StatusBarManager.WindowVisibleState;
import static android.app.StatusBarManager.windowStateToString;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
import static com.android.systemui.Dependency.BG_HANDLER;
import static com.android.systemui.Dependency.MAIN_HANDLER;
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP;
@@ -238,6 +239,7 @@ import java.util.ArrayList;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import dagger.Subcomponent;
@@ -382,6 +384,9 @@ public class StatusBar extends SystemUI implements DemoMode,
@Nullable
@Inject
protected KeyguardLiftController mKeyguardLiftController;
@Inject
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
boolean mAllowNotificationLongPress;
// expanded notifications
protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
@@ -1064,7 +1069,7 @@ public class StatusBar extends SystemUI implements DemoMode,
final NotificationRowBinderImpl rowBinder =
new NotificationRowBinderImpl(
mContext,
SystemUIFactory.getInstance().provideAllowNotificationLongPress(),
mAllowNotificationLongPress,
mKeyguardBypassController,
mStatusBarStateController);

View File

@@ -221,7 +221,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mBiometricUnlockController = biometricUnlockController;
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry,
mExpansionCallback, falsingManager);
mExpansionCallback, falsingManager, bypassController);
mNotificationPanelView = notificationPanelView;
notificationPanelView.addExpansionListener(this);
mBypassController = bypassController;

View File

@@ -39,9 +39,9 @@ import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.R;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;

View File

@@ -31,6 +31,7 @@ import androidx.preference.PreferenceScreen;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.fragments.FragmentService;
public class TunerActivity extends Activity implements
@@ -50,7 +51,7 @@ public class TunerActivity extends Activity implements
setActionBar(toolbar);
}
Dependency.initDependencies(this);
Dependency.initDependencies(SystemUIFactory.getInstance().getRootComponent());
if (getFragmentManager().findFragmentByTag(TAG_TUNER) == null) {
final String action = getIntent().getAction();

View File

@@ -39,7 +39,7 @@ LOCAL_JAVA_LIBRARIES := \
telephony-common \
android.test.base \
LOCAL_AAPT_FLAGS := --extra-packages com.android.systemui:com.android.keyguard
LOCAL_AAPT_FLAGS := --extra-packages com.android.systemui
# sign this with platform cert, so this test is allowed to inject key events into
# UI it doesn't own. This is necessary to allow screenshots to be taken

View File

@@ -46,6 +46,7 @@ import android.testing.TestableLooper;
import com.android.internal.telephony.IccCardConstants;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;

View File

@@ -27,6 +27,7 @@ import android.widget.TextView;
import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;

View File

@@ -39,6 +39,7 @@ import android.widget.FrameLayout;
import android.widget.TextClock;
import com.android.keyguard.clock.ClockManager;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ClockPlugin;

View File

@@ -21,6 +21,7 @@ import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.policy.ConfigurationController
import com.google.common.truth.Truth.assertThat

View File

@@ -28,6 +28,7 @@ import android.view.LayoutInflater;
import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;

View File

@@ -23,6 +23,7 @@ import android.view.LayoutInflater;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import org.junit.Test;

View File

@@ -27,6 +27,7 @@ import androidx.slice.SliceProvider;
import androidx.slice.SliceSpecs;
import androidx.slice.builders.ListBuilder;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.KeyguardSliceProvider;

View File

@@ -24,6 +24,7 @@ import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.LayoutInflater;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.Assert;

View File

@@ -74,6 +74,6 @@ public class DependencyTest extends SysuiTestCase {
@Test
public void testInitDependency() {
Dependency.clearDependencies();
Dependency.initDependencies(mContext);
Dependency.initDependencies(SystemUIFactory.getInstance().getRootComponent());
}
}

View File

@@ -32,6 +32,7 @@ import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.XmlUtils;
import com.android.systemui.tests.R;
import org.junit.After;
import org.junit.Before;

View File

@@ -25,10 +25,6 @@ public class TestableDependency extends Dependency {
private final ArraySet<Object> mInstantiatedObjects = new ArraySet<>();
public TestableDependency(Context context) {
if (context instanceof SysuiTestableContext) {
mComponents = ((SysuiTestableContext) context).getComponents();
}
mContext = context;
SystemUIFactory.createFromConfig(context);
SystemUIFactory.getInstance().getRootComponent()
.createDependency()

View File

@@ -20,7 +20,7 @@ import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.android.systemui.R;
import com.android.systemui.tests.R;
/**
* Referenced by NotificationTestHelper#makeBubbleMetadata

View File

@@ -15,11 +15,11 @@
*/
package com.android.systemui.screenshot;
import com.android.systemui.R;
import android.app.Activity;
import android.os.Bundle;
import com.android.systemui.tests.R;
/**
* A stub activity used in {@link ScreenshotTest}.
*/

View File

@@ -40,7 +40,6 @@ import android.widget.RemoteViews;
import androidx.test.InstrumentationRegistry;
import com.android.systemui.R;
import com.android.systemui.bubbles.BubblesTestActivity;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -50,7 +49,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentInflat
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.tests.R;
/**
* A helper class to create {@link ExpandableNotificationRow} (for both individual and group

View File

@@ -38,8 +38,8 @@ import android.widget.RemoteViews;
import androidx.palette.graphics.Palette;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.tests.R;
import org.junit.After;
import org.junit.Before;

View File

@@ -23,7 +23,6 @@ import static com.android.systemui.statusbar.notification.row.NotificationConten
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -44,12 +43,12 @@ import android.widget.RemoteViews;
import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationCallback;
import com.android.systemui.tests.R;
import org.junit.Assert;
import org.junit.Before;

View File

@@ -24,10 +24,10 @@ import android.widget.RemoteViews;
import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.tests.R;
import org.junit.Assert;
import org.junit.Before;

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
@@ -84,6 +85,8 @@ public class KeyguardBouncerTest extends SysuiTestCase {
@Mock
private UnlockMethodCache mUnlockMethodCache;
@Mock
private KeyguardBypassController mKeyguardBypassController;
@Mock
private Handler mHandler;
private KeyguardBouncer mBouncer;
@@ -98,7 +101,8 @@ public class KeyguardBouncerTest extends SysuiTestCase {
when(mKeyguardHostView.getHeight()).thenReturn(500);
mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback,
mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager,
mExpansionCallback, mUnlockMethodCache, mKeyguardUpdateMonitor, mHandler) {
mExpansionCallback, mUnlockMethodCache, mKeyguardUpdateMonitor,
mKeyguardBypassController, mHandler) {
@Override
protected void inflateView() {
super.inflateView();
@@ -390,6 +394,15 @@ public class KeyguardBouncerTest extends SysuiTestCase {
verify(mHandler).removeCallbacks(eq(showRunnable.getValue()));
}
@Test
public void testShow_delaysIfFaceAuthIsRunning_unlessBypass() {
when(mUnlockMethodCache.isFaceAuthEnabled()).thenReturn(true);
when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true);
mBouncer.show(true /* reset */);
verify(mHandler, never()).postDelayed(any(), anyLong());
}
@Test
public void testRegisterUpdateMonitorCallback() {
verify(mKeyguardUpdateMonitor).registerCallback(any());

View File

@@ -68,7 +68,7 @@ public class StatusBarRemoteInputCallbackTest extends SysuiTestCase {
mDependency.injectTestDependency(ShadeController.class, mShadeController);
mDependency.injectTestDependency(NotificationLockscreenUserManager.class,
mNotificationLockscreenUserManager);
mDependency.putComponent(CommandQueue.class, mock(CommandQueue.class));
mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
mRemoteInputCallback = spy(new StatusBarRemoteInputCallback(mContext,
mock(NotificationGroupManager.class)));

View File

@@ -1,5 +1,12 @@
package com.android.systemui.statusbar.policy;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.content.Intent;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
@@ -16,13 +23,6 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper

View File

@@ -20,6 +20,8 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import libcore.util.SneakyThrow;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
@@ -55,7 +57,11 @@ public class DexmakerShareClassLoaderRule implements TestRule {
* WARNING: This is absolutely incompatible with running tests in parallel!
*/
public static void runWithDexmakerShareClassLoader(Runnable r) {
apply(r::run).run();
try {
apply(r::run).run();
} catch (Throwable t) {
SneakyThrow.sneakyThrow(t);
}
}
/**