Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / base / AbstractFragment.java
1 package com.moiseum.wolnelektury.base;
2
3 import android.content.ComponentName;
4 import android.content.Intent;
5 import android.content.pm.ApplicationInfo;
6 import android.content.pm.PackageManager;
7 import android.net.Uri;
8 import android.os.Bundle;
9 import android.support.annotation.Nullable;
10 import android.support.customtabs.CustomTabsClient;
11 import android.support.customtabs.CustomTabsIntent;
12 import android.support.customtabs.CustomTabsServiceConnection;
13 import android.support.v4.app.Fragment;
14 import android.support.v4.content.ContextCompat;
15 import android.support.v7.widget.Toolbar;
16 import android.view.LayoutInflater;
17 import android.view.View;
18 import android.view.ViewGroup;
19 import android.widget.Toast;
20
21 import com.moiseum.wolnelektury.R;
22 import com.moiseum.wolnelektury.connection.RestClient;
23 import com.moiseum.wolnelektury.utils.SharedPreferencesUtils;
24 import com.moiseum.wolnelektury.utils.TrackerUtils;
25 import com.moiseum.wolnelektury.view.login.LoginActivity;
26
27 import java.util.List;
28
29 import butterknife.ButterKnife;
30 import butterknife.Unbinder;
31 import io.reactivex.disposables.CompositeDisposable;
32 import io.reactivex.disposables.Disposable;
33
34 /**
35  * Base fragment with view binding.
36  */
37 public abstract class AbstractFragment extends Fragment {
38
39         private static final String CHROME_PACKAGE_ID = "com.android.chrome";
40
41         private Unbinder unbinder;
42         private CompositeDisposable disposables = new CompositeDisposable();
43
44         @Nullable
45         @Override
46         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
47                 View view = inflater.inflate(getLayoutResourceId(), container, false);
48                 unbinder = ButterKnife.bind(this, view);
49                 prepareView(view, savedInstanceState);
50                 trackScreen();
51                 return view;
52         }
53
54         @Override
55         public void onDestroyView() {
56                 super.onDestroyView();
57                 unbinder.unbind();
58                 disposables.dispose();
59         }
60
61         protected void addDisposable(Disposable disposable) {
62                 this.disposables.add(disposable);
63         }
64
65         private void trackScreen() {
66                 String path = getClass().getPackage().getName();
67                 String name = getNameForTracker();
68                 TrackerUtils.trackScreen(path, name);
69         }
70
71         protected String getNameForTracker() {
72                 return getClass().getSimpleName().replaceAll("Fragment", "");
73         }
74
75         protected void setupToolbar(Toolbar toolbar) {
76                 AbstractActivity activity = (AbstractActivity) getActivity();
77                 if (activity != null) {
78                         activity.setupToolbar(toolbar);
79                 }
80         }
81
82         protected void showPayPalForm() {
83                 SharedPreferencesUtils preferences = WLApplication.getInstance().getPreferences();
84                 if (preferences.isUserLoggedIn()) {
85                         showBrowserView(Uri.parse(RestClient.WEB_PAYPAL_FORM_URL));
86                 } else {
87                         startActivity(new LoginActivity.LoginIntent(getContext()));
88                 }
89         }
90
91         protected void showBrowserView(Uri uri) {
92                 if (getActivity() != null) {
93                         if (checkForPackageExistance(CHROME_PACKAGE_ID)) {
94                                 CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
95                                         @Override
96                                         public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient client) {
97                                                 CustomTabsIntent intent = new CustomTabsIntent.Builder()
98                                                                 .setToolbarColor(ContextCompat.getColor(getActivity(), R.color.colorAccent))
99                                                                 .build();
100
101                                                 client.warmup(0L);
102                                                 intent.launchUrl(getActivity(), uri);
103                                         }
104
105                                         @Override
106                                         public void onServiceDisconnected(ComponentName name) {
107
108                                         }
109                                 };
110                                 CustomTabsClient.bindCustomTabsService(getActivity(), CHROME_PACKAGE_ID, connection);
111                         } else {
112                                 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
113                                 if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
114                                         startActivity(intent);
115                                 } else {
116                                         Toast.makeText(getActivity(), R.string.install_chrome, Toast.LENGTH_LONG).show();
117                                 }
118                         }
119                 }
120         }
121
122         protected void showShareActivity(String shareUrl) {
123                 Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
124                 sharingIntent.setType("text/plain");
125                 sharingIntent.putExtra(Intent.EXTRA_TEXT, shareUrl);
126                 startActivity(Intent.createChooser(sharingIntent, getString(R.string.share)));
127         }
128
129         private boolean checkForPackageExistance(String targetPackage) {
130                 List<ApplicationInfo> packages;
131                 PackageManager pm;
132
133                 pm = getActivity().getPackageManager();
134                 packages = pm.getInstalledApplications(0);
135                 for (ApplicationInfo packageInfo : packages) {
136                         if (packageInfo.packageName.equals(targetPackage)) {
137                                 return true;
138                         }
139                 }
140                 return false;
141         }
142
143         /**
144          * Providing layout resource ID for inflating.
145          *
146          * @return layout resource ID.
147          */
148         public abstract int getLayoutResourceId();
149
150         /**
151          * Method called from @link{BindingFragment#onCreateView}. This will be the place to setup view stuff.
152          *
153          * @param view inflated View.
154          * @param savedInstanceState Bundle with current instance state.
155          */
156         public abstract void prepareView(View view, Bundle savedInstanceState);
157 }