diff options
Diffstat (limited to 'src/com/android/launcher3/lineage/LineageLauncherCallbacks.java')
-rw-r--r-- | src/com/android/launcher3/lineage/LineageLauncherCallbacks.java | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/src/com/android/launcher3/lineage/LineageLauncherCallbacks.java b/src/com/android/launcher3/lineage/LineageLauncherCallbacks.java new file mode 100644 index 000000000..b7e662bb4 --- /dev/null +++ b/src/com/android/launcher3/lineage/LineageLauncherCallbacks.java @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2018 The LineageOS 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.launcher3.lineage; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.os.Bundle; +import android.os.Handler; + +import com.android.launcher3.AppInfo; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherCallbacks; +import com.android.launcher3.Utilities; + +import com.google.android.libraries.gsa.launcherclient.LauncherClient; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; + +public class LineageLauncherCallbacks implements LauncherCallbacks, + OnSharedPreferenceChangeListener, OnDeviceProfileChangeListener { + public static final String KEY_ENABLE_MINUS_ONE = "pref_enable_minus_one"; + public static final String SEARCH_PACKAGE = "com.google.android.googlequicksearchbox"; + + private final LineageLauncher mLauncher; + + private OverlayCallbackImpl mOverlayCallbacks; + private LauncherClient mLauncherClient; + private boolean mDeferCallbacks; + + public LineageLauncherCallbacks(LineageLauncher launcher) { + mLauncher = launcher; + } + + public void deferCallbacksUntilNextResumeOrStop() { + mDeferCallbacks = true; + } + + public LauncherClient getLauncherClient() { + return mLauncherClient; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + SharedPreferences prefs = Utilities.getPrefs(mLauncher); + mOverlayCallbacks = new OverlayCallbackImpl(mLauncher); + mLauncherClient = new LauncherClient(mLauncher, mOverlayCallbacks, getClientOptions(prefs)); + mOverlayCallbacks.setClient(mLauncherClient); + prefs.registerOnSharedPreferenceChangeListener(this); + + mLauncher.addOnDeviceProfileChangeListener(this); + } + + @Override + public void onDetachedFromWindow() { + mLauncherClient.onDetachedFromWindow(); + } + + @Override + public void onAttachedToWindow() { + mLauncherClient.onAttachedToWindow(); + } + + @Override + public void onHomeIntent(boolean internalStateHandled) { + mLauncherClient.hideOverlay(mLauncher.isStarted() && !mLauncher.isForceInvisible()); + } + + @Override + public void onResume() { + Handler handler = mLauncher.getDragLayer().getHandler(); + if (mDeferCallbacks) { + if (handler == null) { + // Finish defer if we are not attached to window. + checkIfStillDeferred(); + } else { + // Wait one frame before checking as we can get multiple resume-pause events + // in the same frame. + handler.post(this::checkIfStillDeferred); + } + } else { + mLauncherClient.onResume(); + } + + } + + @Override + public void onPause() { + if (!mDeferCallbacks) { + mLauncherClient.onPause(); + } + } + + @Override + public void onStart() { + if (!mDeferCallbacks) { + mLauncherClient.onStart(); + } + } + + @Override + public void onStop() { + if (mDeferCallbacks) { + checkIfStillDeferred(); + } else { + mLauncherClient.onStop(); + } + } + + @Override + public void onDeviceProfileChanged(DeviceProfile dp) { + mLauncherClient.reattachOverlay(); + } + + private void checkIfStillDeferred() { + if (!mDeferCallbacks) { + return; + } + if (!mLauncher.hasBeenResumed() && mLauncher.isStarted()) { + return; + } + mDeferCallbacks = false; + + // Move the client to the correct state. Calling the same method twice is no-op. + if (mLauncher.isStarted()) { + mLauncherClient.onStart(); + } + if (mLauncher.hasBeenResumed()) { + mLauncherClient.onResume(); + } else { + mLauncherClient.onPause(); + } + if (!mLauncher.isStarted()) { + mLauncherClient.onStop(); + } + } + @Override + public void onDestroy() { + mLauncherClient.onDestroy(); + Utilities.getPrefs(mLauncher).unregisterOnSharedPreferenceChangeListener(this); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + if (KEY_ENABLE_MINUS_ONE.equals(key)) { + mLauncherClient.setClientOptions(getClientOptions(prefs)); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args) { + mLauncherClient.dump(prefix, w); + } + + @Override + public boolean handleBackPressed() { + return false; + } + + @Override + public void onTrimMemory(int level) { } + + @Override + public void onLauncherProviderChange() { } + + @Override + public boolean startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData) { + return false; + } + + private LauncherClient.ClientOptions getClientOptions(SharedPreferences prefs) { + return new LauncherClient.ClientOptions( + prefs.getBoolean(KEY_ENABLE_MINUS_ONE, true), + true, /* enableHotword */ + true /* enablePrewarming */ + ); + } +} |