diff options
Diffstat (limited to 'java')
20 files changed, 165 insertions, 283 deletions
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java index a9a11e008..3d61f7371 100644 --- a/java/com/android/dialer/app/DialtactsActivity.java +++ b/java/com/android/dialer/app/DialtactsActivity.java @@ -725,9 +725,6 @@ public class DialtactsActivity extends TransactionSafeActivity handleMenuSettings(); Logger.get(this).logScreenView(ScreenEvent.Type.SETTINGS, this); return true; - } else if (resId == R.id.menu_new_ui_launcher_shortcut) { - MainComponent.createNewUiLauncherShortcut(this); - return true; } return false; } @@ -1599,10 +1596,6 @@ public class DialtactsActivity extends TransactionSafeActivity } else { simulatorMenuItem.setVisible(false); } - - menu.findItem(R.id.menu_new_ui_launcher_shortcut) - .setVisible(MainComponent.isNewUiEnabled(context)); - super.show(); } } diff --git a/java/com/android/dialer/app/MainComponent.java b/java/com/android/dialer/app/MainComponent.java index f8d457c5f..c223723c6 100644 --- a/java/com/android/dialer/app/MainComponent.java +++ b/java/com/android/dialer/app/MainComponent.java @@ -19,44 +19,14 @@ package com.android.dialer.app; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import com.android.dialer.configprovider.ConfigProviderBindings; -/** This class is a copy of dialer.main.impl.MainImpl to get around a dependency issue. */ +/** + * Main activity intents. + * + * <p>TODO(calderwoodra): Move this elsewhere. + */ public class MainComponent { - public static boolean isNewUiEnabled(Context context) { - return ConfigProviderBindings.get(context).getBoolean("is_nui_shortcut_enabled", false); - } - - public static void createNewUiLauncherShortcut(Context context) { - enableComponent(context); - } - - public static boolean isNuiComponentEnabled(Context context) { - if (!isNewUiEnabled(context)) { - return false; - } - return context - .getPackageManager() - .getComponentEnabledSetting(new ComponentName(context, getComponentName())) - == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; - } - - /** - * Enables the NUI activity component. By default the component is disabled and can't be accessed. - * Once the component has been enabled the user will get an option to use the new UI to handle - * DIAL (and other) intents. - */ - private static void enableComponent(Context context) { - context - .getPackageManager() - .setComponentEnabledSetting( - new ComponentName(context, getComponentName()), - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, - PackageManager.DONT_KILL_APP); - } - /** * @param context Context of the application package implementing MainActivity class. * @return intent for MainActivity.class diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java index 158ae2b03..772feed53 100644 --- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java +++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java @@ -42,12 +42,10 @@ import android.text.TextDirectionHeuristics; import android.text.TextUtils; import android.util.ArraySet; import com.android.contacts.common.ContactsUtils; -import com.android.dialer.app.DialtactsActivity; import com.android.dialer.app.MainComponent; import com.android.dialer.app.R; import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall; import com.android.dialer.app.contactinfo.ContactPhotoLoader; -import com.android.dialer.app.list.DialtactsPagerAdapter; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.common.Assert; @@ -454,13 +452,8 @@ public class MissedCallNotifier implements Worker<Pair<Integer, String>, Void> { * @param callUri Uri of the call to jump to. May be null */ private PendingIntent createCallLogPendingIntent(@Nullable Uri callUri) { - Intent contentIntent; - if (MainComponent.isNuiComponentEnabled(context)) { - contentIntent = MainComponent.getShowCallLogIntent(context); - } else { - contentIntent = - DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_HISTORY); - } + Intent contentIntent = MainComponent.getShowCallLogIntent(context); + // TODO (a bug): scroll to call contentIntent.setData(callUri); return PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java index cba389cc3..793d9627c 100644 --- a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java +++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java @@ -38,7 +38,6 @@ import com.android.dialer.app.MainComponent; import com.android.dialer.app.R; import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall; import com.android.dialer.app.contactinfo.ContactPhotoLoader; -import com.android.dialer.app.list.DialtactsPagerAdapter; import com.android.dialer.common.LogUtil; import com.android.dialer.compat.android.provider.VoicemailCompat; import com.android.dialer.logging.DialerImpression; @@ -267,13 +266,8 @@ final class VisualVoicemailNotifier { private static PendingIntent newVoicemailIntent( @NonNull Context context, @Nullable NewCall voicemail) { - Intent intent; - if (MainComponent.isNuiComponentEnabled(context)) { - intent = MainComponent.getShowVoicemailIntent(context); - } else { - intent = - DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL); - } + Intent intent = MainComponent.getShowVoicemailIntent(context); + // TODO (a bug): scroll to this voicemail if (voicemail != null) { intent.setData(voicemail.voicemailUri); diff --git a/java/com/android/dialer/app/res/menu/dialtacts_options.xml b/java/com/android/dialer/app/res/menu/dialtacts_options.xml index b50e6ad5f..fcd520a1e 100644 --- a/java/com/android/dialer/app/res/menu/dialtacts_options.xml +++ b/java/com/android/dialer/app/res/menu/dialtacts_options.xml @@ -28,8 +28,4 @@ <item android:id="@+id/menu_simulator_submenu" android:title="@string/simulator_submenu_label"/> - <item - android:id="@+id/menu_new_ui_launcher_shortcut" - android:title="@string/new_ui_launcher_shortcut_label"/> - </menu> diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java index 969172b7f..21a282ded 100644 --- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java +++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java @@ -19,6 +19,7 @@ package com.android.dialer.binary.aosp; import com.android.bubble.stub.StubBubbleModule; import com.android.dialer.binary.basecomponent.BaseDialerRootComponent; import com.android.dialer.calllog.CallLogModule; +import com.android.dialer.calllog.config.CallLogConfigModule; import com.android.dialer.commandline.CommandLineModule; import com.android.dialer.common.concurrent.DialerExecutorModule; import com.android.dialer.configprovider.SharedPrefConfigProviderModule; @@ -49,6 +50,7 @@ import javax.inject.Singleton; @Component( modules = { CallLogModule.class, + CallLogConfigModule.class, CommandLineModule.class, ContextModule.class, DialerExecutorModule.class, diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java index 2cafb260f..b668d9114 100644 --- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java +++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java @@ -18,6 +18,7 @@ package com.android.dialer.binary.basecomponent; import com.android.bubble.BubbleComponent; import com.android.dialer.calllog.CallLogComponent; +import com.android.dialer.calllog.config.CallLogConfigComponent; import com.android.dialer.calllog.database.CallLogDatabaseComponent; import com.android.dialer.calllog.ui.CallLogUiComponent; import com.android.dialer.commandline.CommandLineComponent; @@ -27,7 +28,6 @@ import com.android.dialer.duo.DuoComponent; import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.feedback.FeedbackComponent; import com.android.dialer.glidephotomanager.GlidePhotoManagerComponent; -import com.android.dialer.main.MainComponent; import com.android.dialer.metrics.MetricsComponent; import com.android.dialer.phonelookup.PhoneLookupComponent; import com.android.dialer.phonelookup.database.PhoneLookupDatabaseComponent; @@ -51,6 +51,7 @@ public interface BaseDialerRootComponent extends BubbleComponent.HasComponent, CallLocationComponent.HasComponent, CallLogComponent.HasComponent, + CallLogConfigComponent.HasComponent, CallLogDatabaseComponent.HasComponent, CallLogUiComponent.HasComponent, ConfigProviderComponent.HasComponent, @@ -60,7 +61,6 @@ public interface BaseDialerRootComponent EnrichedCallComponent.HasComponent, FeedbackComponent.HasComponent, GlidePhotoManagerComponent.HasComponent, - MainComponent.HasComponent, MapsComponent.HasComponent, MetricsComponent.HasComponent, PhoneLookupComponent.HasComponent, diff --git a/java/com/android/dialer/binary/common/DialerApplication.java b/java/com/android/dialer/binary/common/DialerApplication.java index 9e9b03b5f..3247c7053 100644 --- a/java/com/android/dialer/binary/common/DialerApplication.java +++ b/java/com/android/dialer/binary/common/DialerApplication.java @@ -23,14 +23,15 @@ import android.support.v4.os.BuildCompat; import com.android.dialer.blocking.BlockedNumbersAutoMigrator; import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; import com.android.dialer.calllog.CallLogComponent; -import com.android.dialer.common.concurrent.DefaultFutureCallback; +import com.android.dialer.calllog.CallLogFramework; +import com.android.dialer.calllog.config.CallLogConfig; +import com.android.dialer.calllog.config.CallLogConfigComponent; +import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.inject.HasRootComponent; import com.android.dialer.notification.NotificationChannelManager; import com.android.dialer.persistentlog.PersistentLogger; import com.android.dialer.strictmode.StrictModeComponent; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.MoreExecutors; /** A common application subclass for all Dialer build variants. */ public abstract class DialerApplication extends Application implements HasRootComponent { @@ -48,11 +49,7 @@ public abstract class DialerApplication extends Application implements HasRootCo new FilteredNumberAsyncQueryHandler(this), DialerExecutorComponent.get(this).dialerExecutorFactory()) .asyncAutoMigrate(); - CallLogComponent.get(this).callLogFramework().onApplicationCreate(); - Futures.addCallback( - CallLogComponent.get(this).getAnnotatedCallLogMigrator().migrate(), - new DefaultFutureCallback<>(), - MoreExecutors.directExecutor()); + initializeAnnotatedCallLog(); PersistentLogger.initialize(this); if (BuildCompat.isAtLeastO()) { @@ -61,6 +58,18 @@ public abstract class DialerApplication extends Application implements HasRootCo Trace.endSection(); } + private void initializeAnnotatedCallLog() { + CallLogConfig callLogConfig = CallLogConfigComponent.get(this).callLogConfig(); + callLogConfig.schedulePollingJob(); + + if (callLogConfig.isCallLogFrameworkEnabled()) { + CallLogFramework callLogFramework = CallLogComponent.get(this).callLogFramework(); + callLogFramework.registerContentObservers(); + } else { + LogUtil.i("DialerApplication.initializeAnnotatedCallLog", "framework not enabled"); + } + } + /** * Returns a new instance of the root component for the application. Sub classes should define a * root component that extends all the sub components "HasComponent" intefaces. The component diff --git a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java index f9f561a0e..0da2f9577 100644 --- a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java +++ b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java @@ -19,6 +19,7 @@ package com.android.dialer.binary.google; import com.android.bubble.stub.StubBubbleModule; import com.android.dialer.binary.basecomponent.BaseDialerRootComponent; import com.android.dialer.calllog.CallLogModule; +import com.android.dialer.calllog.config.CallLogConfigModule; import com.android.dialer.commandline.CommandLineModule; import com.android.dialer.common.concurrent.DialerExecutorModule; import com.android.dialer.configprovider.SharedPrefConfigProviderModule; @@ -53,6 +54,7 @@ import javax.inject.Singleton; modules = { CallLocationModule.class, CallLogModule.class, + CallLogConfigModule.class, CommandLineModule.class, ContextModule.class, DialerExecutorModule.class, diff --git a/java/com/android/dialer/calllog/AnnotatedCallLogMigrator.java b/java/com/android/dialer/calllog/AnnotatedCallLogMigrator.java index a12a98f0e..71bfb753c 100644 --- a/java/com/android/dialer/calllog/AnnotatedCallLogMigrator.java +++ b/java/com/android/dialer/calllog/AnnotatedCallLogMigrator.java @@ -16,12 +16,9 @@ package com.android.dialer.calllog; -import android.content.Context; import android.content.SharedPreferences; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; -import com.android.dialer.configprovider.ConfigProviderBindings; -import com.android.dialer.inject.ApplicationContext; import com.android.dialer.storage.Unencrypted; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -37,18 +34,15 @@ public final class AnnotatedCallLogMigrator { private static final String PREF_MIGRATED = "annotatedCallLogMigratorMigrated"; - private final Context appContext; private final SharedPreferences sharedPreferences; private final RefreshAnnotatedCallLogWorker refreshAnnotatedCallLogWorker; private final ListeningExecutorService backgroundExecutor; @Inject AnnotatedCallLogMigrator( - @ApplicationContext Context appContext, @Unencrypted SharedPreferences sharedPreferences, @BackgroundExecutor ListeningExecutorService backgroundExecutor, RefreshAnnotatedCallLogWorker refreshAnnotatedCallLogWorker) { - this.appContext = appContext; this.sharedPreferences = sharedPreferences; this.backgroundExecutor = backgroundExecutor; this.refreshAnnotatedCallLogWorker = refreshAnnotatedCallLogWorker; @@ -78,17 +72,7 @@ public final class AnnotatedCallLogMigrator { } private ListenableFuture<Boolean> shouldMigrate() { - return backgroundExecutor.submit( - () -> { - if (!(ConfigProviderBindings.get(appContext) - .getBoolean("is_nui_shortcut_enabled", false))) { - return false; - } - if (sharedPreferences.getBoolean(PREF_MIGRATED, false)) { - return false; - } - return true; - }); + return backgroundExecutor.submit(() -> !sharedPreferences.getBoolean(PREF_MIGRATED, false)); } /** diff --git a/java/com/android/dialer/calllog/CallLogComponent.java b/java/com/android/dialer/calllog/CallLogComponent.java index c7b44a818..4f147f1a6 100644 --- a/java/com/android/dialer/calllog/CallLogComponent.java +++ b/java/com/android/dialer/calllog/CallLogComponent.java @@ -30,12 +30,8 @@ public abstract class CallLogComponent { public abstract RefreshAnnotatedCallLogWorker getRefreshAnnotatedCallLogWorker(); - public abstract AnnotatedCallLogMigrator getAnnotatedCallLogMigrator(); - public abstract ClearMissedCalls getClearMissedCalls(); - public abstract CallLogConfig callLogConfig(); - public static CallLogComponent get(Context context) { return ((HasComponent) ((HasRootComponent) context.getApplicationContext()).component()) .callLogComponent(); diff --git a/java/com/android/dialer/calllog/CallLogFramework.java b/java/com/android/dialer/calllog/CallLogFramework.java index 936f2bbf6..53ff43057 100644 --- a/java/com/android/dialer/calllog/CallLogFramework.java +++ b/java/com/android/dialer/calllog/CallLogFramework.java @@ -16,12 +16,9 @@ package com.android.dialer.calllog; -import android.content.Context; import com.android.dialer.calllog.datasources.CallLogDataSource; import com.android.dialer.calllog.datasources.DataSources; import com.android.dialer.common.LogUtil; -import com.android.dialer.configprovider.ConfigProviderBindings; -import com.android.dialer.inject.ApplicationContext; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; @@ -38,46 +35,39 @@ import javax.inject.Singleton; @Singleton public final class CallLogFramework { - private final Context appContext; private final DataSources dataSources; + private final AnnotatedCallLogMigrator annotatedCallLogMigrator; @Inject - CallLogFramework(@ApplicationContext Context appContext, DataSources dataSources) { - this.appContext = appContext; + CallLogFramework(DataSources dataSources, AnnotatedCallLogMigrator annotatedCallLogMigrator) { this.dataSources = dataSources; - } - - /** Performs necessary setup work when the application is created. */ - public void onApplicationCreate() { - registerContentObservers(); - CallLogConfig.schedulePollingJob(appContext); + this.annotatedCallLogMigrator = annotatedCallLogMigrator; } /** Registers the content observers for all data sources. */ public void registerContentObservers() { LogUtil.enterBlock("CallLogFramework.registerContentObservers"); - - // This is the same condition used in MainImpl#isNewUiEnabled. It means that bugfood/debug - // users will have "new call log" content observers firing. These observers usually do simple - // things like writing shared preferences. - // TODO(zachh): Find a way to access Main#isNewUiEnabled without creating a circular dependency. - if (ConfigProviderBindings.get(appContext).getBoolean("is_nui_shortcut_enabled", false)) { - for (CallLogDataSource dataSource : dataSources.getDataSourcesIncludingSystemCallLog()) { - dataSource.registerContentObservers(); - } - } else { - LogUtil.i("CallLogFramework.registerContentObservers", "not registering content observers"); + for (CallLogDataSource dataSource : dataSources.getDataSourcesIncludingSystemCallLog()) { + dataSource.registerContentObservers(); } } + /** Enables the framework. */ + public ListenableFuture<Void> enable() { + registerContentObservers(); + return annotatedCallLogMigrator.migrate(); + } + /** Disables the framework. */ public ListenableFuture<Void> disable() { - LogUtil.enterBlock("CallLogFramework.disable"); + return Futures.transform( + Futures.allAsList(disableDataSources(), annotatedCallLogMigrator.clearData()), + unused -> null, + MoreExecutors.directExecutor()); + } - if (!ConfigProviderBindings.get(appContext).getBoolean("is_nui_shortcut_enabled", false)) { - LogUtil.i("CallLogFramework.disable", "not disabling"); - return Futures.immediateFuture(null); - } + private ListenableFuture<Void> disableDataSources() { + LogUtil.enterBlock("CallLogFramework.disableDataSources"); for (CallLogDataSource dataSource : dataSources.getDataSourcesIncludingSystemCallLog()) { dataSource.unregisterContentObservers(); diff --git a/java/com/android/dialer/calllog/config/AndroidManifest.xml b/java/com/android/dialer/calllog/config/AndroidManifest.xml new file mode 100644 index 000000000..7f65fac5d --- /dev/null +++ b/java/com/android/dialer/calllog/config/AndroidManifest.xml @@ -0,0 +1,32 @@ +<!-- + ~ 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 + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.dialer.calllog.config"> + + <uses-sdk + android:minSdkVersion="24" + android:targetSdkVersion="27"/> + + <application> + + <service + android:exported="false" + android:name=".CallLogConfigImpl$PollingJob" + android:permission="android.permission.BIND_JOB_SERVICE"/> + + </application> + +</manifest> diff --git a/java/com/android/dialer/calllog/config/CallLogConfig.java b/java/com/android/dialer/calllog/config/CallLogConfig.java new file mode 100644 index 000000000..15fd5c1c2 --- /dev/null +++ b/java/com/android/dialer/calllog/config/CallLogConfig.java @@ -0,0 +1,40 @@ +/* + * 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.calllog.config; + +import com.google.common.util.concurrent.ListenableFuture; + +/** Determines if new call log components are enabled. */ +public interface CallLogConfig { + + /** + * Updates the config values. This may kick off a lot of work so should be done infrequently, for + * example by a scheduled job or broadcast receiver which rarely fires. + */ + ListenableFuture<Void> update(); + + boolean isNewCallLogFragmentEnabled(); + + boolean isNewVoicemailFragmentEnabled(); + + boolean isNewPeerEnabled(); + + boolean isCallLogFrameworkEnabled(); + + /** Schedules a job to periodically update the config. */ + void schedulePollingJob(); +} diff --git a/java/com/android/dialer/main/MainComponent.java b/java/com/android/dialer/calllog/config/CallLogConfigComponent.java index e735457f4..c325025f3 100644 --- a/java/com/android/dialer/main/MainComponent.java +++ b/java/com/android/dialer/calllog/config/CallLogConfigComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -13,27 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License */ - -package com.android.dialer.main; +package com.android.dialer.calllog.config; import android.content.Context; import com.android.dialer.inject.HasRootComponent; -import com.android.dialer.main.impl.MainModule; import dagger.Subcomponent; -/** Subcomponent that can be used to access the main implementation. */ -@Subcomponent(modules = MainModule.class) -public abstract class MainComponent { +/** Dagger component for the call log config. */ +@Subcomponent +public abstract class CallLogConfigComponent { - public abstract Main getMain(); + public abstract CallLogConfig callLogConfig(); - public static MainComponent get(Context context) { + public static CallLogConfigComponent get(Context context) { return ((HasComponent) ((HasRootComponent) context.getApplicationContext()).component()) - .mainComponent(); + .callLogConfigComponent(); } /** Used to refer to the root application component. */ public interface HasComponent { - MainComponent mainComponent(); + CallLogConfigComponent callLogConfigComponent(); } } diff --git a/java/com/android/dialer/calllog/CallLogConfig.java b/java/com/android/dialer/calllog/config/CallLogConfigImpl.java index 12056c758..9c7f472d5 100644 --- a/java/com/android/dialer/calllog/CallLogConfig.java +++ b/java/com/android/dialer/calllog/config/CallLogConfigImpl.java @@ -14,7 +14,7 @@ * limitations under the License */ -package com.android.dialer.calllog; +package com.android.dialer.calllog.config; import android.annotation.SuppressLint; import android.app.job.JobInfo; @@ -25,13 +25,14 @@ import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; import android.support.v4.os.UserManagerCompat; +import com.android.dialer.calllog.CallLogFramework; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; -import com.android.dialer.common.concurrent.Annotations.LightweightExecutor; import com.android.dialer.common.concurrent.ThreadUtil; import com.android.dialer.configprovider.ConfigProvider; import com.android.dialer.constants.ScheduledJobIds; +import com.android.dialer.inject.ApplicationContext; import com.android.dialer.storage.Unencrypted; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -51,7 +52,7 @@ import javax.inject.Inject; * <p>New UI application components should use this class instead of reading flags directly from the * {@link ConfigProvider}. */ -public final class CallLogConfig { +public final class CallLogConfigImpl implements CallLogConfig { private static final String NEW_CALL_LOG_FRAGMENT_ENABLED_PREF_KEY = "newCallLogFragmentEnabled"; private static final String NEW_VOICEMAIL_FRAGMENT_ENABLED_PREF_KEY = @@ -60,33 +61,27 @@ public final class CallLogConfig { private static final String NEW_CALL_LOG_FRAMEWORK_ENABLED_PREF_KEY = "newCallLogFrameworkEnabled"; + private final Context appContext; private final CallLogFramework callLogFramework; private final SharedPreferences sharedPreferences; private final ConfigProvider configProvider; - private final AnnotatedCallLogMigrator annotatedCallLogMigrator; private final ListeningExecutorService backgroundExecutor; - private final ListeningExecutorService lightweightExecutor; @Inject - public CallLogConfig( + public CallLogConfigImpl( + @ApplicationContext Context appContext, CallLogFramework callLogFramework, @Unencrypted SharedPreferences sharedPreferences, ConfigProvider configProvider, - AnnotatedCallLogMigrator annotatedCallLogMigrator, - @BackgroundExecutor ListeningExecutorService backgroundExecutor, - @LightweightExecutor ListeningExecutorService lightweightExecutor) { + @BackgroundExecutor ListeningExecutorService backgroundExecutor) { + this.appContext = appContext; this.callLogFramework = callLogFramework; this.sharedPreferences = sharedPreferences; this.configProvider = configProvider; - this.annotatedCallLogMigrator = annotatedCallLogMigrator; this.backgroundExecutor = backgroundExecutor; - this.lightweightExecutor = lightweightExecutor; } - /** - * Updates the config values. This may kick off a lot of work so should be done infrequently, for - * example by a scheduled job or broadcast receiver which rarely fires. - */ + @Override public ListenableFuture<Void> update() { boolean newCallLogFragmentEnabledInConfigProvider = configProvider.getBoolean("new_call_log_fragment_enabled", false); @@ -102,7 +97,7 @@ public final class CallLogConfig { if (callLogFrameworkShouldBeEnabled && !isCallLogFrameworkEnabled) { return Futures.transform( - enableFramework(), + callLogFramework.enable(), unused -> { // Reflect the flag changes only after the framework is enabled. sharedPreferences @@ -134,7 +129,9 @@ public final class CallLogConfig { return null; }); return Futures.transformAsync( - writeSharedPrefsFuture, unused -> disableFramework(), MoreExecutors.directExecutor()); + writeSharedPrefsFuture, + unused -> callLogFramework.disable(), + MoreExecutors.directExecutor()); } else { // We didn't need to enable/disable the framework, but we still need to update the // individual flags. @@ -155,35 +152,17 @@ public final class CallLogConfig { } } - private ListenableFuture<Void> enableFramework() { - ListenableFuture<Void> registerObserversFuture = - lightweightExecutor.submit( - () -> { - callLogFramework.registerContentObservers(); - return null; - }); - ListenableFuture<Void> migratorFuture = annotatedCallLogMigrator.migrate(); - return Futures.transform( - Futures.allAsList(registerObserversFuture, migratorFuture), - unused -> null, - MoreExecutors.directExecutor()); - } - - private ListenableFuture<Void> disableFramework() { - return Futures.transform( - Futures.allAsList(callLogFramework.disable(), annotatedCallLogMigrator.clearData()), - unused -> null, - MoreExecutors.directExecutor()); - } - + @Override public boolean isNewCallLogFragmentEnabled() { return sharedPreferences.getBoolean(NEW_CALL_LOG_FRAGMENT_ENABLED_PREF_KEY, false); } + @Override public boolean isNewVoicemailFragmentEnabled() { return sharedPreferences.getBoolean(NEW_VOICEMAIL_FRAGMENT_ENABLED_PREF_KEY, false); } + @Override public boolean isNewPeerEnabled() { return sharedPreferences.getBoolean(NEW_PEER_ENABLED_PREF_KEY, false); } @@ -192,11 +171,13 @@ public final class CallLogConfig { * Returns true if the new call log framework is enabled, meaning that content observers are * firing and PhoneLookupHistory is being populated, etc. */ + @Override public boolean isCallLogFrameworkEnabled() { return sharedPreferences.getBoolean(NEW_CALL_LOG_FRAMEWORK_ENABLED_PREF_KEY, false); } - static void schedulePollingJob(Context appContext) { + @Override + public void schedulePollingJob() { if (UserManagerCompat.isUserUnlocked(appContext)) { JobScheduler jobScheduler = Assert.isNotNull(appContext.getSystemService(JobScheduler.class)); @SuppressLint("MissingPermission") // Dialer has RECEIVE_BOOT permission @@ -209,7 +190,7 @@ public final class CallLogConfig { .setRequiresCharging(true) .setRequiresDeviceIdle(true) .build(); - LogUtil.i("CallLogConfig.schedulePollingJob", "scheduling"); + LogUtil.i("CallLogConfigImpl.schedulePollingJob", "scheduling"); jobScheduler.schedule(jobInfo); } } @@ -226,7 +207,7 @@ public final class CallLogConfig { public boolean onStartJob(JobParameters params) { LogUtil.enterBlock("PollingJob.onStartJob"); Futures.addCallback( - CallLogComponent.get(getApplicationContext()).callLogConfig().update(), + CallLogConfigComponent.get(getApplicationContext()).callLogConfig().update(), new FutureCallback<Void>() { @Override public void onSuccess(Void unused) { diff --git a/java/com/android/dialer/main/impl/MainModule.java b/java/com/android/dialer/calllog/config/CallLogConfigModule.java index 90342cf59..d982e2bd8 100644 --- a/java/com/android/dialer/main/impl/MainModule.java +++ b/java/com/android/dialer/calllog/config/CallLogConfigModule.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -14,17 +14,14 @@ * limitations under the License */ -package com.android.dialer.main.impl; +package com.android.dialer.calllog.config; -import com.android.dialer.main.Main; +import dagger.Binds; import dagger.Module; -import dagger.Provides; -/** This module provides an instance of {@link Main}. */ +/** Binds {@link CallLogConfigImpl}. */ @Module -public final class MainModule { - @Provides - public static Main provideMain() { - return new MainImpl(); - } +public abstract class CallLogConfigModule { + @Binds + abstract CallLogConfig to(CallLogConfigImpl impl); } diff --git a/java/com/android/dialer/main/Main.java b/java/com/android/dialer/main/Main.java deleted file mode 100644 index e7295f199..000000000 --- a/java/com/android/dialer/main/Main.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2017 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.main; - -import android.content.Context; - -/** Used to display the main activity for Dialer. This hosts favorites, dial pad, search, etc... */ -public interface Main { - - boolean isNewUiEnabled(Context context); - - // TODO(38502365): Remove this when we're ready to launch the new UI. */ - void createNewUiLauncherShortcut(Context context); - - void disableComponentForTesting(Context context); -} diff --git a/java/com/android/dialer/main/impl/MainImpl.java b/java/com/android/dialer/main/impl/MainImpl.java deleted file mode 100644 index 717350e5f..000000000 --- a/java/com/android/dialer/main/impl/MainImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2017 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.main.impl; - -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.PackageManager; -import com.android.dialer.configprovider.ConfigProviderBindings; -import com.android.dialer.main.Main; -import javax.inject.Inject; - -/** The entry point for the main feature. */ -final class MainImpl implements Main { - - @Inject - MainImpl() {} - - @Override - public boolean isNewUiEnabled(Context context) { - return ConfigProviderBindings.get(context).getBoolean("is_nui_shortcut_enabled", false); - } - - @Override - public void createNewUiLauncherShortcut(Context context) { - enableComponent(context); - } - - /** - * Enables the NUI activity component. By default the component is disabled and can't be accessed. - * Once the component has been enabled the user will get an option to use the new UI to handle - * DIAL (and other) intents. - */ - private static void enableComponent(Context context) { - context - .getPackageManager() - .setComponentEnabledSetting( - new ComponentName(context, MainActivity.class), - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, - PackageManager.DONT_KILL_APP); - } - - @Override - public void disableComponentForTesting(Context context) { - context - .getPackageManager() - .setComponentEnabledSetting( - new ComponentName(context, MainActivity.class), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, - PackageManager.DONT_KILL_APP); - } -} diff --git a/java/com/android/incallui/PhoneLookupHistoryRecorder.java b/java/com/android/incallui/PhoneLookupHistoryRecorder.java index 16d73ced9..2b8075878 100644 --- a/java/com/android/incallui/PhoneLookupHistoryRecorder.java +++ b/java/com/android/incallui/PhoneLookupHistoryRecorder.java @@ -20,10 +20,10 @@ import android.content.Context; import android.support.annotation.Nullable; import android.telecom.Call; import com.android.dialer.DialerPhoneNumber; +import com.android.dialer.calllog.config.CallLogConfigComponent; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DialerExecutorComponent; -import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.location.GeoUtil; import com.android.dialer.phonelookup.PhoneLookupComponent; import com.android.dialer.phonelookup.PhoneLookupInfo; @@ -45,11 +45,11 @@ import com.google.i18n.phonenumbers.PhoneNumberUtil; final class PhoneLookupHistoryRecorder { /** - * If the new UI is enabled, fetches the current {@link PhoneLookupInfo} for the provided call and - * writes it to the PhoneLookupHistory. Otherwise does nothing. + * If the call log framework is enabled, fetches the current {@link PhoneLookupInfo} for the + * provided call and writes it to the PhoneLookupHistory. Otherwise does nothing. */ static void recordPhoneLookupInfo(Context appContext, Call call) { - if (!(ConfigProviderBindings.get(appContext).getBoolean("is_nui_shortcut_enabled", false))) { + if (!CallLogConfigComponent.get(appContext).callLogConfig().isCallLogFrameworkEnabled()) { return; } |