summaryrefslogtreecommitdiffstats
path: root/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/TabSessionManager.java
blob: 83bd4fa14eba53faf12de55c013e90084d39dab7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.geckoview_example;

import androidx.annotation.Nullable;
import java.util.ArrayList;
import org.mozilla.geckoview.GeckoSession;
import org.mozilla.geckoview.GeckoSessionSettings;
import org.mozilla.geckoview.WebExtension;

public class TabSessionManager {
  private static ArrayList<TabSession> mTabSessions = new ArrayList<>();
  private int mCurrentSessionIndex = 0;
  private TabObserver mTabObserver;
  private boolean mTrackingProtection;

  public interface TabObserver {
    void onCurrentSession(TabSession session);
  }

  public TabSessionManager() {}

  public void unregisterWebExtension() {
    for (final TabSession session : mTabSessions) {
      session.action = null;
    }
  }

  public void setWebExtensionDelegates(
      WebExtension extension,
      WebExtension.ActionDelegate actionDelegate,
      WebExtension.SessionTabDelegate tabDelegate) {
    for (final TabSession session : mTabSessions) {
      final WebExtension.SessionController sessionController = session.getWebExtensionController();
      sessionController.setActionDelegate(extension, actionDelegate);
      sessionController.setTabDelegate(extension, tabDelegate);
    }
  }

  public void setUseTrackingProtection(boolean trackingProtection) {
    if (trackingProtection == mTrackingProtection) {
      return;
    }
    mTrackingProtection = trackingProtection;

    for (final TabSession session : mTabSessions) {
      session.getSettings().setUseTrackingProtection(trackingProtection);
    }
  }

  public void setTabObserver(TabObserver observer) {
    mTabObserver = observer;
  }

  public void addSession(TabSession session) {
    mTabSessions.add(session);
  }

  public TabSession getSession(int index) {
    if (index >= mTabSessions.size() || index < 0) {
      return null;
    }
    return mTabSessions.get(index);
  }

  public TabSession getCurrentSession() {
    return getSession(mCurrentSessionIndex);
  }

  public TabSession getSession(GeckoSession session) {
    int index = mTabSessions.indexOf(session);
    if (index == -1) {
      return null;
    }
    return getSession(index);
  }

  public void setCurrentSession(TabSession session) {
    int index = mTabSessions.indexOf(session);
    if (index == -1) {
      mTabSessions.add(session);
      index = mTabSessions.size() - 1;
    }
    mCurrentSessionIndex = index;

    if (mTabObserver != null) {
      mTabObserver.onCurrentSession(session);
    }
  }

  private boolean isCurrentSession(TabSession session) {
    return session == getCurrentSession();
  }

  public void closeSession(@Nullable TabSession session) {
    if (session == null) {
      return;
    }
    if (isCurrentSession(session) && mCurrentSessionIndex == mTabSessions.size() - 1) {
      --mCurrentSessionIndex;
    }
    session.close();
    mTabSessions.remove(session);
  }

  public TabSession newSession(GeckoSessionSettings settings) {
    TabSession tabSession = new TabSession(settings);
    mTabSessions.add(tabSession);
    return tabSession;
  }

  public int sessionCount() {
    return mTabSessions.size();
  }

  public ArrayList<TabSession> getSessions() {
    return mTabSessions;
  }
}