lineage-sdk internal: Import ActionUtils class
Change-Id: Iab14009d7e26064c8c6b732cf22be90da3ef7f04
This commit is contained in:
committed by
Bruno Martins
parent
322b46a133
commit
de846c64c3
35
lineage/res/res/anim/last_app_in.xml
Normal file
35
lineage/res/res/anim/last_app_in.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2014 The CyanogenMod 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.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate android:fromXDelta="0%" android:toXDelta="-35%"
|
||||
android:zAdjustment="bottom"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/fast_out_linear_in" />
|
||||
<scale android:fromXScale="0.80" android:toXScale="1.0"
|
||||
android:fromYScale="0.80" android:toYScale="1.0"
|
||||
android:pivotX="50%" android:pivotY="50%"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/linear" />
|
||||
<translate android:fromXDelta="-35%" android:toXDelta="35%"
|
||||
android:zAdjustment="top"
|
||||
android:startOffset="@android:integer/config_shortAnimTime"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/linear_out_slow_in" />
|
||||
<alpha android:fromAlpha="0.6" android:toAlpha="1.0"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/linear" />
|
||||
</set>
|
||||
35
lineage/res/res/anim/last_app_out.xml
Normal file
35
lineage/res/res/anim/last_app_out.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2014 The CyanogenMod 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.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate android:fromXDelta="-35%" android:toXDelta="35%"
|
||||
android:zAdjustment="top"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/fast_out_linear_in" />
|
||||
<scale android:fromXScale="1.0" android:toXScale="0.80"
|
||||
android:fromYScale="1.0" android:toYScale="0.80"
|
||||
android:pivotX="50%" android:pivotY="50%"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/linear" />
|
||||
<translate android:fromXDelta="35%" android:toXDelta="-35%"
|
||||
android:zAdjustment="bottom"
|
||||
android:startOffset="@android:integer/config_shortAnimTime"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/linear_out_slow_in" />
|
||||
<alpha android:fromAlpha="1.0" android:toAlpha="0.6"
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:interpolator="@android:interpolator/linear" />
|
||||
</set>
|
||||
@@ -143,4 +143,8 @@
|
||||
|
||||
<!-- General purpose use "unknown" string -->
|
||||
<java-symbol type="string" name="unknown" />
|
||||
|
||||
<!-- Last app switch animations -->
|
||||
<java-symbol type="anim" name="last_app_in" />
|
||||
<java-symbol type="anim" name="last_app_out" />
|
||||
</resources>
|
||||
|
||||
149
sdk/src/java/org/lineageos/internal/util/ActionUtils.java
Normal file
149
sdk/src/java/org/lineageos/internal/util/ActionUtils.java
Normal file
@@ -0,0 +1,149 @@
|
||||
package org.lineageos.internal.util;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManagerNative;
|
||||
import android.app.ActivityOptions;
|
||||
import android.app.IActivityManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.Process;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.lineageos.platform.internal.R;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ActionUtils {
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String TAG = ActionUtils.class.getSimpleName();
|
||||
private static final String SYSTEMUI_PACKAGE = "com.android.systemui";
|
||||
|
||||
/**
|
||||
* Kills the top most / most recent user application, but leaves out the launcher.
|
||||
* This is function governed by {@link Settings.Secure.KILL_APP_LONGPRESS_BACK}.
|
||||
*
|
||||
* @param context the current context, used to retrieve the package manager.
|
||||
* @param userId the ID of the currently active user
|
||||
* @return {@code true} when a user application was found and closed.
|
||||
*/
|
||||
public static boolean killForegroundApp(Context context, int userId) {
|
||||
try {
|
||||
return killForegroundAppInternal(context, userId);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not kill foreground app");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean killForegroundAppInternal(Context context, int userId)
|
||||
throws RemoteException {
|
||||
try {
|
||||
final Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||
String defaultHomePackage = "com.android.launcher";
|
||||
intent.addCategory(Intent.CATEGORY_HOME);
|
||||
final ResolveInfo res = context.getPackageManager().resolveActivity(intent, 0);
|
||||
|
||||
if (res.activityInfo != null && !res.activityInfo.packageName.equals("android")) {
|
||||
defaultHomePackage = res.activityInfo.packageName;
|
||||
}
|
||||
|
||||
IActivityManager am = ActivityManagerNative.getDefault();
|
||||
List<ActivityManager.RunningAppProcessInfo> apps = am.getRunningAppProcesses();
|
||||
for (ActivityManager.RunningAppProcessInfo appInfo : apps) {
|
||||
int uid = appInfo.uid;
|
||||
// Make sure it's a foreground user application (not system,
|
||||
// root, phone, etc.)
|
||||
if (uid >= Process.FIRST_APPLICATION_UID && uid <= Process.LAST_APPLICATION_UID
|
||||
&& appInfo.importance ==
|
||||
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
|
||||
if (appInfo.pkgList != null && (appInfo.pkgList.length > 0)) {
|
||||
for (String pkg : appInfo.pkgList) {
|
||||
if (!pkg.equals(SYSTEMUI_PACKAGE)
|
||||
&& !pkg.equals(defaultHomePackage)) {
|
||||
am.forceStopPackage(pkg, UserHandle.USER_CURRENT);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Process.killProcess(appInfo.pid);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (RemoteException remoteException) {
|
||||
// Do nothing; just let it go.
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to bring up the last activity in the stack before the current active one.
|
||||
*
|
||||
* @param context
|
||||
* @return whether an activity was found to switch to
|
||||
*/
|
||||
public static boolean switchToLastApp(Context context, int userId) {
|
||||
try {
|
||||
return switchToLastAppInternal(context, userId);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not switch to last app");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean switchToLastAppInternal(Context context, int userId)
|
||||
throws RemoteException {
|
||||
ActivityManager.RecentTaskInfo lastTask = getLastTask(context, userId);
|
||||
|
||||
if (lastTask == null || lastTask.id < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final String packageName = lastTask.baseIntent.getComponent().getPackageName();
|
||||
final IActivityManager am = ActivityManagerNative.getDefault();
|
||||
final ActivityOptions opts = ActivityOptions.makeCustomAnimation(context,
|
||||
org.lineageos.platform.internal.R.anim.last_app_in,
|
||||
org.lineageos.platform.internal.R.anim.last_app_out);
|
||||
|
||||
if (DEBUG) Log.d(TAG, "switching to " + packageName);
|
||||
am.moveTaskToFront(lastTask.id, ActivityManager.MOVE_TASK_NO_USER_ACTION, opts.toBundle());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static ActivityManager.RecentTaskInfo getLastTask(Context context, int userId)
|
||||
throws RemoteException {
|
||||
final String defaultHomePackage = resolveCurrentLauncherPackage(context, userId);
|
||||
final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
final List<ActivityManager.RecentTaskInfo> tasks = am.getRecentTasksForUser(5,
|
||||
ActivityManager.RECENT_IGNORE_UNAVAILABLE, userId);
|
||||
|
||||
for (int i = 1; i < tasks.size(); i++) {
|
||||
ActivityManager.RecentTaskInfo task = tasks.get(i);
|
||||
if (task.origActivity != null) {
|
||||
task.baseIntent.setComponent(task.origActivity);
|
||||
}
|
||||
String packageName = task.baseIntent.getComponent().getPackageName();
|
||||
if (!packageName.equals(defaultHomePackage)
|
||||
&& !packageName.equals(SYSTEMUI_PACKAGE)) {
|
||||
return tasks.get(i);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static String resolveCurrentLauncherPackage(Context context, int userId) {
|
||||
final Intent launcherIntent = new Intent(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_HOME);
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
final ResolveInfo launcherInfo = pm.resolveActivityAsUser(launcherIntent, 0, userId);
|
||||
return launcherInfo.activityInfo.packageName;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user