content: /*
   * 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.quickstep;
  
  import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
  
  import android.annotation.TargetApi;
  import android.app.Service;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.graphics.Region;
  import android.os.Build;
  import android.os.Bundle;
  import android.os.IBinder;
  import android.os.Process;
  import android.os.RemoteException;
  import android.util.Log;
  import android.view.MotionEvent;
  
  import com.android.launcher3.Utilities;
  import com.android.launcher3.compat.UserManagerCompat;
  import com.android.systemui.shared.recents.IOverviewProxy;
  import com.android.systemui.shared.recents.ISystemUiProxy;
  
  /**
   * Service connected by system-UI for handling touch interaction.
   */
  @TargetApi(Build.VERSION_CODES.O)
  public class TouchInteractionService extends Service {
  
      private static final String TAG = "GoTouchInteractionService";
      private boolean mIsUserUnlocked;
      private BroadcastReceiver mUserUnlockedReceiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              if (Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) {
                  initWhenUserUnlocked();
              }
          }
      };
  
      private final IBinder mMyBinder = new IOverviewProxy.Stub() {
  
          @Override
          public void onActiveNavBarRegionChanges(Region region) throws RemoteException { }
  
          @Override
          public void onInitialize(Bundle bundle) throws RemoteException {
              ISystemUiProxy iSystemUiProxy = ISystemUiProxy.Stub
                      .asInterface(bundle.getBinder(KEY_EXTRA_SYSUI_PROXY));
              mRecentsModel.setSystemUiProxy(iSystemUiProxy);
          }
  
          @Override
          public void onOverviewToggle() {
              if (mIsUserUnlocked) {
                  mOverviewCommandHelper.onOverviewToggle();
              }
          }
  
          @Override
          public void onOverviewShown(boolean triggeredFromAltTab) {
              if (mIsUserUnlocked) {
                  mOverviewCommandHelper.onOverviewShown(triggeredFromAltTab);
              }
          }
  
          @Override
          public void onOverviewHidden(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
              if (mIsUserUnlocked && triggeredFromAltTab && !triggeredFromHomeKey) {
                  // onOverviewShownFromAltTab hides the overview and ends at the target app
                  mOverviewCommandHelper.onOverviewHidden();
              }
          }
  
          @Override
          public void onTip(int actionType, int viewType) {
              if (mIsUserUnlocked) {
                  mOverviewCommandHelper.onTip(actionType, viewType);
              }
          }
  
          @Override
          public void onAssistantAvailable(boolean available) {
              // TODO handle assistant
          }
  
          @Override
          public void onAssistantVisibilityChanged(float visibility) {
              // TODO handle assistant
          }
  
          public void onBackAction(boolean completed, int downX, int downY, boolean isButton,
                  boolean gestureSwipeLeft) {
          }
  
          public void onSystemUiStateChanged(int stateFlags) {
              // To be implemented
          }
  
          /** Deprecated methods **/
          public void onQuickStep(MotionEvent motionEvent) { }
  
          public void onQuickScrubEnd() { }
  
          public void onQuickScrubProgress(float progress) { }
  
          public void onQuickScrubStart() { }
  
          public void onPreMotionEvent(int downHitTarget) { }
  
          public void onMotionEvent(MotionEvent ev) { }
  
          public void onBind(ISystemUiProxy iSystemUiProxy) {
              mRecentsModel.setSystemUiProxy(iSystemUiProxy);
          }
      };
  
      private static boolean sConnected = false;;
  
      public static boolean isConnected() {
          return sConnected;
      }
  
      private RecentsModel mRecentsModel;
      private OverviewComponentObserver mOverviewComponentObserver;
      private OverviewCommandHelper mOverviewCommandHelper;
  
      @Override
      public void onCreate() {
          super.onCreate();
          if (UserManagerCompat.getInstance(this).isUserUnlocked(Process.myUserHandle())) {
              initWhenUserUnlocked();
          } else {
              mIsUserUnlocked = false;
              registerReceiver(mUserUnlockedReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED));
          }
  
          sConnected = true;
      }
  
      private void initWhenUserUnlocked() {
          mRecentsModel = RecentsModel.INSTANCE.get(this);
          mOverviewComponentObserver = new OverviewComponentObserver(this);
          mOverviewCommandHelper = new OverviewCommandHelper(this,
                  mOverviewComponentObserver);
          mIsUserUnlocked = true;
          Utilities.unregisterReceiverSafely(this, mUserUnlockedReceiver);
      }
  
      @Override
      public void onDestroy() {
          if (mIsUserUnlocked) {
              mOverviewComponentObserver.onDestroy();
          }
          Utilities.unregisterReceiverSafely(this, mUserUnlockedReceiver);
          sConnected = false;
          super.onDestroy();
      }
  
      @Override
      public IBinder onBind(Intent intent) {
          if (Log.isLoggable(TAG, Log.DEBUG)) {
              Log.d(TAG, "Touch service connected");
          }
          return mMyBinder;
      }
  
      public static boolean isInitialized() {
          return true;
      }
  }
  