improve view manager

This commit is contained in:
Yuriy Liskov
2020-09-22 05:23:24 +03:00
parent b79f223d05
commit a1c371b9bf
4 changed files with 216 additions and 62 deletions
@@ -52,7 +52,7 @@ public class PlaybackPresenter implements Presenter<PlaybackView> {
public void openVideo(Object parentView, Video item) {
mMainPlayerEventBridge.setParentView(parentView);
mMainPlayerEventBridge.openVideo(item);
mViewManager.startView(parentView, PlaybackView.class);
mViewManager.startView(PlaybackView.class);
}
public void openVideo(String videoId) {
@@ -6,26 +6,26 @@ import android.content.Context;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.liskovsoft.sharedutils.mylogger.Log;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class ViewManager {
private static final String PARENT_ACTIVITY = "PARENT_ACTIVITY";
private static final String TAG = ViewManager.class.getSimpleName();
private static ViewManager sInstance;
private final Context mContext;
private final Map<Class<?>, Class<? extends Activity>> mViewMapping;
private final Map<Class<? extends Activity>, Class<? extends Activity>> mParentMapping;
private Class<?> mDefaultActivity;
private final Stack<Class<?>> mActivityStack;
private Class<?> mRootActivity;
private ViewManager(Context context) {
mContext = context;
mViewMapping = new HashMap<>();
mParentMapping = new HashMap<>();
mActivityStack = new Stack<>();
}
public static ViewManager instance(Context context) {
@@ -67,26 +67,15 @@ public class ViewManager {
}
}
public void startView(Object parentView, Class<?> viewClass) {
if (parentView instanceof Fragment) {
Fragment fragment = (Fragment) parentView;
Class<?> activityClass = mViewMapping.get(viewClass);
if (activityClass != null) {
Intent intent = new Intent(fragment.getActivity(), activityClass);
intent.putExtra(PARENT_ACTIVITY, fragment.getActivity().getClass().getName());
fragment.startActivity(intent);
} else {
Log.e(TAG, "Activity not registered for view " + viewClass.getSimpleName());
}
}
}
public void startParentView(Activity activity) {
if (activity.getIntent() != null) {
Class<?> parentActivity = getParent(activity);
removeTopActivity();
Class<?> parentActivity = getTopActivity();
if (parentActivity == null) {
parentActivity = getDefaultParent(activity);
}
if (parentActivity == null) {
Log.d(TAG, "Parent activity name doesn't stored in registry. Exiting to Home...");
@@ -96,7 +85,6 @@ public class ViewManager {
try {
Log.d(TAG, "Launching parent activity...");
setDefault(null); // current activity is finished, so do reset
Intent intent = new Intent(activity, parentActivity);
activity.startActivity(intent);
@@ -107,26 +95,50 @@ public class ViewManager {
}
}
private Class<?> getParent(Activity activity) {
Class<?> parentActivity = null;
String parentActivityName = null;
public void startDefaultView(Context context) {
Class<?> lastActivity = null;
if (activity.getIntent() != null) {
parentActivityName = activity.getIntent().getStringExtra(PARENT_ACTIVITY);
if (!mActivityStack.isEmpty()) {
lastActivity = mActivityStack.peek();
}
if (parentActivityName != null) {
try {
parentActivity = Class.forName(parentActivityName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
Log.e(TAG, "Activity class not found.");
}
} else {
parentActivity = getDefaultParent(activity);
if (lastActivity == null) {
lastActivity = mRootActivity;
}
return parentActivity;
Log.d(TAG, "Starting activity: " + lastActivity.getSimpleName());
Intent intent = new Intent(context, lastActivity);
context.startActivity(intent);
}
public void addTopActivity(@Nullable Class<?> activity) {
if (!mActivityStack.isEmpty() && mActivityStack.peek() == activity) {
return;
}
mActivityStack.push(activity);
}
private void removeTopActivity() {
if (!mActivityStack.isEmpty()) {
mActivityStack.pop();
}
}
private Class<?> getTopActivity() {
Class<?> result = null;
if (!mActivityStack.isEmpty()) {
result = mActivityStack.peek();
}
return result;
}
public void setRoot(@NonNull Class<?> rootActivity) {
mRootActivity = rootActivity;
}
private Class<?> getDefaultParent(Activity activity) {
@@ -140,26 +152,4 @@ public class ViewManager {
return parentActivity;
}
public void startDefaultView(Activity activity) {
Class<?> lastActivity = mDefaultActivity;
if (lastActivity == null) {
lastActivity = mRootActivity;
}
Log.d(TAG, "Starting activity: " + lastActivity.getSimpleName());
Intent intent = new Intent(activity, lastActivity);
activity.startActivity(intent);
}
public void setDefault(@Nullable Class<?> defaultActivity) {
mDefaultActivity = defaultActivity;
}
public void setRoot(@NonNull Class<?> rootActivity) {
mRootActivity = rootActivity;
}
}
@@ -0,0 +1,165 @@
package com.liskovsoft.smartyoutubetv2.common.app.views;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.liskovsoft.sharedutils.mylogger.Log;
import java.util.HashMap;
import java.util.Map;
public class ViewManagerOld {
private static final String PARENT_ACTIVITY = "PARENT_ACTIVITY";
private static final String TAG = ViewManagerOld.class.getSimpleName();
private static ViewManagerOld sInstance;
private final Context mContext;
private final Map<Class<?>, Class<? extends Activity>> mViewMapping;
private final Map<Class<? extends Activity>, Class<? extends Activity>> mParentMapping;
private Class<?> mDefaultActivity;
private Class<?> mRootActivity;
private ViewManagerOld(Context context) {
mContext = context;
mViewMapping = new HashMap<>();
mParentMapping = new HashMap<>();
}
public static ViewManagerOld instance(Context context) {
if (sInstance == null) {
sInstance = new ViewManagerOld(context.getApplicationContext());
}
return sInstance;
}
public void register(Class<?> viewClass, Class<? extends Activity> activityClass) {
register(viewClass, activityClass, null);
}
public void register(Class<?> viewClass, Class<? extends Activity> activityClass, Class<? extends Activity> parentActivityClass) {
mViewMapping.put(viewClass, activityClass);
if (parentActivityClass != null) {
mParentMapping.put(activityClass, parentActivityClass);
}
}
public void unregister(Class<?> viewClass) {
mViewMapping.remove(viewClass);
}
public void startView(Class<?> viewClass) {
Class<?> activityClass = mViewMapping.get(viewClass);
if (activityClass != null) {
Intent intent = new Intent(mContext, activityClass);
// Fix: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
} else {
Log.e(TAG, "Activity not registered for view " + viewClass.getSimpleName());
}
}
public void startView(Object parentView, Class<?> viewClass) {
if (parentView instanceof Fragment) {
Fragment fragment = (Fragment) parentView;
Class<?> activityClass = mViewMapping.get(viewClass);
if (activityClass != null) {
Intent intent = new Intent(fragment.getActivity(), activityClass);
intent.putExtra(PARENT_ACTIVITY, fragment.getActivity().getClass().getName());
fragment.startActivity(intent);
} else {
Log.e(TAG, "Activity not registered for view " + viewClass.getSimpleName());
}
}
}
public void startParentView(Activity activity) {
if (activity.getIntent() != null) {
Class<?> parentActivity = getParent(activity);
if (parentActivity == null) {
Log.d(TAG, "Parent activity name doesn't stored in registry. Exiting to Home...");
activity.moveTaskToBack(true);
return;
}
try {
Log.d(TAG, "Launching parent activity...");
setDefault(null); // current activity is finished, so do reset
Intent intent = new Intent(activity, parentActivity);
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
Log.e(TAG, "Parent activity not found.");
}
}
}
private Class<?> getParent(Activity activity) {
Class<?> parentActivity = null;
String parentActivityName = null;
if (activity.getIntent() != null) {
parentActivityName = activity.getIntent().getStringExtra(PARENT_ACTIVITY);
}
if (parentActivityName != null) {
try {
parentActivity = Class.forName(parentActivityName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
Log.e(TAG, "Activity class not found.");
}
} else {
parentActivity = getDefaultParent(activity);
}
return parentActivity;
}
private Class<?> getDefaultParent(Activity activity) {
Class<?> parentActivity = null;
for (Class<?> activityClass : mParentMapping.keySet()) {
if (activityClass.isInstance(activity)) {
parentActivity = mParentMapping.get(activityClass);
}
}
return parentActivity;
}
public void startDefaultView(Activity activity) {
Class<?> lastActivity = mDefaultActivity;
if (lastActivity == null) {
lastActivity = mRootActivity;
}
Log.d(TAG, "Starting activity: " + lastActivity.getSimpleName());
Intent intent = new Intent(activity, lastActivity);
activity.startActivity(intent);
}
public void setDefault(@Nullable Class<?> defaultActivity) {
mDefaultActivity = defaultActivity;
}
public void setRoot(@NonNull Class<?> rootActivity) {
mRootActivity = rootActivity;
}
}
@@ -7,7 +7,6 @@ import android.view.KeyEvent;
import androidx.fragment.app.FragmentActivity;
import com.liskovsoft.sharedutils.mylogger.Log;
import com.liskovsoft.smartyoutubetv2.common.app.views.ViewManager;
import com.liskovsoft.smartyoutubetv2.tv.ui.main.MainApplication;
import com.liskovsoft.smartyoutubetv2.tv.ui.search.SearchActivity;
/**
@@ -57,7 +56,7 @@ public abstract class LeanbackActivity extends FragmentActivity {
mBackgroundManager.onStart();
// we can't do it in the ViewManager because activity may be started from outside
mViewManager.setDefault(this.getClass());
mViewManager.addTopActivity(this.getClass());
}
@Override