Allow to launch activity without specifying display id

- Add a dropdown item to not set launch display id.
- Default don't set launch display id.

In general use cases, activity should be launched on the
display where the caller resides.

Bug: 112451761
Test: Create a virtual display with system decoration support,
      launch an activity from shortcut and check if the activity
      runs on the same display.

Change-Id: Iab2fd21402c7aa0e245ebfeb3698aaa22cb30e18
This commit is contained in:
Riddle Hsu
2018-11-21 16:41:13 +08:00
parent 43b9a1084a
commit ff3874d082

View File

@@ -69,8 +69,8 @@ public class LauncherActivity extends FragmentActivity implements AppPickedCallb
PopupMenu.OnMenuItemClickListener {
private Spinner mDisplaySpinner;
private List<Display> mDisplayList;
private int mSelectedDisplayId;
private ArrayAdapter<DisplayItem> mDisplayAdapter;
private int mSelectedDisplayId = Display.INVALID_DISPLAY;
private View mScrimView;
private AppListAdapter mAppListAdapter;
private AppListAdapter mPinnedAppListAdapter;
@@ -101,14 +101,18 @@ public class LauncherActivity extends FragmentActivity implements AppPickedCallb
mDisplaySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
mSelectedDisplayId = mDisplayList.get(i).getDisplayId();
mSelectedDisplayId = mDisplayAdapter.getItem(i).mId;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
mSelectedDisplayId = -1;
mSelectedDisplayId = Display.INVALID_DISPLAY;
}
});
mDisplayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,
new ArrayList<DisplayItem>());
mDisplayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mDisplaySpinner.setAdapter(mDisplayAdapter);
final ViewModelProvider viewModelProvider = new ViewModelProvider(getViewModelStore(),
new AndroidViewModelFactory((Application) getApplicationContext()));
@@ -209,44 +213,33 @@ public class LauncherActivity extends FragmentActivity implements AppPickedCallb
}
}
private void refreshDisplayPicker(View view) {
final WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
final int currentDisplayId = wm.getDefaultDisplay().getDisplayId();
final DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
mDisplayList = Arrays.asList(dm.getDisplays());
final List<String> spinnerItems = new ArrayList<>();
private void refreshDisplayPicker() {
refreshDisplayPicker(mAppDrawerView);
}
int preferredDisplayPosition = -1;
int biggestId = -1, biggestPos = -1;
for (int i = 0; i < mDisplayList.size(); i++) {
final Display display = mDisplayList.get(i);
private void refreshDisplayPicker(View view) {
final int currentDisplayId = view.getDisplay().getDisplayId();
final DisplayManager dm = getSystemService(DisplayManager.class);
mDisplayAdapter.setNotifyOnChange(false);
mDisplayAdapter.clear();
mDisplayAdapter.add(new DisplayItem(Display.INVALID_DISPLAY, "Do not specify display"));
for (Display display : dm.getDisplays()) {
final int id = display.getDisplayId();
final boolean isDisplayPrivate = (display.getFlags() & Display.FLAG_PRIVATE) != 0;
final boolean isCurrentDisplay = id == currentDisplayId;
if (isCurrentDisplay) {
preferredDisplayPosition = i;
}
final StringBuilder sb = new StringBuilder();
if (isCurrentDisplay) {
sb.append("[Current display] ");
}
sb.append(id).append(": ").append(display.getName());
if (isDisplayPrivate) {
sb.append(" (private)");
}
spinnerItems.add(sb.toString());
if (display.getDisplayId() > biggestId) {
biggestId = display.getDisplayId();
biggestPos = i;
if (isCurrentDisplay) {
sb.append(" [Current display]");
}
mDisplayAdapter.add(new DisplayItem(id, sb.toString()));
}
mSelectedDisplayId = mDisplayList.get(preferredDisplayPosition).getDisplayId();
final ArrayAdapter<String> displayAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, spinnerItems);
displayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mDisplaySpinner.setAdapter(displayAdapter);
mDisplaySpinner.setSelection(preferredDisplayPosition);
mDisplayAdapter.notifyDataSetChanged();
}
/**
@@ -283,7 +276,7 @@ public class LauncherActivity extends FragmentActivity implements AppPickedCallb
mAppDrawerView.setVisibility(View.VISIBLE);
mScrimView.setVisibility(View.VISIBLE);
mFab.setVisibility(View.INVISIBLE);
refreshDisplayPicker(null);
refreshDisplayPicker();
} else {
mAppDrawerShown = false;
mScrimView.setVisibility(View.INVISIBLE);
@@ -307,4 +300,19 @@ public class LauncherActivity extends FragmentActivity implements AppPickedCallb
return ViewAnimationUtils.createCircularReveal(view, view.getRight(), view.getBottom(),
open ? 0 : radius, open ? radius : 0);
}
private static class DisplayItem {
final int mId;
final String mDescription;
DisplayItem(int displayId, String description) {
mId = displayId;
mDescription = description;
}
@Override
public String toString() {
return mDescription;
}
}
}