116 lines
4.7 KiB
Java
116 lines
4.7 KiB
Java
package androidx.core.app;
|
|
|
|
import android.app.Activity;
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.pm.ActivityInfo;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import c.d.b.a.a;
|
|
public final class NavUtils {
|
|
public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
|
|
private static final String TAG = "NavUtils";
|
|
|
|
private NavUtils() {
|
|
}
|
|
|
|
@Nullable
|
|
public static Intent getParentActivityIntent(@NonNull Activity activity) {
|
|
Intent parentActivityIntent = activity.getParentActivityIntent();
|
|
if (parentActivityIntent != null) {
|
|
return parentActivityIntent;
|
|
}
|
|
String parentActivityName = getParentActivityName(activity);
|
|
if (parentActivityName == null) {
|
|
return null;
|
|
}
|
|
ComponentName componentName = new ComponentName(activity, parentActivityName);
|
|
try {
|
|
return getParentActivityName(activity, componentName) == null ? Intent.makeMainActivity(componentName) : new Intent().setComponent(componentName);
|
|
} catch (PackageManager.NameNotFoundException unused) {
|
|
Log.e(TAG, "getParentActivityIntent: bad parentActivityName '" + parentActivityName + "' in manifest");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
public static Intent getParentActivityIntent(@NonNull Context context, @NonNull ComponentName componentName) throws PackageManager.NameNotFoundException {
|
|
String parentActivityName = getParentActivityName(context, componentName);
|
|
if (parentActivityName == null) {
|
|
return null;
|
|
}
|
|
ComponentName componentName2 = new ComponentName(componentName.getPackageName(), parentActivityName);
|
|
return getParentActivityName(context, componentName2) == null ? Intent.makeMainActivity(componentName2) : new Intent().setComponent(componentName2);
|
|
}
|
|
|
|
@Nullable
|
|
public static Intent getParentActivityIntent(@NonNull Context context, @NonNull Class<?> cls) throws PackageManager.NameNotFoundException {
|
|
String parentActivityName = getParentActivityName(context, new ComponentName(context, cls));
|
|
if (parentActivityName == null) {
|
|
return null;
|
|
}
|
|
ComponentName componentName = new ComponentName(context, parentActivityName);
|
|
return getParentActivityName(context, componentName) == null ? Intent.makeMainActivity(componentName) : new Intent().setComponent(componentName);
|
|
}
|
|
|
|
@Nullable
|
|
public static String getParentActivityName(@NonNull Activity activity) {
|
|
try {
|
|
return getParentActivityName(activity, activity.getComponentName());
|
|
} catch (PackageManager.NameNotFoundException e) {
|
|
throw new IllegalArgumentException(e);
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
public static String getParentActivityName(@NonNull Context context, @NonNull ComponentName componentName) throws PackageManager.NameNotFoundException {
|
|
String string;
|
|
PackageManager packageManager = context.getPackageManager();
|
|
int i = Build.VERSION.SDK_INT;
|
|
int i2 = 640;
|
|
if (i >= 29) {
|
|
i2 = 269222528;
|
|
} else if (i >= 24) {
|
|
i2 = 787072;
|
|
}
|
|
ActivityInfo activityInfo = packageManager.getActivityInfo(componentName, i2);
|
|
String str = activityInfo.parentActivityName;
|
|
if (str != null) {
|
|
return str;
|
|
}
|
|
Bundle bundle = activityInfo.metaData;
|
|
if (bundle == null || (string = bundle.getString(PARENT_ACTIVITY)) == null) {
|
|
return null;
|
|
}
|
|
if (string.charAt(0) != '.') {
|
|
return string;
|
|
}
|
|
return context.getPackageName() + string;
|
|
}
|
|
|
|
public static void navigateUpFromSameTask(@NonNull Activity activity) {
|
|
Intent parentActivityIntent = getParentActivityIntent(activity);
|
|
if (parentActivityIntent != null) {
|
|
navigateUpTo(activity, parentActivityIntent);
|
|
return;
|
|
}
|
|
StringBuilder R = a.R("Activity ");
|
|
R.append(activity.getClass().getSimpleName());
|
|
R.append(" does not have a parent activity name specified. (Did you forget to add the android.support.PARENT_ACTIVITY <meta-data> element in your manifest?)");
|
|
throw new IllegalArgumentException(R.toString());
|
|
}
|
|
|
|
public static void navigateUpTo(@NonNull Activity activity, @NonNull Intent intent) {
|
|
activity.navigateUpTo(intent);
|
|
}
|
|
|
|
public static boolean shouldUpRecreateTask(@NonNull Activity activity, @NonNull Intent intent) {
|
|
return activity.shouldUpRecreateTask(intent);
|
|
}
|
|
}
|