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}