Faits :
A.
Condamné à une peine privative de liberté de 48 mois, notamment pour tentative de meurtre, A._ a été incarcéré à la Prison du Bois-Mermet le 19 février 2016 puis a été transféré aux Établissements de la Plaine de l'Orbe, le 7 décembre 2018.
Le 7 août 2019, A._ a déposé une demande tendant à ce que soit constaté le caractère illicite de ses conditions de détention à la Prison du Bois-Mermet, pour la période du 19 février 2018 au 6 décembre 2018.
Par ordonnance du 23 septembre 2019, le Tribunal des mesures de contrainte du canton de Vaud (ci-après: TMC) a constaté que les conditions de la détention subie par A._ avant jugement, entre le 19 février 2018 et le 6 août 2018, à la Prison du Bois-Mermet étaient conformes aux dispositions légales (cause n° PC.015880-BRB).
Par ordonnance du même jour, le Juge d'application des peines a rejeté la demande déposée le 7 août 2019 par A._ et a constaté que les conditions de la détention en exécution de peine, entre le 7 août 2018 et le 6 décembre 2018, à la Prison du Bois-Mermet étaient conformes aux dispositions légales (cause n° AP19.017821-BRB).
B.
Par arrêts du 15 octobre 2019, la Chambre des recours pénale du Tribunal cantonal vaudois (ci-après: CRP) a rejeté les recours formés par A._ contre les ordonnances précitées, qu'elle a confirmées (arrêt CRP 836/2019 dans la cause n° PC.015880-BRB et arrêt CRP 835/2019 dans la cause n° AP19.017821-BRB).
C.
A._ forme un recours contre chacune des décisions cantonales auprès du Tribunal fédéral et conclut, avec suite de frais et dépens, à leur annulation et au constat de l'illicéité des conditions de détention du 19 février 2018 au 6 août 2018 (cause 6B_104/2020; arrêt cantonal CRP 836/2019 PC.015880-BRB) ainsi que du 7 août 2018 au 6 décembre 2018 (cause 6B_103/2020; arrêt cantonal CRP 835/2019 AP19.017821-BRB). Il sollicite en outre le bénéfice de l'assistance judiciaire.
Considérant en droit :
1.
Les deux recours visent des décisions similaires, rendues parallèlement. Ils ont trait au même complexe de faits et posent des questions essentiellement identiques sur le plan juridique. Il y a lieu de joindre les causes et de les traiter en un seul arrêt (art. 24 al. 2 PCF et 71 LTF).
2.
Le recourant reproche à la cour cantonale de ne pas avoir tenu compte d'une ordonnance du 2 octobre 2018 du TMC relative à ses conditions de détention entre le 19 février 2016 et le 19 février 2018, à savoir la période précédant immédiatement celle en cause. Cette ordonnance, produite en annexe à sa demande du 7 août 2019, constatait l'illicéité de ses conditions de détention pendant cette période. Le recourant considère que la cour cantonale a ignoré cette pièce essentielle de la procédure, de manière arbitraire. Il invoque une violation de son droit d'être entendu et de son droit à la preuve sur ce point.
2.1.
2.1.1. Le droit d'être entendu, tel qu'il est garanti par l'art. 29 al. 2 Cst., comprend notamment pour le justiciable le droit de s'exprimer sur les éléments pertinents avant qu'une décision ne soit prise touchant sa situation juridique, d'obtenir l'administration des preuves pertinentes et valablement offertes, de participer à l'administration des preuves essentielles et de se déterminer sur son résultat lorsque cela est de nature à influer sur la décision à rendre (ATF 145 I 73 consid. 7.2.2.1 p. 103).
Le Tribunal fédéral peut exceptionnellement réparer une violation du droit d'être entendu s'il dispose d'un libre pouvoir de cognition, autrement dit lorsque seules des questions de droit demeurent litigieuses et qu'il n'en résulte aucun préjudice pour le justiciable (ATF 142 III 48 consid. 4.3 p. 55 et les références citées).
2.1.2. L'art. 3 CEDH prévoit que nul ne peut être soumis à la torture ni à des peines ou traitements inhumains ou dégradants. Sur le plan constitutionnel, l'art. 7 Cst. prescrit de son côté que la dignité humaine doit être respectée et protégée. A teneur de l'art. 10 al. 3 Cst., la torture et tout autre traitement ou peine cruels, inhumains ou dégradants sont interdits. Un traitement dénoncé comme contraire à l'art. 3 CEDH doit atteindre un niveau d'humiliation ou d'avilissement supérieur à ce qu'emporte habituellement la privation de liberté. La gravité de cette atteinte est appréciée au regard de l'ensemble des données de la cause, considérées globalement, notamment de la nature et du contexte du traitement ainsi que de sa durée (ATF 141 I 141 consid. 6.3.4 p. 146 s.; 139 I 272 consid. 4 p. 278 et les arrêts cités).
2.2. Dans les arrêts attaqués, la cour cantonale n'a pas tenu compte de l'ordonnance du 2 octobre 2018 du TMC. Dans l'arrêt concernant les conditions de détention avant jugement, la cour cantonale a relevé que cette pièce ne figurait pas au dossier et n'avait pas été produite, de sorte qu'elle n'avait pas connaissance de ses considérants. Au demeurant, elle a estimé que, dans la mesure où le recourant n'occupait auparavant pas la cellule dont il se plaignait dans la procédure en cause, il ne pouvait rien déduire de l'ordonnance du 2 octobre 2018 pour faire constater que les conditions de sa détention dans sa nouvelle cellule étaient illicites (arrêt CRP 836/2019, consid. 3 p. 7).
2.3. Un tel raisonnement ne saurait être suivi. Ainsi que le relève le recourant, l'ordonnance du 2 octobre 2018, portant sur les conditions de détention pour la période courant entre le 19 février 2016 et le 18 février 2018, est mentionnée comme annexée à la demande de constatation du 7 août 2019 (pièce 3 dans la cause 6B_103/2020; pièce 4 dans la cause 6B_104/2020). Cette pièce est expressément mentionnée dans les deux ordonnances rendues le 23 septembre 2019 par le TMC, respectivement, par le Juge d'application des peines, lesquelles ont été portées devant la cour cantonale. En outre, cette décision figure dans le dossier cantonal relatif à la période de détention courant du 7 août 2018 au 6 décembre 2018 (pièce 7 dans la cause 6B_103/2020; AP19.017821-BRB).
Il est établi que le recourant a séjourné du 19 février 2016 au 6 décembre 2018, à savoir pendant plus de deux ans et 9 mois, à la Prison du Bois-Mermet dans des conditions dont il a requis, à deux reprises, le constat de l'illicéité. Contrairement à ce que considère la cour cantonale, la décision constatant l'illicéité des conditions de détention du recourant pour les deux ans précédant immédiatement les périodes en cause est pertinente, voire nécessaire pour procéder à une appréciation globale des conditions de détention, au regard de l'ensemble des données en cause (notamment sur la durée), conformément à la jurisprudence (cf. supra consid. 2.1.2).
En tout état, en constatant que l'ordonnance du 2 octobre 2018 ne figurait pas physiquement dans le dossier de la cause n° PC.015880-BRB (CRP 836/2019), alors qu'elle était mentionnée dans l'ordon-nance attaquée et figurait dans le dossier de la cause n° AP19.017821-BRB (CRP 835/2019), la cour cantonale ne pouvait, sans violer le droit d'être entendu du recourant, faire l'économie de l'examen de cette pièce.
Dans la mesure où l'ordonnance du 2 octobre 2018 dont se prévaut le recourant contient des éléments factuels que le Tribunal fédéral ne revoit pas librement (notamment: taille des cellules, confinement, fumée et activités hors cellule du recourant et de son codétenu du 19 février 2016 au 19 février 2018), la violation du droit d'être entendu ne peut pas être guérie dans la présente procédure de recours.
2.4. Les recours doivent être admis pour ce motif, ce qui rend sans objet les autres griefs soulevés par le recourant. Les arrêts entrepris doivent être annulés et les causes renvoyées à la cour cantonale afin qu'elle statue sur les conditions de détention du recourant entre le 19 février 2018 et le 6 août 2018 (cause 6B_104/2020) ainsi qu'entre le 7 août 2018 et le 6 décembre 2018 (cause 6B_103/2020) en tenant compte des deux ans de détention précédant les périodes en cause.
La cour cantonale procédera à l'appréciation globale des conditions de détention pendant les périodes en cause, en tenant compte notamment des activités respectives hors cellule du recourant et de son codétenu (cf. notamment arrêt 1B_394/2016 du 25 avril 2017 consid. 2.4 sur l'influence des activités hors cellule de chaque détenu sur le confinement; cf. également arrêts 6B_946/2015 du 13 septembre 2016 consid. 3.5.2; 1B_84/2016 du 27 juillet 2016 consid. 2.3; 6B_688/2015 du 19 mai 2016 consid. 8.3 sur la durée permettant d'interrompre des périodes durant lesquelles les conditions de détention sont contraires à la dignité humaine).
3.
Les recours doivent être admis. Les arrêts entrepris doivent être annulés et les causes renvoyées à la cour cantonale pour nouvelles décisions. Le recourant, qui obtient gain de cause, a droit à des dépens à la charge du canton de Vaud (art. 68 al. 1 LTF), ce qui rend sans objet sa demande d'assistance judiciaire (art. 64 al. 1 LTF). Il n'est pas perçu de frais judiciaires (art. 66 al. 4 LTF). Au regard de la nature procédurale du vice examiné, et dès lors que le Tribunal fédéral n'a pas traité la cause sur le fond, ne préjugeant ainsi pas de l'issue de la cause, il peut être procédé au renvoi sans ordonner préalablement un échange d'écritures (cf. ATF 133 IV 293 consid. 3.4.2 p. 296; arrêt 6B_248/2019 du 29 mars 2019 consid. 3).
Par ces motifs, le Tribunal fédéral prononce :
1.
Les causes 6B_103/2020 et 6B_104/2020 sont jointes.
2.
Le recours 6B_104/2020 est admis, l'arrêt cantonal portant sur les conditions de détention provisoire (PC.015880-BRB) est annulé et la cause renvoyée à la cour cantonale afin qu'elle rende une nouvelle décision.
3.
Le recours 6B_103/2020 est admis, l'arrêt cantonal portant sur les conditions de détention en exécution de peine (AP19.017821-BRB) est annulé et la cause renvoyée à la cour cantonale afin qu'elle rende une nouvelle décision.
4.
Il n'est pas perçu de frais judiciaires.
5.
L'Etat de Vaud versera en main du conseil de A._ la somme de 3'000 fr. à titre de dépens pour la procédure fédérale.
6.
Le présent arrêt est communiqué aux parties et au Tribunal cantonal du canton de Vaud, Chambre des recours pénale.
Lausanne, le 10 mars 2020
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
La Greffière : Klinke