001package com.gigya.android.sdk.ui; 002 003import android.content.Context; 004import android.content.Intent; 005import android.os.Bundle; 006import android.support.annotation.NonNull; 007import android.support.annotation.Nullable; 008import android.support.v7.app.AppCompatActivity; 009import android.view.View; 010import android.view.ViewGroup; 011import android.widget.FrameLayout; 012import android.widget.ProgressBar; 013 014import java.util.ArrayList; 015import java.util.List; 016 017public class HostActivity extends AppCompatActivity { 018 019 public static final String EXTRA_LIFECYCLE_CALLBACKS_ID = "lifecycleCallbacks_id"; 020 021 private HostActivityLifecycleCallbacks _lifecycleCallbacks; 022 private int _lifecycleCallbacksId = -1; 023 024 private FrameLayout _mainFrame; 025 private ProgressBar _progressBar; 026 027 public static void present(Context context, HostActivityLifecycleCallbacks lifecycleCallbacks) { 028 Intent intent = new Intent(context, HostActivity.class); 029 intent.putExtra(EXTRA_LIFECYCLE_CALLBACKS_ID, Presenter.addLifecycleCallbacks(lifecycleCallbacks)); 030 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); 031 context.startActivity(intent); 032 } 033 034 public HostActivityLifecycleCallbacks getLifecycleCallbacks() { 035 return _lifecycleCallbacks; 036 } 037 038 @Override 039 protected void onCreate(@Nullable Bundle savedInstanceState) { 040 super.onCreate(savedInstanceState); 041 042 _mainFrame = new FrameLayout(this); 043 addProgressBar(); 044 045 setContentView(_mainFrame); 046 047 if (getIntent() != null && getIntent().getExtras() != null) { 048 _lifecycleCallbacksId = getIntent().getIntExtra(EXTRA_LIFECYCLE_CALLBACKS_ID, -1); 049 if (_lifecycleCallbacksId == -1) { 050 finish(); 051 return; 052 } 053 _lifecycleCallbacks = Presenter.getCallbacks(_lifecycleCallbacksId); 054 } 055 056 if (_lifecycleCallbacks != null) { 057 _lifecycleCallbacks.onCreate(this, savedInstanceState); 058 } 059 } 060 061 @Override 062 protected void onStart() { 063 super.onStart(); 064 if (_lifecycleCallbacks != null) { 065 _lifecycleCallbacks.onStart(this); 066 } 067 } 068 069 @Override 070 protected void onResume() { 071 super.onResume(); 072 if (_lifecycleCallbacks != null) { 073 _lifecycleCallbacks.onResume(this); 074 } 075 } 076 077 @Override 078 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 079 super.onActivityResult(requestCode, resultCode, data); 080 if (_lifecycleCallbacks != null) { 081 _lifecycleCallbacks.onActivityResult(this, requestCode, resultCode, data); 082 } 083 } 084 085 @Override 086 protected void onNewIntent(Intent intent) { 087 super.onNewIntent(intent); 088 if (_lifecycleCallbacks != null) { 089 _lifecycleCallbacks.onNewIntent(this, intent); 090 } 091 } 092 093 @Override 094 public void finish() { 095 Presenter.flushLifecycleCallbacks(_lifecycleCallbacksId); 096 super.finish(); 097 /* 098 Disable exit animation. 099 */ 100 overridePendingTransition(0, 0); 101 } 102 103 private void addProgressBar() { 104 _progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleSmall); 105 _progressBar.setIndeterminate(true); 106 _progressBar.setVisibility(View.GONE); // Default behaviour is hidden. 107 _mainFrame.addView(_progressBar, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 108 } 109 110 //region ONKEY HANDLING 111 112 public interface OnBackPressListener { 113 boolean onBackPressed(); 114 } 115 116 private final List<OnBackPressListener> backPressHandlerList = new ArrayList<>(); 117 118 public void addBackPressListener(@NonNull OnBackPressListener handler) { 119 backPressHandlerList.add(handler); 120 } 121 122 public void removeBackPressListener(@NonNull OnBackPressListener handler) { 123 backPressHandlerList.remove(handler); 124 } 125 126 @Override 127 public void onBackPressed() { 128 if (backPressHandlerList.size() == 0) { 129 super.onBackPressed(); 130 } 131 for (OnBackPressListener listener : backPressHandlerList) { 132 if (!listener.onBackPressed()) { 133 super.onBackPressed(); 134 } 135 } 136 } 137 138 //endregion 139 140 //region UI BINDINGS 141 142 public void showProgress() { 143 if (_progressBar.getVisibility() == View.GONE) { 144 _progressBar.setVisibility(View.VISIBLE); 145 } 146 } 147 148 public void dismissProgress() { 149 if (_progressBar.getVisibility() == View.VISIBLE) { 150 _progressBar.setVisibility(View.GONE); 151 } 152 } 153 154 public static abstract class HostActivityLifecycleCallbacks { 155 156 public abstract void onCreate(AppCompatActivity activity, @Nullable Bundle savedInstanceState); 157 158 public void onStart(AppCompatActivity activity) { 159 // Stub. 160 } 161 162 public void onResume(AppCompatActivity activity) { 163 // Stub. 164 } 165 166 public void onActivityResult(AppCompatActivity activity, int requestCode, int resultCode, @Nullable Intent data) { 167 // Stub. 168 } 169 170 public void onNewIntent(AppCompatActivity activity, Intent intent) { 171 // Stub. 172 } 173 } 174 175 //endregion 176 177}