blob: 8484936d9d3fb2f75792224fe96761d96db5f0ff [file] [log] [blame]
/*
* Copyright (C) 2018 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.example.android.intentplayground;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.AppTask;
import android.app.ActivityManager.RecentTaskInfo;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.android.intentplayground.InlineAdapter.TaskViewHolder;
import com.example.android.intentplayground.Tracking.Task;
import java.util.Collections;
import java.util.List;
public class InlineAdapter extends RecyclerView.Adapter<TaskViewHolder> {
private final List<Task> mTasks;
private int mCurrentTaskIndex;
private FragmentActivity mActivity;
public InlineAdapter(List<Task> tasks, FragmentActivity activity) {
this.mActivity = activity;
this.mTasks = tasks;
this.mCurrentTaskIndex = indexOfRunningTask();
}
public int indexOfRunningTask() {
int currentTaskId = mActivity.getTaskId();
int index = 0;
for (int i = 0; i < mTasks.size(); i++) {
Task task = mTasks.get(i);
if (task.id == currentTaskId) {
index = i;
break;
}
}
return index;
}
@NonNull
@Override
public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View task = LayoutInflater.from(parent.getContext())
.inflate(R.layout.tree_node_composite, parent, false);
return new TaskViewHolder(task);
}
@Override
public void onBindViewHolder(@NonNull TaskViewHolder holder, int position) {
boolean highLightRunningActivity = position == mCurrentTaskIndex;
holder.setTask(mTasks.get(position), mActivity.getSupportFragmentManager(),
highLightRunningActivity);
}
@Override
public int getItemCount() {
return mTasks.size();
}
public static class TaskViewHolder extends RecyclerView.ViewHolder {
private final TextView mTaskIdTextView;
private final LinearLayout mActivitiesLayout;
public TaskViewHolder(@NonNull View itemView) {
super(itemView);
mTaskIdTextView = itemView.findViewById(R.id.task_id);
mActivitiesLayout = itemView.findViewById(R.id.activity_node_container);
}
public void setTask(Task task, FragmentManager manager, boolean highLightRunningActivity) {
mTaskIdTextView.setText(task.id == Node.NEW_TASK_ID
? mTaskIdTextView.getContext().getString(R.string.new_task)
: String.valueOf(task.id));
int taskColor = mTaskIdTextView.getContext()
.getResources().getColor(ColorManager.getColorForTask(task.id),
null /* theme */);
mTaskIdTextView.setTextColor(taskColor);
mActivitiesLayout.removeAllViews();
for (Activity activity : task.mActivities) {
View activityView = LayoutInflater.from(mActivitiesLayout.getContext())
.inflate(R.layout.activity_node, mActivitiesLayout, false);
TextView activityName = activityView.findViewById(R.id.activity_name);
activityName.setText(activity.getComponentName().getShortClassName());
activityName.setOnClickListener(clickedView -> {
Intent intent = activity.getIntent();
List<String> flags;
if (intent != null) {
flags = FlagUtils.discoverFlags(intent);
if (flags.size() == 0) {
flags.add("None");
}
} else {
flags = Collections.singletonList("None");
}
showDialogWithFlags(manager, activity.getComponentName().getShortClassName(),
flags, task.id);
});
if (highLightRunningActivity) {
highLightRunningActivity = false;
activityName.setTextColor(taskColor);
}
mActivitiesLayout.addView(activityView);
}
}
/**
* Shows a dialog with a list.
*
* @param shortClassName The activity name and title of the dialog.
* @param flags The flags to list.
*/
private void showDialogWithFlags(FragmentManager manager,
String shortClassName, List<String> flags, int taskId) {
IntentDialogFragment.newInstance(shortClassName, flags, taskId).show(manager,
"intentDialog");
}
}
}